Connaître le nom de la case à cocher qui appelle une macro

Bonjour

Voici une nouvelle question envoyée à l'aide du formulaire de demande d'aide (http://fr.libreoffice.org/get-help/poser-une-question/).
Si vous répondez, merci de penser à utiliser la fonction "répondre à tous" de votre logiciel de courrier électronique de façon que le demandeur reçoive une copie de votre réponse.

Email:: jacques@j-chouteau.org
Sujet:: Connaître le nom de la case à cocher qui appelle une macro
OS:: MacOS X
Version:: 5.4.x
Question:: Bonjour,
je cherche partout mais je coince.
Je prépare un fichier LibreOffice pour une AMAP. J'ai 6 cases à cocher sur une feuille de calculs.
Les six cases appellent la même macro dans le cas d'un changement d'état.
Or l'utilisateur n'a que trois choix possibles sur les six.
Je dois donc connaître l'identitée de la case qui appelle la macro pour savoir si je la laisse s'activer (<3) ou si je refuse l'activation (déjà 3 cases cochées).
J'ai bien vu un LeNom = Application.caller mais ça ne fonctionne pas :frowning:

Merci pour le coup de main ...

Bonjour,

Sujet:: Connaître le nom de la case à
cocher qui appelle une macro OS:: MacOS X Version:: 5.4.x Question::
Bonjour, je cherche partout mais je coince. Je prépare un fichier
LibreOffice pour une AMAP. J'ai 6 cases à cocher sur une feuille de
calculs. Les six cases appellent la même macro dans le cas d'un
changement d'état. Or l'utilisateur n'a que trois choix possibles sur
les six. Je dois donc connaître l'identitée de la case qui appelle la
macro pour savoir si je la laisse s'activer (<3) ou si je refuse
l'activation (déjà 3 cases cochées). J'ai bien vu un LeNom =
Application.caller mais ça ne fonctionne pas :frowning:

La macro appelée se présente comme ceci :

Sub OnCheckboxChange()
  'instructions
End Sub

Les Sub appelées prennent toujours un paramètre en entrée, celui-ci pouvant être ignoré (l'exemple ci-dessus). Il suffit de déclarer ce paramètre pour pouvoir y accéder, ce qui donne, à partir de l'exemple :

Sub OnCheckboxChange(ByRef pEvent As Object)
  'instructions
End Sub

pEvent est l'objet appelant (ici, la case à cocher). Grâce à ce paramètre, on accède à l'appelant, voire au dialogue qui le contient grâce aux instructions :

'le contrôle appelant :
oControl = pEvent.Source
'le dialogue hôte du contrôle :
oDialog = pEvent.Source.Context

Ceci devrait vous permettre d'avancer.

Note subsidiaire : plutôt que d'interroger la propriété Name du contrôle case à cocher, vous pouvez aussi exploiter sa propriété Tag (nommée "Information complémentaire" dans l'IDE), qui est indépendante et risque peut-être d'être moins retouchée lors d'une maintenance.
Tag peut contenir n'importe quelle information, à votre convenance. LibreOffice ne l'utilise pas ni ne la modifie.

Si vous répondez, merci de penser à utiliser la fonction "répondre à
tous" de votre logiciel de courrier électronique de façon que la liste
reçoive une copie de votre réponse.

Bien cordialement,

Merci BEAUCOUP Jean-François,

Une belle épine au pied en moins :wink:
Je mets le tableau d’essais en pièce jointe si quelqu’un est intéressé …

Cordialement
Jacques

PS. Il y a une macro attachée à la feuille de calcul, ainsi dès qu’une valeur est modifiée, la macro est appelée.
Sinon les autres appels sont attachés aux cases à cocher.

Merci BEAUCOUP Jean-François,

Une belle épine au pied en moins :wink:
Je mets le code ci-dessous au cas où quelqu’un serait intéressé …

Cordialement
Jacques

<code>
Private Sub ControleCases ( ByRef pEvent As Object )

dim maFeuille As Object, monFormulaire As Object
dim CtrlCase As Object
dim QuelleCase As String
dim NbrChequesMax As Integer
dim Cptr As Integer
Dim TexteAfficher As String

Rem Retrouver la case à cocher à l'origine de l'appel
QuelleCase = pEvent.Source.Model.Tag

rem Pointeur vers la feuille de calcul
maFeuille = thisComponent.sheets.getByName("Contrat1")

rem Pointeur vers l'affichage de la feuille de calcul
monFormulaire = maFeuille.drawpage.getforms().getbyname("Formulaire")

rem Récupérer le nombre de chèques maximum
NbrChequesMax = maFeuille.getCellRangeByName("G10").value

rem Compter le nombre de cases cochées
cptr = 0
for i=1 to 6
  rem récupérer les controleurs des boutons Choix1 à Choix6
  CtrlCase = monFormulaire.getByName("Choix"&i)
  
  rem Si la case à cocher est validée on augmente le compteur
  if CtrlCase.State = 1 then
    cptr = cptr+1
    EndIf
  Next

rem si le nbre de cheques est trop élevé, annuler l'action du clic puis avertir
if cptr > NbrChequesMax then

  rem reprendre le controleur de la case à cocher en trop (à l'origine de l'appel)
  CtrlCase = monFormulaire.getByName(QuelleCase)
  
  rem modifier l'aspect de la case
  CtrlCase.State = 0
  
  TexteAfficher = " Le nombre maximum de chèques est de " & NbrChequesMax & ". "
  TexteAfficher = TexteAfficher & Chr(13) & "Merci de modifier vos choix pour en tenir compte."
  msgBox TexteAfficher

  EndIf

End Sub
</code>