Boucle If qui bugge [RESOLU]

Guy_L

XLDnaute Occasionnel
Bonjour

Dans mon fichier, j'ai une feuille "Accueil" dans laquelle il y a deux cellules à remplir par l'utilisateur:
- J8 contient une liste de choix
- J11 est libre

Dans la macro (incluse dans la feuille accueil) ci-dessous, je regarde d'abord si l'utilisateur saisit quelque chose dans J11 sans avoir saisi le champ J8. Si c'est le cas, je lance la macro Dabord qui le lui signale par une MsgBox.
S'il a bien rempli le champ J8, et selon ce qu'il a choisi, je lance l'une des "sous-macros" Macro1 à Macro8.
Chacune d'entre-elles crée deux copies de feuilles (entre autre une feuille FI que l'on trouve plus bas dans la macro Nv_feuille) qui sont masquées au départ du fichier.
Tout cela fonctionne bien.
MAIS:
Lors du "retour" sur la feuille "Accueil" après avoir exécuté l'une des "sous-macros". Le fait de saisir quelque chose dans J11 (c'est le geste attendu de la part de l'utilisateur), cela relance le processus initial qui, cette fois, bugge car il y a déjà des copies des feuilles qui ont été réalisées.
Comment faire donc pour que je puisse lancer une autre macro lorsque J11 est saisi, sans repasser par le stade précédent ?

1) Recherche dans J11 d'une valeur éventuellement saisie

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$J$11" And Target.Count = 1 And Not IsEmpty(Target) Then Call Dabord
If Range("J8") = "Macro1" Then Macro1
If Range("J8") = "Macro2" Then Macro2
If Range("J8") = "Macro3" Then Macro3
If Range("J8") = "Macro4" Then Macro4
If Range("J8") = "Macro5" Then Macro5
If Range("J8") = "Macro6" Then Macro6
If Range("J8") = "Macro7" Then Macro7
If Range("J8") = "Macro8" Then Macro8
'Nv_feuille	(essai non concluant)
End Sub

2) Macro si J11 a été rempli sans que J8 ne l'ai été préalablement
Code:
Sub Dabord()
    If Range("J8") = "" Then
    MsgBox "Saisissez d'abord une Valeur"
    End If
End Sub

Appel de la macro "Nv_feuille" que je voudrais lancer une fois que J8 a été rempli et que l'une des macros 1 à 8 a été effectuée.
Code:
'Private Sub Worksheet_Change(ByVal Target As Range)
'If Target.Address = "$J$11" And Target.Count = 1 And Not IsEmpty(Target) Then Call Nv_feuille
'End Sub
Code:
Sub Nv_feuille()
'
' Nv_feuille Macro
' Macro enregistrée le 20/01/2013 par Guy
'
' Crée une copie de la feuille FI et la renomme avec le nom saisi qui est en A3
' A3 étant égal à J11 de la feuille accueil
' Cette macro est déclenchée par la saisie d'un nom en J11 de la feuille accueil

'    Sheets("FI").Select
'    Sheets("FI").Copy After:=Sheets("FI")
'    ActiveSheet.Name = Range("A3").Value
'    Range("A3").Select
    Sheets("Accueil").Select
End Sub

Le fichier étant un peu lourd, s'il faut vraiment le joindre je le ferai, mais cela m'oblige à le "nettoyer" et c'est un peu fastidieux, d'autant que, pour de raisons de confidentialité le vrai nom ds macros 1 à 8 a été échangé ici.

Merci
 
Dernière édition:

Misange

XLDnaute Barbatruc
Re : Boucle If qui bugge

Bonjour


Ajoute un exit sub ici

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$J$11" And Target.Count = 1 And Not IsEmpty(Target) Then
Call Dabord
exit sub
end if
...
pour que les macros associées à J11 ne s'effectuent pas.
 

Guy_L

XLDnaute Occasionnel
Re : Boucle If qui bugge

J'ai essayé mais ça ne fonctionne pas, et c'est normal: si je sors de ma Private Sub sans exécuter une première fois les sous-macros, (liées à J8) ça ne va pas.
Je ré-explique:
1) prenons le cas où l'utilisateur fait les choses dans l'ordre:
- il remplit J8 et J11 est vide, le test via Dabord est donc négatif et la msgbox ne s'affiche pas
- la macro x s'effectue en fonction de ce qui a été saisi en J8
- à ce stade, je voudrais qu'il remplisse J11, ce qui lancera Nv_Feuille

2) prenons le cas où l'utilisateur ne fait pas les choses dans l'ordre:
- il remplit J11 et J8 est vide, le test via Dabord est positif et la msgbox s'affiche
- s'il obéit et remplit J8 on retombe dans la situation 1

3) le problème est qu'actuellement il rempli J11 (sans J8), tout va bien, la msgbox s'affiche
et s'il remplit J8, tout va bien jusqu'à ce qu'il remplisse J11, et là, la macro x (1 à 8) est relancée, ce qui provoque le bug

Merci
 

Misange

XLDnaute Barbatruc
Re : Boucle If qui bugge

pas sûre de tout tout suivre... Mais si je comprends bien in fine pour que tout se passe comme il faut il faut que et J8 et J11 soient remplis. Alors pourquoi ne pas lancer les macros de création de feuilles qu'après avoir testé que ET J11 ET J8 sont remplies ?

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$J$11" And Target.Count = 1 And Not IsEmpty(Target) and isempty(range("J8")) Then 
Call Dabord
exit sub
end if

If Target.Address = "$J$8" And Target.Count = 1 And Not IsEmpty(Target) and isempty(range("J11")) Then 
Call Dabord2
exit sub
end if

... suite du code

et tu fais un dabord2 indiquant qu'il faut saisir les 2

mais l'inconvénient c'est que quelque soit l'ordre de remplissage il y aura un message affiché.
L'autre soluce c'est de mettre un bouton sur la feuille (et non une macro événementielle) et que l'utilisateur clique quand il a rempli les deux cellules. Là c'est moins genant de mettre les messages d'erreur car il ne les aura pas à chaque coup.
 

Guy_L

XLDnaute Occasionnel
Re : Boucle If qui bugge

Oui, tu as pratiquement compris, mais il faut préciser que:
J8 est un nom d'équipe: lorsque l'utilisateur a choisit son "équipe", la macro x réalise une copie des deux feuilles cachées nécessaires à SON équipe (différente pour chaque équipe).
Ensuite, le fichier devient "personnalisé".
A partir de là, il peut saisir les NOMs (en J11) des personnes composant son équipe. Pour cela, j'ai fait une autre macro qui réalise uen copie de l'une de deux feuilles précédente et la place à la suite des feuilles déjà créées. A chaque fois, il repasse donc par la feuille d'accueil pour saisr un nouveau nom jusqu'à ce que les 8 personnes (par exemple) aient chacune uen feuille personnel créé dans le fichier qui comprendra donc au final et "visibles" les feuilles "Accueil", "Equipe", Feuille type personnel, Feuille du personnel 1, 2,...8

Il est donc impératif de remplir d'abord l'équipe avant les noms (et non l'inverse car sinon, on ne sait pas personnaliser la feuille individuelle).

Si j'ai bien compris ta proposition,
en 1 il lance la macro Dabord si $J$11 est saisi alors que J8 est vide
en 2 il lance la macro Dabord2 si $J$8 est saisi alors que J11 est vide

Mais justement, on veut que ce soit dans cet ordre (2) que ça se passe.
ce qu'il faut, c'est zapper les sous-macros lorsqu'elles ont déjà été éxécutées. Ou dit autrement, faire une analyse de la saisie exclusivement sur J11 au deuxième passage
la fonction

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$J$11" And Target.Count = 1 And Not IsEmpty(Target)

n'est sans doute pas appropriée pour réalsier cela, mais je n'ai pas trouvé mieux pour l'instant.
 

Misange

XLDnaute Barbatruc
Re : Boucle If qui bugge

OK je comprends mieux.

Comment je ferais ? Un userform ! ça résous bien plus simplement le truc vu que tu peux obliger l'utilisateur à remplir les choses dans l'ordre.
Dans un premier txtbox tu lui demandes de choisir son équipe dans une liste déroulante.
Ceci de là il peut ajouter les noms de son équipe, soit en les tapant soit en les sélectionnant dans une combobox (liste de choix modifiable) si tu connais ces noms à l'avance
et à la sortie du formulaire tu crées toutes les pages nécessaires avec les infos que tu auras récupérées dans le formulaire.
 

Guy_L

XLDnaute Occasionnel
Re : Boucle If qui bugge

OK je comprends mieux.

Comment je ferais ? Un userform ! ça résous bien plus simplement le truc vu que tu peux obliger l'utilisateur à remplir les choses dans l'ordre.
Dans un premier txtbox tu lui demandes de choisir son équipe dans une liste déroulante.
Ceci de là il peut ajouter les noms de son équipe, soit en les tapant soit en les sélectionnant dans une combobox (liste de choix modifiable) si tu connais ces noms à l'avance
et à la sortie du formulaire tu crées toutes les pages nécessaires avec les infos que tu auras récupérées dans le formulaire.
Ca y est, je me suis vraiment mis dans la panade !
La comboBox n'affiche rien malgré la déclaration des données par ComboBox1.AddItem
Le plus simple est que je joigne le fichier (j'ai dû passer un moment à enlever les données des feuilles, c'est pour ça qu'elles son vierges). Comment puis-je te l'envoyer en MP ?
 

Guy_L

XLDnaute Occasionnel
Re : Boucle If qui bugge

OK, j'ai suivi tes instructions, mais il reste pas mal de choses qui buggent:
1) j'ai ajouté une nouvelle macro
Code:
Sub Auto_Open()
Selection.Show
End Sub
2) celle-ci lance l'userform suivante:
Code:
'UserForm de saisie des infos

Sheets("Accueil").Select

'Mise à blanc des champs
ComboBox1 = ""

'Première case à remplir
ComboBox1.SetFocus

'Saisie de l'équipe
ComboBox1.AddItem ("1")
ComboBox1.AddItem ("2")
ComboBox1.AddItem ("3")
ComboBox1.AddItem ("4")
ComboBox1.AddItem ("5")

'vérification du contenu de la ComboBox
If ComboBox1 = "1" Then E1
If ComboBox1 = "2" Then E2
If ComboBox1 = "3" Then E3
If ComboBox1 = "4" Then E4
If ComboBox1 = "5" Then E5

If ComboBox1 = "" Then
MsgBox "vous devez saisir une équipe"
End If

Sheets("Accueil").Range("J8") = ComboBox1

Me.Hide

End Sub
3) voici l'une des "sous-macros" (E3 par exemple)
Code:
Sub E3()
'
' E3 Macro
'
'   Sheets("Accueil").Select
    Sheets("Equipe (3)").Visible = True
' Copie de la feuille "Equipe (3)" et renommage en "Equipe"
    Sheets("Equipe (3)").Copy Before:=Sheets(4)
    Sheets("Equipe (3) (2)").Select
    Sheets("Equipe (3) (2)").Name = "Equipe"
' Masquage feuille "Equipe (3)"
    Sheets("Equipe (3)").Select
    ActiveWindow.SelectedSheets.Visible = False
'   Sheets("Equipe").Select
' Copie de la feuille "FI (3)" et renommage en "FI"
    Sheets("FI (3)").Visible = True
    Sheets("FI (3)").Select
    Sheets("FI (3)").Copy Before:=Sheets(12)
    Sheets("FI (3) (2)").Select
    Sheets("FI (3) (2)").Name = "FI"
    Sheets("FI (3)").Select
    ActiveWindow.SelectedSheets.Visible = False
End Sub
4) dans la feuille Accueil, j'ai maintenu la ligne suivante
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$J$11" And Target.Count = 1 And Not IsEmpty(Target) Then Call Nv_feuille
End Sub
C'est elle qui va me permettre de générer de nouvelles feuilles lorsque l'utilisatuer saisi un nom dans le champ J11 de la feuille accueil
5) macro nouvelle feuille
Code:
Sub Nv_feuille()
'
' Nv_feuille Macro
'
' Crée une copie de la feuille FI et la renomme avec le nom saisi qui est en A3
' A3 étant égal à J11 de la feuille accueil
' Cette macro est déclenchée par la saisie d'un nom en J11 de la feuille Accueil

    Sheets("FI").Select
    Sheets("FI").Copy After:=Sheets("FI")
    ActiveSheet.Name = Range("A3").Value
'    Range("A3").Select
    Sheets("Accueil").Select
End Sub

Mon problème est que le texte saisi dans la ComboBox1 ne lance pas la "sous-macro" (il ne se passe rien) ????
 

Guy_L

XLDnaute Occasionnel
Re : Boucle If qui bugge

salut
un essai Si... j'ai bien compris le premier message et sans UsF.
merci, mais je ne suis pas sûr que tu aies bien saisi ce que fait mon fichier. Pourtant, je sens que ton fichier m'a beaucoup fait avancer vers la solution.

J'ai fini par trouver LA solution (grâce à vous deux). Voici le script:
Code:
'initialisation de la variable vrai/faux (True/false) pour le contrôle de réalisation des sous-macros
Dim blocage As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Count > 1 Then Exit Sub
  If Target.Address = "$J$11" And Target <> "" Then Call Dabord
'
  If Target.Address = "$J$8" And Target = "E1" Then E1
  If Target.Address = "$J$8" And Target = "E2" Then E2
  If Target.Address = "$J$8" And Target = "E3" Then E3
  If Target.Address = "$J$8" And Target = "E4" Then E4
  If Target.Address = "$J$8" And Target = "E5" Then E5
   
If Target.Address = "$J$11" And Target.Count = 1 And Not IsEmpty(Target) Then Call Nv_feuille
Sheets("Accueil").Select

End Sub
Sub Dabord()
    If Range("J8") = "" Then
    MsgBox "Saisissez d'abord une Equipe"
    Range("J11:K11").Select
    Selection.ClearContents
    End If
End Sub
et celui de l'une des sous-macros:
Code:
Sub E3()
'
' E3 Macro
'
If blocage Then Exit Sub
    Sheets("Equipe (3)").Visible = True
' Copie de la feuille "Equipe (3)" et renommage en "Equipe"
    Sheets("Equipe (3)").Copy Before:=Sheets(4)
    Sheets("Equipe (3) (2)").Select
    Sheets("Equipe (3) (2)").Name = "Equipe"
' Masquage feuille "Equipe (3)"
    Sheets("Equipe (3)").Select
    ActiveWindow.SelectedSheets.Visible = False
'   Sheets("Equipe").Select
' Copie de la feuille "FI (3)" et renommage en "FI"
    Sheets("FI (3)").Visible = True
    Sheets("FI (3)").Select
    Sheets("FI (3)").Copy Before:=Sheets(2)
    Sheets("FI (3) (2)").Select
    Sheets("FI (3) (2)").Name = "FI"
    Sheets("FI (3)").Select
    ActiveWindow.SelectedSheets.Visible = False
blocage = True ' pour bloquer toute nouvelle copie
End Sub
Il me reste maintenant un problème de positionnement des feuilles copiées. En effet "Before" ou "After" positionne la copie avant ou après l'original. Or je voudrais qu'elle se positionne non pas par rapport à la feuille à copier mais par rapport à une feuille (Equipe après "Accueil" et FI après "Equipe" fraîchement nommée dans la même macro).
Au fait dans " Sheets("Equipe (3)").Copy Before:=Sheets(4)", que signifie le (4) ?

Ensuite, pour listes les personnes, j'utilisais la macro suivante:
Code:
Sub ListerOnglets()
' Liste les onglets
' Efface les deux premiers onglets de la liste
'
    Dim i As Integer
    For i = 2 To Worksheets.Count
        Cells(12 + i, 10) = Worksheets(i).Name
    Next i
End Sub
l'ennui, c'est que, d'une part les feuilles cachées apparaissent dans cette liste, et, d'autre part que la succession des feuilles dépend des copies réalisées ci-dessus. or justement, je voudrais qu'elles s'affichent dans l'ordre créé (sauf "Accueil" ni "Equipe" ni "FI"). c'est à dire:
- nom entré en premier (première copie de la feuille FI renommée)
- nom entré en deuxième (seconde copie de la feuille FI renommée)
- nom entré en troisième (troisième copie de la feuille FI renommée)

Pour maîtriser cela, est-ce que la fonction de "Sheets("Equipe (3)").Copy Before:=Sheets(4)" ne pourrait pas être remplacée par une fonction équivalente où je pourrais spécifier "copier après la feuille nommée XXX" ?
 
Dernière édition:

Si...

XLDnaute Barbatruc
Re : Boucle If qui bugge

salut
merci, mais je ne suis pas sûr que tu aies bien saisi ce que fait mon fichier. Pourtant, je sens que ton fichier m'a beaucoup fait avancer vers la solution.

je ne peux pas comprendre ce que l'on ne me donne pas :p !
Si... tu avais fourni un exemple comme celui que j'ai construit (macros comprises) je pense que ton problème aurait déjà été réglé.
 

Guy_L

XLDnaute Occasionnel
Re : Boucle If qui bugge

Tu as raison, mais comme je l'expliquais, le fichier contient de nombreuses données confidentielles qu'il me faut nettoyer pour le mettre ici. Je l'ai fait, mais ça n'est plus utile puisque, comme je l'ai indiqué dans le #10, j'ai fini par trouver comment faire.

Restent deux problèmes à résoudre:
l'ennui, c'est que, d'une part les feuilles cachées apparaissent dans cette liste, et, d'autre part que la succession des feuilles dépend des copies réalisées ci-dessus. or justement, je voudrais qu'elles s'affichent dans l'ordre créé (sauf "Accueil" ni "Equipe" ni "FI"). c'est à dire:
- nom entré en premier (première copie de la feuille FI renommée)
- nom entré en deuxième (seconde copie de la feuille FI renommée)
- nom entré en troisième (troisième copie de la feuille FI renommée)

Pour maîtriser cela, est-ce que la fonction de "Sheets("Equipe (3)").Copy Before:=Sheets(4)" ne pourrait pas être remplacée par une fonction équivalente où je pourrais spécifier "copier après la feuille nommée XXX" ?

et le deuxième problème:
Je liste les onglets par la macro suivante:
Code:
Dim i As Integer
    For i = 2 To Worksheets.Count
        Cells(12 + i, 10) = Worksheets(i).Name
    Next i
End Sub
mais je voudrais éviter de lister les feuilles qui servent uniquement aux copies (et dont je connais le nom). Donc ajouter dans ma macro quelque chose du genre:
Code:
If ActiveCell.Value = "E1" Then Cells(12 + i, 10) = ""
mais j'ai testé ça et ça ne focntionne que sur le premier passage dans la boucle, après, il me liste quand même les autres feuilles.
Merci pour votre aide
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 275
Messages
2 086 707
Membres
103 377
dernier inscrit
fredy45