Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

problème d'ordre dans l'exécution d'une macro

11 réponses
Avatar
Nicoh
Bonjour à tous,

J’ai un souci d’exécution dans une macro, à cause me semble-t-il, de
diverses plages délimitant le fonctionnement de chaque partie de la macro.
Selon l'ordre dans lequel chaque partie est assemblée, l'exécution a lieu ou
non.

La macro commence comme ceci (je vous mets le début de chaque partie, il n’y
a pas les end if, etc car la macro totale fait 518 lignes) :

Private Sub Worksheet_Change(ByVal Target As Range)
If [BK543] = "" Then MsgBox "La cellule BK543 ne doit jamais être vide,
mettre 0": [BK543].Select
Dim iSect As Range, jSect As Range, kSect As Range, lSect As Range, mSect As
Range, c As Range
Set iSect = Intersect(Target, Range("AF95:AF482"))
Set jSect = Intersect(Target, Range("AM95:AM482"))
Set kSect = Intersect(Target, Range("AS95:AS482"))
Set lSect = Intersect(Target, Range("AY95:AY482"))
Set mSect = Intersect(Target, Range("BE95:BE482"))
If Not iSect Is Nothing Then
For Each c In iSect.Cells
Application.EnableEvents = False
If c.Value = "" Then _
c.Offset(1, 0).ClearContents
Application.EnableEvents = True
Next


Cette partie s’exécute normalement. Puis j’ai ceci qui s’exécute normalement :

If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub

If Not Intersect(Target, Range("AF95:AF482")) Is Nothing Then
If Left(Cells(Target.Row, Target.Column), 2) = "IL" Or
Left(Cells(Target.Row, Target.Column), 1) = "B" Or Left(Cells(Target.Row,
Target.Column), 2) = "1B" Or Left(Cells(Target.Row, Target.Column), 2) = "2B"
Or Left(Cells(Target.Row, Target.Column), 1) = "L" Or Left(Cells(Target.Row,
Target.Column), 1) = "J" Or Left(Cells(Target.Row, Target.Column), 2) = "1J"
Or Left(Cells(Target.Row, Target.Column), 1) = "2J" Then
question = MsgBox("Est-ce un dito ?", vbYesNo, Application.UserName)
If question = vbYes Then
Cells(Target.Row + 1, Target.Column) = "DITO 2007": Exit Sub
End If
End If
End If

If Target.Row < 95 Or Target.Row > 482 Then Exit Sub
If Target.Column < 39 Or Target.Column > 39 Then Exit Sub
If Target.Row Mod 2 = 0 Then Exit Sub

question = MsgBox("Est-ce un nouvel accès ?", vbYesNo, Application.UserName)


Puis, le dernier code qui ne s’exécute pas, sauf si je le mets en premier,
auquel cas, le reste ne s’exécute plus !

If Target.Column <> 1 Or Target.Count > 1 Then Exit Sub
Var = (Target.Row / 44)
If Target.Row / 44 = Int(Target.Row / 44) Then
If Target.Value <> "" Then
Range("A" & Target.Row + 1 & ":A" & Target.Row + 44).EntireRow.Hidden =
False
Else
Range("A" & Target.Row + 1 & ":A" & Target.Row + 44).EntireRow.Hidden =
True
End If
End If
If Target.Column <> 1 Or Target.Count > 1 Then Exit Sub
Var = (Target.Row / 131)
If Target.Row / 131 = Int(Target.Row / 131) Then
If Target.Value <> "" Then
Range("A" & Target.Row + 2 & ":A" & Target.Row + 43).EntireRow.Hidden =
False
Else
Range("A" & Target.Row + 2 & ":A" & Target.Row + 43).EntireRow.Hidden =
True

Quelqu’un pourrait-il m’éclairer ?
Peut-être n’est-ce pas à cause des diverses plages, mais tout à fait autre
chose.

D’avance, je vous remercie pour votre aide.

Nicoh

1 réponse

1 2
Avatar
Nicoh
Bonjour Bruno,

Pour le moment, j'ai abandonné ta piste avec les procédures Tranche 1, 2,
... et le remplacement de Target par Cible car j'ai une erreur récurrente.

Par contre, je te remercie vivement de toutes tes précieuses explications
qui me permettent de mieux comprendre le fonctionnement des macros. Depuis un
an que je travaille sur cette macro, j'arrive presque au résultat escompté,
et je comprend pratiquement tout le code. Néanmoins, je ne suis toujours pas
capable de le créer moi-même.

J'ai essayé ton idée de mettre MsgBox "sortie n°n" :Exit Sub. C'est très
enrichissant. Je m'aperçois que certaines instructions interfèrent entre
elles. Je vais essayer d'y remédier seul. A défaut, je te renvois un message
dans quelques heures si je flanche !

quoi qu'il arrive, je te remercie encore vivement pour toute l'aide que tu
m'apportes.

Nicoh.


Si l'exécution s'arrête sans message d'erreur, c'est probablement que
l'instruction d'arrêt fait partie du code.
Il y a beaucoup de lignes de test qui finissent par 'exit sub' dans ton
code.
Par exemple :
If Cible.Column <> 1 Or Cible.Count > 1 Then Exit Sub
Ca signifie que si la selection n'est pas dans la première colonne (Column
<> 1) ou que la sélection comprend plusieurs cellules (count >1), alors la
procédure s'arrête (exit sub).

Tu devrais chercher de ce côté là.
Pour tester tu peux ajouter un avertissement avant l'instructions d'arrêt.
If Cible.Column <> 1 Or Cible.Count > 1 Then MsgBox "sortie n°1" : Exit Sub
En indexant tes messages, tu sauras où ça s'arrête à l'éxécution.

Brunos


1 2