problème d'ordre dans l'exécution d'une macro
Le
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
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

Poser une question


Question idiote : est-ce que tu traites les réponses à ta question ?
question = MsgBox("Est-ce un nouvel accès ?", vbYesNo, Application.UserName)
If question = vbyes then
....
Else if question = vbno then
....
end if
D'autre part je te conseille de découper ta procédure en tranche, ça sera
plus digeste à lire et à déboguer:
Private Sub Worksheet_Change(ByVal Target As Range)
procedure1
procedure2
procedure3
etc.
End Sub
Private Sub procedure1()
....
End Sub
Private Sub procedure2()
....
End Sub
Private Sub procedure3()
....
End Sub
etc.
Brunos
"Nicoh"
Oui, je traite les réponses aux questions, d'ailleurs chaque partie
fonctionne parfaitement, mais c'est l'enchainement de chaque partie qui ne
fonctionne pas (en tout cas seulement la dernière partie). Je vais essayer le
système des procédures que j'ignorais. Je te tiens au courant.
Nicoh
http://cjoint.com/ pour qu'on puisse jeter un coup d'oeil.
Brunos
"Nicoh"
Je veux bien le mettre sur le lien que tu me donnes. Le souci c'est que le
fichier pèse près de 7000 Ko, en le réduisant au maximum, j'arrive à 700Ko,
je ne peux donc pas le mettre sur cjoint.
Nicoh
Je viens de procéder comme tu me l'as conseillé :
Private Sub Worksheet_Change(ByVal Target As Range)
procedure1
procedure2
procedure3
etc.
End Sub
Private Sub procedure1()
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
...
End Sub
Private Sub procedure2()
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
End Sub
Private Sub procedure3()
....
End Sub
Mais, j'ai une erreur d'exécution 424 : objet requis. Malheureusement, je ne
sais même pas ce qu'est un objet dans une procédure. Quand je fais débogage,
j'ai la ligne suivante surlignée en jaune !
Set iSect = Intersect(Target, Range("AF95:AF482"))
Peux-tu m'aider sur ce coup là ? Si tu veux bien aussi m'expliquer (si ce
n'est pas trop abuser) le fonctionnement de la procédure car là c'est trop
complexe pour mon faible niveau.
D'avance, je te remercie,
Nicoh