[Résolu] Transmission des paramètres "zone"

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: 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 !
SoleX
Membre OOrganisé
Membre OOrganisé
Messages : 69
Inscription : 22 avr. 2006 14:18
Localisation : Banlieue Parisienne

[Résolu] Transmission des paramètres "zone"

Message par SoleX »

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.
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!"
bm92
ManitOOu
ManitOOu
Messages : 2562
Inscription : 26 nov. 2005 13:42

Message par bm92 »

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.
la cellule contenant la formule est B5 et est declenchee par le modification de A3. Comment acceder a cet A3 ?
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) +H22 :wink:
SoleX
Membre OOrganisé
Membre OOrganisé
Messages : 69
Inscription : 22 avr. 2006 14:18
Localisation : Banlieue Parisienne

Message par SoleX »

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.
LiBo 3.4 ; OpenOffice 3.3 sous Win XP SP3
"C'est pas que je roule moins vite, juste que je suis prudent!"
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Transmission de paramètres à une fonction

Message par Pierre-Yves Samyn »

Bonjour

Le seul "truc" que j'ai trouvé consiste... à passer en paramètre les paramètres :lol:

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) 
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) :

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
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

derniere ligne utilisee dans une feuille

Message par Pierre-Yves Samyn »

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
SoleX
Membre OOrganisé
Membre OOrganisé
Messages : 69
Inscription : 22 avr. 2006 14:18
Localisation : Banlieue Parisienne

Message par SoleX »

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... :shock:
LiBo 3.4 ; OpenOffice 3.3 sous Win XP SP3
"C'est pas que je roule moins vite, juste que je suis prudent!"
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Interception d'événements

Message par Pierre-Yves Samyn »

Bonjour
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... :shock:
Juste quelques pistes pour éclaircir :

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 

SoleX
Membre OOrganisé
Membre OOrganisé
Messages : 69
Inscription : 22 avr. 2006 14:18
Localisation : Banlieue Parisienne

Message par SoleX »

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...
LiBo 3.4 ; OpenOffice 3.3 sous Win XP SP3
"C'est pas que je roule moins vite, juste que je suis prudent!"