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

10 réponses

1 2
Avatar
Brunos
Bonjour Nicoh,

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" a écrit dans le message de news:

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



Avatar
Nicoh
Merci de ta réponse Brunos,

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


Bonjour Nicoh,

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" a écrit dans le message de news:

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








Avatar
Brunos
Si ça n'est pas confidentiel, mets ton classeur en copie sur
http://cjoint.com/ pour qu'on puisse jeter un coup d'oeil.
Brunos


"Nicoh" a écrit dans le message de news:

Merci de ta réponse Brunos,

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


Bonjour Nicoh,

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" a écrit dans le message de
news:

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













Avatar
Nicoh
Brunos,

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


Si ça n'est pas confidentiel, mets ton classeur en copie sur
http://cjoint.com/ pour qu'on puisse jeter un coup d'oeil.
Brunos


"Nicoh" a écrit dans le message de news:

Merci de ta réponse Brunos,

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


Bonjour Nicoh,

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" a écrit dans le message de
news:

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



















Avatar
Nicoh
Brunos,

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
Avatar
Brunos
Bon, c'est à cause de moi que ça plante, avec mon idée de te faire
saucissonner le code !
Mais comme ça tu comprendras mieux ce que tu fais.

En VBA, tu manipule des objets, Range, Worksheet, Cell, Application, etc.
Des variables peuvent représenter des objets.
Quand tu marques 'Set iSect' tu crée une variable nommée iSect qui est un
objet Range (intersection de deux autres plages).
Target est aussi un objet Range. Mais cet objet n'existe que dans son petit
monde, dans la procédure (boucle Sub - end Sub) où il a été créé.
C'est la 'portée' de cette variable. En dehors de cet univers il n'est rien.

Quand tu réutilises Target dans une autre procédure (autre boucle Sub - End
sub) le programme ne la connait plus.

Pour pouvoir utiliser une variable dans toutes les procédures d'un module,
il faut la déclarer au départ du module (en haut de ta feuille).
En faisant ça tu augmentent sa portée.
Donc tu déclare ta variable au début avec Dim, et ensuite tu peux lui
affecter des valeurs dans les diverses procédures de ton module.
Pour affecter une valeur, tu utilise l'instruction Set quand c'est un objet.

'Donc en haut les déclarations :
Dim Cible As Range, iSect as Range, jSect as Range, kSect as Range, _
lSect as Range, mSect as Range, c As Range
'Puis la procédure événementielle:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set Cible = Target 'affectation de Cible, ensuite tu utilise Cible au
lieu de Target
Tranche1 ' appel des sous-prcédures
Tranche2
Tranche3
'.....
End Sub
'Puis les sous-procédures :
Private Sub Tranche1()
If [BK543] = "" Then MsgBox "La cellule BK543 ne doit jamais être vide,
mettre 0": [BK543].Select
Set iSect = Intersect(Cible, Range("AF95:AF482"))
Set jSect = Intersect(Cible, Range("AM95:AM482"))
Set kSect = Intersect(Cible, Range("AS95:AS482"))
Set lSect = Intersect(Cible, Range("AY95:AY482"))
Set mSect = Intersect(Cible, 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

Et ainsi de suite.

Ton classeur entier est trop lourd pour cjoint, mais si tu veux tu peux
mettre l'intégralité du code dans un fichier texte.

Bon courage
Bruno


"Nicoh" a écrit dans le message de news:

Brunos,

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


Avatar
Nicoh
Brunos,

Je pense avoir fait comme tu l'as indiqué (cible au lieu de Target, ...),
mais j'ai exactement la même erreur. isect ... est en jaune.
A toute fin utile, tu peux voir le code complet à l'adresse suivante :
http://cjoint.com/data/boxdmZRSgc.htm (j'espère ne pas me tromper dans le
lien).
Par rapport à ma première demande c'est l'équivalent de la tranche 4 qui ne
s'effectuait pas.

J'espère que tu pourras m'aider.

Bonne soirée,

Nicoh.
Avatar
Brunos
Je n'ai pas regardé ton code dans le détail. C'est très long. Tu te lances
dans la modification d'un code complexe que tu n'a probablement pas écrit,
avec peu de connaissance en VBA. Ca sera dur.
Je peux te donner quelques pistes mais je ne connais pas ton projet alors
c'est difficile.

Que se passe-t-il exactement, as-tu un message d'erreur? Comment se
manifeste le problème ?

Concernant les variables, tu ne les as pas mises en déclaration. Voir le
fichier joint : http://cjoint.com/?boxKlL821q

Brunos


"Nicoh" a écrit dans le message de news:

Brunos,

Je pense avoir fait comme tu l'as indiqué (cible au lieu de Target, ...),
mais j'ai exactement la même erreur. isect ... est en jaune.
A toute fin utile, tu peux voir le code complet à l'adresse suivante :
http://cjoint.com/data/boxdmZRSgc.htm (j'espère ne pas me tromper dans le
lien).
Par rapport à ma première demande c'est l'équivalent de la tranche 4 qui
ne
s'effectuait pas.

J'espère que tu pourras m'aider.

Bonne soirée,

Nicoh.




Avatar
Nicoh
En fait, si je reviens au début avant de changer les Target en Cible (car
pour le moment j'ai encore un souci avec ta méthode, j'y regarderais de plus
près demain), tout ce passe comme je le souhaite sauf la partie en dessous de
la tranche 4 (p10/13).
Il n' y a pas de message d'erreur, il ne se passe rien. Si je mets cette
partie en premier, ça fonctionne, mais par exemple la partie tranche 3 ne
fonctionne plus.

Nicoh


Je n'ai pas regardé ton code dans le détail. C'est très long. Tu te lances
dans la modification d'un code complexe que tu n'a probablement pas écrit,
avec peu de connaissance en VBA. Ca sera dur.
Je peux te donner quelques pistes mais je ne connais pas ton projet alors
c'est difficile.

Que se passe-t-il exactement, as-tu un message d'erreur? Comment se
manifeste le problème ?

Concernant les variables, tu ne les as pas mises en déclaration. Voir le
fichier joint : http://cjoint.com/?boxKlL821q

Brunos


"Nicoh" a écrit dans le message de news:

Brunos,

Je pense avoir fait comme tu l'as indiqué (cible au lieu de Target, ...),
mais j'ai exactement la même erreur. isect ... est en jaune.
A toute fin utile, tu peux voir le code complet à l'adresse suivante :
http://cjoint.com/data/boxdmZRSgc.htm (j'espère ne pas me tromper dans le
lien).
Par rapport à ma première demande c'est l'équivalent de la tranche 4 qui
ne
s'effectuait pas.

J'espère que tu pourras m'aider.

Bonne soirée,

Nicoh.









Avatar
Brunos
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


"Nicoh" a écrit dans le message de news:

En fait, si je reviens au début avant de changer les Target en Cible (car
pour le moment j'ai encore un souci avec ta méthode, j'y regarderais de
plus
près demain), tout ce passe comme je le souhaite sauf la partie en dessous
de
la tranche 4 (p10/13).
Il n' y a pas de message d'erreur, il ne se passe rien. Si je mets cette
partie en premier, ça fonctionne, mais par exemple la partie tranche 3 ne
fonctionne plus.

Nicoh


Je n'ai pas regardé ton code dans le détail. C'est très long. Tu te
lances
dans la modification d'un code complexe que tu n'a probablement pas
écrit,
avec peu de connaissance en VBA. Ca sera dur.
Je peux te donner quelques pistes mais je ne connais pas ton projet alors
c'est difficile.

Que se passe-t-il exactement, as-tu un message d'erreur? Comment se
manifeste le problème ?

Concernant les variables, tu ne les as pas mises en déclaration. Voir le
fichier joint : http://cjoint.com/?boxKlL821q

Brunos


"Nicoh" a écrit dans le message de
news:

Brunos,

Je pense avoir fait comme tu l'as indiqué (cible au lieu de Target,
...),
mais j'ai exactement la même erreur. isect ... est en jaune.
A toute fin utile, tu peux voir le code complet à l'adresse suivante :
http://cjoint.com/data/boxdmZRSgc.htm (j'espère ne pas me tromper dans
le
lien).
Par rapport à ma première demande c'est l'équivalent de la tranche 4
qui
ne
s'effectuait pas.

J'espère que tu pourras m'aider.

Bonne soirée,

Nicoh.











1 2