OVH Cloud OVH Cloud

Signal dans une macro pour shunter les instructions

6 réponses
Avatar
M.
Bonjour,

j'ai deux macros que je voudrais empêcher de travailler en même temps. La
macro S est activée à la demande par un bouton. L'autre macro C est
activée en permanence (bySelectionChange) et elle ralentit trop S : il
faudrait qu'elle commence par une instruction qui fasse sauter les
instructions qui suivent, dans le cas où S est active. Faut-il mettre un
signal dans une cellule de la feuille (S en D2 si S est active), et
comment écrire tout ça ?

Merci d'avance

Fred

6 réponses

Avatar
John Fuss
En utilisant
application.enableEvents = False tu desctive les evenements
(genre:bySelectionChange), si ça te convient n'oublie pas de le rmettre à
True !

John

"M." +doo.fr> a écrit dans le message de
news:
Bonjour,

j'ai deux macros que je voudrais empêcher de travailler en même temps. La
macro S est activée à la demande par un bouton. L'autre macro C est
activée en permanence (bySelectionChange) et elle ralentit trop S : il
faudrait qu'elle commence par une instruction qui fasse sauter les
instructions qui suivent, dans le cas où S est active. Faut-il mettre un
signal dans une cellule de la feuille (S en D2 si S est active), et
comment écrire tout ça ?

Merci d'avance

Fred


Avatar
M.
"John Fuss" a dit :

application.enableEvents = False tu desctive les evenements


Oui ça convient, merci beaucoup.

Peut-on désactiver sélectivement certains évènements, les évènements
internes à la feuille comme selection-change, en laissant actifs les
évènements qui sortent de la feuille comme sheet-activate ?

Fred

Avatar
John Fuss
Pour ma part, je dirai que 'oui', je ne connais pas de commande VBA qui le
propose mais on peut ajouter du code en dynamique à son projet, ce qui peut
être utilisé pour ajouter ou retirer la gestion des évenements qui te
gènent. Si tu veux je peux te donner la syntaxe pour ajouter du code à ton
projet.

John

"M." +doo.fr> a écrit dans le message de
news:
"John Fuss" a dit :

application.enableEvents = False tu desctive les evenements


Oui ça convient, merci beaucoup.

Peut-on désactiver sélectivement certains évènements, les évènements
internes à la feuille comme selection-change, en laissant actifs les
évènements qui sortent de la feuille comme sheet-activate ?

Fred



Avatar
M.
"John Fuss" a dit :

Si tu veux je peux te donner la syntaxe pour ajouter du code à ton
projet.


Oui ça m'intéresse, en fait je voudrais ne pas désactiver SheetActivate ni
WorkbookClose (ce que j'ai besoin de désactiver est déclenché par
bySelectionChange);

Fred

Avatar
John Fuss
J'ai fait une macro complémentaire qui créée un classeur et réalise un
traitement dessus. Je voulais pouvoir intercepter l'evenment BeforeClose du
classeur. Le bout de code suivant fait cela dans un classeur nommé par la
variable 'wb'.

Private Sub AddCodeToWorkbook(wb As String)
Dim Code As String

Code = "Private Sub Workbook_BeforeClose(Cancel As Boolean)" & vbCrLf
Code = Code & vbTab & "Dim ra As Range, ra2 As Range, i As Integer" &
vbCrLf
Code = Code & vbTab & "With Workbooks(""" & wb & """)" & vbCrLf
Code = Code & vbTab & vbTab & "For i = 1 To .Sheets.Count" & vbCrLf
Code = Code & vbTab & vbTab & vbTab & "If .Sheets(i).Visible xlSheetVisible Then" & vbCrLf
Code = Code & vbTab & vbTab & vbTab & vbTab & ".Sheets(i).Select" &
vbCrLf
Code = Code & vbTab & vbTab & vbTab & vbTab & "With .Sheets(i)" & vbCrLf
Code = Code & vbTab & vbTab & vbTab & vbTab & vbTab & "Workbooks(""" &
ThisWorkbook.name & """).Sheets(""C19_An-1"").Cells.Clear" & vbCrLf
Code = Code & vbTab & vbTab & vbTab & vbTab & vbTab & "For Each ra In
.Range(""B7:B"" & .Range(""B65536"").End(xlUp).Row - 1)" & vbCrLf
Code = Code & vbTab & vbTab & vbTab & vbTab & vbTab & vbTab & "Set ra2 Workbooks(""" & ThisWorkbook.name &
""").Sheets(""C19_An-1"").Range(""A65536"").End(xlUp).Offset(1, 0)" & vbCrLf
Code = Code & vbTab & vbTab & vbTab & vbTab & vbTab & vbTab &
"ra2.Formula = Val(Left(ra, 3))" & vbCrLf
Code = Code & vbTab & vbTab & vbTab & vbTab & vbTab & vbTab &
"ra2.Offset(0, 2).Formula = ra.Offset(0, -1)" & vbCrLf
Code = Code & vbTab & vbTab & vbTab & vbTab & vbTab & "Next" & vbCrLf
Code = Code & vbTab & vbTab & vbTab & vbTab & "End With" & vbCrLf
Code = Code & vbTab & vbTab & vbTab & "End If" & vbCrLf
Code = Code & vbTab & vbTab & "Next" & vbCrLf
Code = Code & vbTab & "End With" & vbCrLf
Code = Code & "End Sub"


Workbooks(wb).VBProject.VBComponents("ThisWorkbook").CodeModule.AddFromStrin
g Code
End Sub

Pour l'ajout je pense que AddFromString n'ecrase pas l'axistant mais de
toute façon tu devras certainement vider le code complet pour remttre le
contenu sans l'evenement.

Mais sinon tu ne peux pas déclarer une variable globale dans un module de
type Boolean et quand tu veux ne plus utiliser 'bySelectionChange' tu la met
à 'False' et inversement et dans le code de l'evenement 'bySelectionChange'
tu fais un test sur cette variable ???

John


Oui ça m'intéresse, en fait je voudrais ne pas désactiver SheetActivate ni
WorkbookClose (ce que j'ai besoin de désactiver est déclenché par
bySelectionChange);

Fred


Avatar
M.
"John Fuss" a dit :

Je voulais pouvoir intercepter l'evenment BeforeClose du
classeur. Le bout de code suivant fait cela dans un classeur nommé par la
variable 'wb'.


Je te remercie de ces informations, que je n'ai pas encore pu trouver le
temps d'étudier en détail.

A plus tard

fred