[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 !

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

Messagepar calcul » 14 Fév 2019 08:09

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
Pièces jointes
contrôle cellulaire.ods
(28.52 Kio) Téléchargé 11 fois
Dernière édition par calcul le 16 Fév 2019 02:30, édité 1 fois.
LibreOffice 5.4.4.2 et Windows 7
calcul
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 69
Inscrit le : 04 Déc 2018 12:06

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

Messagepar Hubert Lambert » 14 Fév 2019 13:55

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.2 sur Win7
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
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1060
Inscrit le : 06 Avr 2016 08:26

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

Messagepar calcul » 14 Fév 2019 15:09

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   AgrandirRéduire
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   AgrandirRéduire
'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
calcul
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 69
Inscrit le : 04 Déc 2018 12:06

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

Messagepar Hubert Lambert » 14 Fév 2019 21:39

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.2 sur Win7
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
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1060
Inscrit le : 06 Avr 2016 08:26

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

Messagepar calcul » 15 Fév 2019 03:45

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   AgrandirRéduire
'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 .
Pièces jointes
contrôle cellulaire (2).ods
(31.2 Kio) Téléchargé 8 fois
Dernière édition par micmac le 15 Fév 2019 08:39, édité 1 fois.
Raison: Code mis entre balises [code] pour faciliter la lecture
LibreOffice 5.4.4.2 et Windows 7
calcul
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 69
Inscrit le : 04 Déc 2018 12:06

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

Messagepar Hubert Lambert » 15 Fév 2019 19:26

Essaie ceci :
Code : Tout sélectionner   AgrandirRéduire
    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.2 sur Win7
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
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1060
Inscrit le : 06 Avr 2016 08:26

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

Messagepar calcul » 15 Fév 2019 22:42

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 .
Pièces jointes
contrôle cellulaire (3).ods
(31.25 Kio) Téléchargé 7 fois
LibreOffice 5.4.4.2 et Windows 7
calcul
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 69
Inscrit le : 04 Déc 2018 12:06

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

Messagepar OOotremer971 » 16 Fév 2019 00:02

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   AgrandirRéduire
if E1.Error = &h7fff then

par
Code : Tout sélectionner   AgrandirRéduire
if E1.Error <>  0 then


A+
Pièces jointes
contrôle cellulaire_Mod1.ods
(34.02 Kio) Téléchargé 10 fois
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Ubuntu
OpenSuse Leap
Avatar de l’utilisateur
OOotremer971
HédOOniste
HédOOniste
 
Message(s) : 1864
Inscrit le : 16 Avr 2010 14:31

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

Messagepar calcul » 16 Fév 2019 01:22

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   AgrandirRéduire
if E1.Error  <>  0  Or  B85.nouveau.valeur  =  B85.initiale.valeur  then
LibreOffice 5.4.4.2 et Windows 7
calcul
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 69
Inscrit le : 04 Déc 2018 12:06

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

Messagepar OOotremer971 » 16 Fév 2019 01:49

Essaye avec ça :
Code : Tout sélectionner   AgrandirRéduire
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
Ubuntu
OpenSuse Leap
Avatar de l’utilisateur
OOotremer971
HédOOniste
HédOOniste
 
Message(s) : 1864
Inscrit le : 16 Avr 2010 14:31

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

Messagepar calcul » 16 Fév 2019 02:28

[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
calcul
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 69
Inscrit le : 04 Déc 2018 12:06

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

Messagepar Hubert Lambert » 16 Fév 2019 10:42

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.2 sur Win7
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
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1060
Inscrit le : 06 Avr 2016 08:26

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

Messagepar OOotremer971 » 16 Fév 2019 16:58

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+
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Ubuntu
OpenSuse Leap
Avatar de l’utilisateur
OOotremer971
HédOOniste
HédOOniste
 
Message(s) : 1864
Inscrit le : 16 Avr 2010 14:31

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

Messagepar Hubert Lambert » 16 Fév 2019 17:31

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.2 sur Win7
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
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1060
Inscrit le : 06 Avr 2016 08:26


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité