[Résolu] [Calc] Exécuter une autre macro si la valeur change

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 !
calcul
Membre OOrganisé
Membre OOrganisé
Messages : 88
Inscription : 04 déc. 2018 11:06

[Résolu] [Calc] Exécuter une autre macro si la valeur change

Message par calcul »

Salutations ,

Je dois adapter la macro qui met à jour le tableau croisé dynamique pour exécuter une autre macro SI la valeur de la cellule "E1" de la feuille de calcul 1 change sa valeur initiale, mais je ne souhaite pas utiliser la procédure AddListener, car elle ne correspond pas très bien à mon problème .

J'ai joint un exemple pour expliquer ce que je veux faire.

dans la feuille de calcul 2 a le bouton qui met à jour le tableau croisé dynamique qui est dans la feuille de calcul 1 .

la nouvelle macro qui met à jour le tableau croisé dynamique doit ensuite exécuter une autre macro SI la valeur initiale de la cellule "E1" de la feuille 1 change, mais uniquement lorsque j'appuie sur le bouton pour actualiser le tableau croisé dynamique .

ci-dessous suit les critères pour exécuter une autre macro lorsque j'appuie sur le bouton pour actualiser le tableau croisé dynamique .

1) Si la nouvelle valeur de cellule "E1" est une Erreur égale à #N/D, la macro doit cesser de fonctionner (EXIT Sub ou STOP Sub) .

2) Si la nouvelle valeur de la cellule "E1" diffère uniquement de la valeur initiale de la cellule "E1", la macro doit terminer l'opération déjà effectuée .

J'ai trouvé une suggestion de sr. Alain de La Chaume qui pourrait aider à résoudre ce problème, mais je ne suis pas sûre que cela puisse aider .



ami câlin
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par calcul le 16 févr. 2019 01:30, modifié 1 fois.
LibreOffice 5.4.4.2 et Windows 7
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc] Exécuter une autre macro si la valeur initiale ch

Message par Hubert Lambert »

Bonjour,

Présenté comme cela, la solution revient à tester le contenu de la cellule E1 après les instructions de mises à jour du tableau croisé, et à conditionner la suite de la macro en fonction de ce contenu.
Comme j'imagine que ce n'est pas si simple, pourrais-tu préciser en quoi cette solution n'est pas envisageable ?
Cordialement.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
calcul
Membre OOrganisé
Membre OOrganisé
Messages : 88
Inscription : 04 déc. 2018 11:06

Re: [Calc] Exécuter une autre macro si la valeur initiale ch

Message par calcul »

sr. Hubert Lambert ,
Tout d'abord, je tiens à vous remercier de m'aider . :super:

J'ai un fichier qui effectue une grande séquence d'opérations de macro, cela commence par la macro 1 et se termine par exemple ici dans la macro 50, c'est-à-dire qu'une macro appelle une autre macro, etc., puis s'exécute les unes après les autres :

Code : Tout sélectionner

sub macro 1
call macro 2
end sub

sub macro 2
call macro3
end sub
............
............
sub macro 49
call macro 50
end sub
Au cours de ces appels de macros, certaines macros doivent mettre à jour les tableaux croisés dynamiques et avoir plusieurs tableaux croisés dynamiques distribués dans différentes feuilles de calcul.

SE, le résultat d’une formule dans une cellule donnée se produit après la mise à jour du tableau croisé dynamique, c’est-à-dire que, en fonction du résultat de la formule de cette cellule, vous devez interrompre la séquence d’appel des macros.

le résultat de la formule dans la cellule qui m'oblige à interrompre la séquence d'appels des macros est égal à l'Erreur #N/D :

Code : Tout sélectionner

'lancer la séquence des macros
sub macro 1
call macro 2
end sub

sub macro 2  'actualiser le tableau croisé dynamique
If  "E1" = #N/D  then  EXIT sub  
Else
call macro3  
end If
end sub
............
............
sub macro 49
call macro 50
end sub
J'ai trouvé le fichier stzenMacroStoppeur_090410.ods dans ce fil de discussion, mais je ne sais pas s'il peut aider .



amis calins .
LibreOffice 5.4.4.2 et Windows 7
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc] Exécuter une autre macro si la valeur initiale ch

Message par Hubert Lambert »

Je ne comprends toujours pas :?.
Essaie peut-être en remplaçant l'instruction "exit sub" par un simple "end". Ceci mettra fin à l'exécution de tout le programme, pas seulement à la macro en cours.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
calcul
Membre OOrganisé
Membre OOrganisé
Messages : 88
Inscription : 04 déc. 2018 11:06

Re: [Calc] Exécuter une autre macro si la valeur initiale ch

Message par calcul »

Oui, c'est vrai, utilisez la commande End pour interrompre l'exécution de tout le programme, c'est exactement ce qui doit se passer, arrêtez de lancer tout le programme avec un End .

mais je ne peux pas faire cette adaptation dans le programme actuel, c.-à-d., établir la connexion avec le résultat de la cellule, SI l'Erreur #N/D survient, puis End .

donc je mets le fichier en pièce jointe, pour que le programme fonctionne exactement de cette façon .

Pourriez-vous m'aider, s'il vous plaît ? alors l'algorithme ressemblerait à ceci :

Code : Tout sélectionner

'macro 1 commence sur le bouton de feuille de calcul 2
sub macro 1
call macro 2
end sub

sub macro 2    'actualiser le tableau croisé dynamique      
If  E1 = #N/D  Or  new E1 = start E1  then  End
Else
call macro3  
end If
end sub
il pourrait également créer un critère pour Finir de programme Si la nouvelle valeur de E1 est égal de la valeur initiale de E1 , donc je peux aussi l'utiliser pour un autre problème que j'ai ici .
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par micmac le 15 févr. 2019 07:39, modifié 1 fois.
Raison : Code mis entre balises [code] pour faciliter la lecture
LibreOffice 5.4.4.2 et Windows 7
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc] Exécuter une autre macro si la valeur initiale ch

Message par Hubert Lambert »

Essaie ceci :

Code : Tout sélectionner

    doc = thiscomponent
    E1 = doc.Sheets.getByName("feuille de calcul 2").getCellByPosition(4,0)
    if E1.Error = &h7fff then
        msgbox "Erreur #N/D sur E1"
        end
    end if
La liste des codes d'erreur : https://github.com/apache/openoffice/bl ... rcodes.hxx.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
calcul
Membre OOrganisé
Membre OOrganisé
Messages : 88
Inscription : 04 déc. 2018 11:06

Re: [Calc] Exécuter une autre macro si la valeur initiale ch

Message par calcul »

sr. Hubert Lambert ,

J'ai placé manuellement une Erreur #N/D dans la cellule E1 de la feuille de calcul 1 .

alors j'ai ajouté votre code dans le programme, mais la macro ne s'est pas arrêtée de fonctionner, c'est-à-dire qu'elle n'a pas interrompu son exécution (End) .

en annexe suit le dossier avec le programme complet .


observations :
dans la situation réelle, il existe une formule de division dans E1, qui divise M5 par M3 .

dans M5 a une fonction PROCV de recherche, puis si la fonction PROCV affiche une erreur dans la recherche, une erreur se produira dans M5 .

si une erreur se produit dans M5, une erreur se produira dans la division de M5 par M3, puis une Erreur se produira dans E1 .

Si une Erreur survient dans E1, le programme doit immédiatement cesser de fonctionner (End) .

Je signale que l'erreur dans E1 ne provient pas d'une division par zéro, mais d'une division par une autre erreur survenue dans M5 .
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 5.4.4.2 et Windows 7
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 13:31

Re: [Calc] Exécuter une autre macro si la valeur initiale ch

Message par OOotremer971 »

Bonjour,
calcul a écrit :J'ai placé manuellement une Erreur #N/D dans la cellule E1 de la feuille de calcul 1 .
Mauvaise idée :(
Lorsque tu fais cela, tu ne mets pas la cellule en erreur, c'est exactement comme si elle contenait du texte.
Il faut que l'erreur soit déclenchée par formule.

Après je n'obtiens pas le même code erreur que Hubert Lambert et j'ai l'impression qu'il est différent en fonction du type d'erreur. Personnellement je remplacerais :

Code : Tout sélectionner

if E1.Error = &h7fff then
par

Code : Tout sélectionner

if E1.Error <>  0 then 
A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
calcul
Membre OOrganisé
Membre OOrganisé
Messages : 88
Inscription : 04 déc. 2018 11:06

Re: [Calc] Exécuter une autre macro si la valeur initiale ch

Message par calcul »

sr. OOotremer971 ,

votre idée de mettre une fonction PROCV dans la cellule E1 était très bonne, elle a en fait fait que le programme ne fonctionne plus .
:bravo:

maintenant sr. Hubert Lambert a également fait arrêter le programme . :super:

J'ai un autre besoin important: Si la nouvelle valeur de B85 est égale à la valeur initiale de B85, le programme doit également cesser de fonctionner, c.-à-d. Si le résultat total du tableau croisé dynamique dans B85 ne modifie pas sa valeur initiale, le programme devrait également cesser de fonctionner .

Je dois prendre une décision Si le résultat total du tableau croisé dynamique ne change pas sa valeur initiale, il doit également être un critère pour que le programme cesse de fonctionner .

Est-il possible d'ajouter ce critère au programme? comme ça :

Code : Tout sélectionner

if E1.Error  <>  0  Or  B85.nouveau.valeur  =  B85.initiale.valeur  then
LibreOffice 5.4.4.2 et Windows 7
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 13:31

Re: [Calc] Exécuter une autre macro si la valeur initiale ch

Message par OOotremer971 »

Essaye avec ça :

Code : Tout sélectionner

sub table_dynamique   'actualiser le tableau croisé dynamique
Dim PlanAtiva as Object
Dim TabDinam1 as Object

    doc = thiscomponent
    oSheet = doc.Sheets.getByName("feuille de calcul 1")
    B85 = oSheet.getCellByPosition(1,84)'***
    E1 = oSheet.getCellByPosition(4,0)'***
    ancienneValeur = B85.Value'***
    oCell = oSheet.getCellRangeByName("A7")
    doc.CurrentController.select(oCell)
    PlanAtiva = doc.getCurrentController.getActiveSheet()
    TabDinam1 = PlanAtiva.DataPilotTables.getByIndex(0)
    TabDinam1.refresh()  
    if E1.Error <>  0 or ancienneValeur = B85.Value then'***
        msgbox "Erreur #N/D sur E1"
        end
    end if
    
    Call OtherPlan         
end sub
A+
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
calcul
Membre OOrganisé
Membre OOrganisé
Messages : 88
Inscription : 04 déc. 2018 11:06

Re: [Calc] Exécuter une autre macro si la valeur initiale ch

Message par calcul »

[RÉSOLU]

sr. OOotremer971 ,

Merci beaucoup, votre programme était très bon, c'était super . :bravo: :bravo:

si d'autres questions se posent sur le même sujet, j'ouvrirai un nouveau sujet pour traiter de nouvelles questions éventuelles .

Je tiens également à remercier sr. Hubert Lambert pour sa contribution


câlin à des amis .
LibreOffice 5.4.4.2 et Windows 7
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc] Exécuter une autre macro si la valeur initiale ch

Message par Hubert Lambert »

OOotremer971 a écrit :Après je n'obtiens pas le même code erreur que Hubert Lambert et j'ai l'impression qu'il est différent en fonction du type d'erreur.
Bien sûr que la valeur identifie le type d'erreur. Et c'est bien parce que le sr. calcul faisait référence spécifiquement à #N/D que le code proposé employait cette valeur précise. Le message d'erreur était d'ailleurs éloquent.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 13:31

Re: [Résolu] [Calc] Exécuter une autre macro si la valeur ch

Message par OOotremer971 »

Bonjour,

Voilà ce que j'obtiens avec un #N/D provoqué par un RECHERCHEV() introuvable :
Erreur#ND.png
Le code erreur retourné est 32767 :roll:

A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Résolu] [Calc] Exécuter une autre macro si la valeur ch

Message par Hubert Lambert »

C'est bien ça : 32767 s'écrit 7FFF en hexadécimal :) .
Je l'avais écrit ainsi par analogie avec le lien donné plus haut :wink: .
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)