[Résolu] Transmission des paramètres "zone"
Modérateur : Vilains modOOs
Règles du forum
Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
-
- Membre OOrganisé
- Messages : 69
- Inscription : 22 avr. 2006 14:18
- Localisation : Banlieue Parisienne
[Résolu] Transmission des paramètres "zone"
Bonjour a tous.
voici le corps de mon probleme:
dans CALC, je ne parviens pas a comprendre comment est transmise une zone(variant?) a une macro et la maniere de retravailler celle-ci lorsque je l'envoie comme parametres transmis.
code dans la cellule calc:
=MaMacro(A2:A5)
code de la macro:
function MaMacro(parametre) as string
'corps de fonction
end function
Je souhaiterais connaitre et eventuellement agir sur la cellule modifiee qui appelle la fonction. Par exemple la cellule contenant la formule est B5 et est declenchee par le modification de A3. Comment acceder a cet A3 ? Comment le retranscrire en OBJECT zone ?
Esperant que l'enonce aie ete assez clair, je vous remercie par avance de toute l'aide que vous serez en mesure de me fournir.
voici le corps de mon probleme:
dans CALC, je ne parviens pas a comprendre comment est transmise une zone(variant?) a une macro et la maniere de retravailler celle-ci lorsque je l'envoie comme parametres transmis.
code dans la cellule calc:
=MaMacro(A2:A5)
code de la macro:
function MaMacro(parametre) as string
'corps de fonction
end function
Je souhaiterais connaitre et eventuellement agir sur la cellule modifiee qui appelle la fonction. Par exemple la cellule contenant la formule est B5 et est declenchee par le modification de A3. Comment acceder a cet A3 ? Comment le retranscrire en OBJECT zone ?
Esperant que l'enonce aie ete assez clair, je vous remercie par avance de toute l'aide que vous serez en mesure de me fournir.
Dernière modification par SoleX le 28 mai 2006 09:48, modifié 1 fois.
LiBo 3.4 ; OpenOffice 3.3 sous Win XP SP3
"C'est pas que je roule moins vite, juste que je suis prudent!"
"C'est pas que je roule moins vite, juste que je suis prudent!"
-
- ManitOOu
- Messages : 2562
- Inscription : 26 nov. 2005 13:42
Dans ton exemple, l'argument parametre sera un tableau de variant à 2 dimensions. La première est l'index de ligne, la deuxième l'index de colonne.
Utiliser LBound() et UBound() pour connaître les limites de chaque index.
Chaque élément du tableau est la valeur de la cellule correspondante. L'adresse de cellule n'est pas transmise.
D'autre part il n'est pas possible dans une fonction pour Calc d'agir sur une autre cellule que celle qui utilise la fonction.
Utiliser LBound() et UBound() pour connaître les limites de chaque index.
Chaque élément du tableau est la valeur de la cellule correspondante. L'adresse de cellule n'est pas transmise.
D'autre part il n'est pas possible dans une fonction pour Calc d'agir sur une autre cellule que celle qui utilise la fonction.
Non seulement on n'a pas la possibilité de le savoir, mais dans le cas général une formule contenant l'appel à MaMacro() peut très bien être ré-évaluée à cause d'un impact sur un autre élément de la formule, exemple : =MaMacro(A2:A5) +H22la cellule contenant la formule est B5 et est declenchee par le modification de A3. Comment acceder a cet A3 ?
-
- Membre OOrganisé
- Messages : 69
- Inscription : 22 avr. 2006 14:18
- Localisation : Banlieue Parisienne
Merci a toi bm92,
et pour la rapidite et pour la precision de tes reponses...
En ce qui concerne cette fameuse cellule appelante, n'y a-t'il pas dans l'API une methode permettant de recuperer la cellule "active" de la feuille? (ou du document...) Xray ne m'a pas permis de le decouvrir seul malheureusement. La finalite de cette recherche etant de determiner par macro quelle est la derniere ligne utilisee dans une feuille et de lancer un traitement depuis LBound(Y) jusque DerLigneUtilisee.
Bonne continuation a tous.
et pour la rapidite et pour la precision de tes reponses...
En ce qui concerne cette fameuse cellule appelante, n'y a-t'il pas dans l'API une methode permettant de recuperer la cellule "active" de la feuille? (ou du document...) Xray ne m'a pas permis de le decouvrir seul malheureusement. La finalite de cette recherche etant de determiner par macro quelle est la derniere ligne utilisee dans une feuille et de lancer un traitement depuis LBound(Y) jusque DerLigneUtilisee.
Bonne continuation a tous.
LiBo 3.4 ; OpenOffice 3.3 sous Win XP SP3
"C'est pas que je roule moins vite, juste que je suis prudent!"
"C'est pas que je roule moins vite, juste que je suis prudent!"
-
- Grand Maître de l'OOffice
- Messages : 11276
- Inscription : 02 mai 2006 08:42
Transmission de paramètres à une fonction
Bonjour
Le seul "truc" que j'ai trouvé consiste... à passer en paramètre les paramètres
Je passe en paramètre les fonctions suivantes :
CELLULE("sheet") : envoie le numéro de la feuille dans laquelle est la cellule
COLONNE(C13) et LIGNE(C13) : pas besoin d'explication
Je passe en plus les références de la plage de données qui, lorsqu'elle est modifiée, doit déclencher la fonction
Dans l'exemple ci-dessous, la demande était de faire la somme de cellules mises dans un certain style. On est dans le cas de figure où le résultat de la fonction dépend de paramètres du bloc à traiter.
La fonction s'appelle ainsi dans la cellule :
Il y a ici beaucoup de paramètres puisque c'est une plage que l'on doit traiter (feuille, lignes et colonnes de début et de fin, nom du style, et plage sous forme de référence afin de déclencher la mise à jour de la fonction en cas de modification des données).
La première fois que l'on saisit cette formule, cela est évidemment assez lourd mais, s'agissant de références, cette formule peut être copiée et coller sans problème.
Evidemment, la limitation reste que la fonction retourne un résultat uniquement dans la cellule où elle se trouve. Même l'utilisation de curseurs d'écriture ne m'a pas permis contourner cela de manière satisfaisante. Si ce besoin est impératif (modifier d'autres cellules), j'utilise un listener cf. le point http://user.services.openoffice.org/fr/ ... tener.html
Ci-dessous la fonction (qui, elle, est assez simple) :
Le seul "truc" que j'ai trouvé consiste... à passer en paramètre les paramètres
Je passe en paramètre les fonctions suivantes :
CELLULE("sheet") : envoie le numéro de la feuille dans laquelle est la cellule
COLONNE(C13) et LIGNE(C13) : pas besoin d'explication
Je passe en plus les références de la plage de données qui, lorsqu'elle est modifiée, doit déclencher la fonction
Dans l'exemple ci-dessous, la demande était de faire la somme de cellules mises dans un certain style. On est dans le cas de figure où le résultat de la fonction dépend de paramètres du bloc à traiter.
La fonction s'appelle ainsi dans la cellule :
Code : Tout sélectionner
=PYSSOMMECOULEUR(CELLULE("sheet");COLONNE(C13);LIGNE(C13);COLONNE(C18);LIGNE(C18);"rouge";C13:C18)
La première fois que l'on saisit cette formule, cela est évidemment assez lourd mais, s'agissant de références, cette formule peut être copiée et coller sans problème.
Evidemment, la limitation reste que la fonction retourne un résultat uniquement dans la cellule où elle se trouve. Même l'utilisation de curseurs d'écriture ne m'a pas permis contourner cela de manière satisfaisante. Si ce besoin est impératif (modifier d'autres cellules), j'utilise un listener cf. le point http://user.services.openoffice.org/fr/ ... tener.html
Ci-dessous la fonction (qui, elle, est assez simple) :
Code : Tout sélectionner
Function PysSommeCouleur(PysNumFeuille, PysColDeb, PysLigDeb, PysColFin, PysLigFin, PysStyle, PysFlag)
dim PysDoc as object, PysFeuille as object
dim PysCol as long, PysLig as Long, PysResultat as Double, PysNomStyle as string
PysDoc=thiscomponent
PysFeuille=PysDoc.Sheets.getByIndex(PysNumFeuille-1)
PysResultat=0
if PysDoc.StyleFamilies("CellStyles").hasByName(PysStyle) then
PysNomStyle=PysDoc.StyleFamilies("CellStyles").getByName(PysStyle).Name
for PysLig=PysLigDeb-1 to PysLigFin-1
for PysCol=PysColDeb-1 to PysColFin-1
if PysFeuille.getCellByPosition(PysCol, PysLig).CellStyle=PysStyle or _
PysFeuille.getCellByPosition(PysCol, PysLig).CellStyle=PysNomStyle then
PysResultat=PysResultat+ PysFeuille.getCellByPosition(PysCol, PysLig).value
end if
next PysCol
next PysLig
PysSommeCouleur=PysResultat
else
PysSommeCouleur="#Style N/A" 'Erreur dans le nom du style
end if
end function
-
- Grand Maître de l'OOffice
- Messages : 11276
- Inscription : 02 mai 2006 08:42
derniere ligne utilisee dans une feuille
Encore moi...
J'ai oublié la partie du sujet relative à la dernière ligne.
Je propose une solution spécifique à cette page ici
http://user.services.openoffice.org/fr/ ... ic282.html
J'ai oublié la partie du sujet relative à la dernière ligne.
Je propose une solution spécifique à cette page ici
http://user.services.openoffice.org/fr/ ... ic282.html
-
- Membre OOrganisé
- Messages : 69
- Inscription : 22 avr. 2006 14:18
- Localisation : Banlieue Parisienne
Merci Pierre-Yves pour ton aide, je vais chercher du côté de la transmission "totale" des paramètres voir comment, si possible, restreindre la quatité de données envoyées.
Pour ce qui est du "listener"...mes connaissances en programmation sont encore un peu justes, je ne comprends pas ce que c'est et comment ça intervient...
Pour ce qui est du "listener"...mes connaissances en programmation sont encore un peu justes, je ne comprends pas ce que c'est et comment ça intervient...
LiBo 3.4 ; OpenOffice 3.3 sous Win XP SP3
"C'est pas que je roule moins vite, juste que je suis prudent!"
"C'est pas que je roule moins vite, juste que je suis prudent!"
-
- Grand Maître de l'OOffice
- Messages : 11276
- Inscription : 02 mai 2006 08:42
Interception d'événements
Bonjour
La commande Outils Personnaliser, onglet Evénements, permet d'associer des commandes ou des macros à des événements : au démarrage d'OpenOffice, ou à l'ouverture d'un document lancer une macro par exemple.
La liste de ces événements est limitée à une vingtaine environ, fonctionnant essentiellement soit au niveau « général » d'OpenOffice, soit au niveau du document dans son ensemble (chargement, impression, enregistrement...).
L'API permet d'en intercepter un plus grand nombre via ce que l'on nomme un « listener » (on devrait dire écouteur je suppose en français ?), ou gestionnaire d'événement.
Autrement dit, on demande à OOo de réagir à tel ou tel événement se produisant sur un objet (plage, cellule, contrôle de formulaire, etc.)
Le principe de mise en oeuvre est en général le suivant : une procédure ajoute le listener à l'objet concerné ; une procédure décrit les actions à entreprendre quand l'événement se produit ; une autre permet de supprimer le listener quand on n'a plus besoin.
Des informations sur le type d'événements disponibles peuvent être trouvées à l'adresse :
http://api.openoffice.org/docs/common/r ... le-ix.html
Explications concrètes sur l'exemple mis en oeuvre ici http://user.services.openoffice.org/fr/ ... tener.html
La procédure PysAddListener ajoute le listener à la cellule A1
La procédure PysRemoveListners permet de le supprimer
La procédure Pys_Modified(oEvent) décrit les actions à entreprendre quand la cellule A1 est modifiée.
Et voici le code :
Juste quelques pistes pour éclaircir :SoleX a écrit : Pour ce qui est du "listener"...mes connaissances en programmation sont encore un peu justes, je ne comprends pas ce que c'est et comment ça intervient...
La commande Outils Personnaliser, onglet Evénements, permet d'associer des commandes ou des macros à des événements : au démarrage d'OpenOffice, ou à l'ouverture d'un document lancer une macro par exemple.
La liste de ces événements est limitée à une vingtaine environ, fonctionnant essentiellement soit au niveau « général » d'OpenOffice, soit au niveau du document dans son ensemble (chargement, impression, enregistrement...).
L'API permet d'en intercepter un plus grand nombre via ce que l'on nomme un « listener » (on devrait dire écouteur je suppose en français ?), ou gestionnaire d'événement.
Autrement dit, on demande à OOo de réagir à tel ou tel événement se produisant sur un objet (plage, cellule, contrôle de formulaire, etc.)
Le principe de mise en oeuvre est en général le suivant : une procédure ajoute le listener à l'objet concerné ; une procédure décrit les actions à entreprendre quand l'événement se produit ; une autre permet de supprimer le listener quand on n'a plus besoin.
Des informations sur le type d'événements disponibles peuvent être trouvées à l'adresse :
http://api.openoffice.org/docs/common/r ... le-ix.html
Explications concrètes sur l'exemple mis en oeuvre ici http://user.services.openoffice.org/fr/ ... tener.html
La procédure PysAddListener ajoute le listener à la cellule A1
La procédure PysRemoveListners permet de le supprimer
La procédure Pys_Modified(oEvent) décrit les actions à entreprendre quand la cellule A1 est modifiée.
Et voici le code :
Code : Tout sélectionner
global PysFeuille as Object, PysListener as Object, PysCell as Object
Const PysSource="A1", PysDest="A3", PysNomFeuille="Feuille1"
Sub PysAddListener
PysListener = CreateUnoListener( "Pys_", "com.sun.star.util.XModifyListener" )
PysFeuille = thisComponent.sheets.getByName(PysNomFeuille)
PysCell=PysFeuille.getCellRangeByName(PysSource)
PysCell.AddModifyListener(PysListener)
End Sub
Sub PysRemoveListners
PysCell.RemoveModifyListener(PysListener)
End Sub
Sub Pys_Modified(oEvent)
Dim PysCellSource, PysCellDest
PysCellSource=PysFeuille.getCellRangeByName(PysSource).RangeAddress
PysCellDest=PysFeuille.getCellRangeByName(PysDest).CellAddress
PysFeuille.copyRange(PysCellDest, PysCellSource)
End Sub
-
- Membre OOrganisé
- Messages : 69
- Inscription : 22 avr. 2006 14:18
- Localisation : Banlieue Parisienne
Bonjour et bon debut de semaine a tous.
WoW! On peut dire que c'est tres puissant!
Je viens de tester cette collection de macros gestionnaire d'evennements et suis impressionne par son efficacite. Merci Pierre-Yves pour ces infos, je file de ce clic explorer le lien sur le SDK...
WoW! On peut dire que c'est tres puissant!
Je viens de tester cette collection de macros gestionnaire d'evennements et suis impressionne par son efficacite. Merci Pierre-Yves pour ces infos, je file de ce clic explorer le lien sur le SDK...
LiBo 3.4 ; OpenOffice 3.3 sous Win XP SP3
"C'est pas que je roule moins vite, juste que je suis prudent!"
"C'est pas que je roule moins vite, juste que je suis prudent!"