[VBA] Problème de boucle
Résolu/Fermé
saian-sugus
Messages postés
34
Date d'inscription
jeudi 24 juillet 2008
Statut
Membre
Dernière intervention
20 avril 2010
-
29 juil. 2008 à 11:25
saian-sugus Messages postés 34 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 20 avril 2010 - 30 juil. 2008 à 11:33
saian-sugus Messages postés 34 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 20 avril 2010 - 30 juil. 2008 à 11:33
A voir également:
- [VBA] Problème de boucle
- Redmi note 10 redemarre en boucle - Forum Xiaomi
- Erreur 1004 vba ✓ - Forum VB / VBA
- Vba ouvrir un fichier excel avec chemin ✓ - Forum VB / VBA
- Find vba - Astuces et Solutions
- Vba attendre 1 seconde ✓ - Forum VB / VBA
14 réponses
el_linwin
Messages postés
519
Date d'inscription
vendredi 25 juillet 2008
Statut
Membre
Dernière intervention
16 août 2008
90
29 juil. 2008 à 11:37
29 juil. 2008 à 11:37
Bonjour saian-sugus,
Mon précédent post ne semble pas s'afficher, aussi je rééecris.
Le problème est que la variable LineNom est locale à la procédure PROCEDURE2.
Il faut donc la déclarer en tant que variable globale, l'initialiser avant le premier appel à la procédure, puis ajouter avant le "End Sub": LineNom=LineNom+1.
Cordialement,
el_linwin
Mon précédent post ne semble pas s'afficher, aussi je rééecris.
Le problème est que la variable LineNom est locale à la procédure PROCEDURE2.
Il faut donc la déclarer en tant que variable globale, l'initialiser avant le premier appel à la procédure, puis ajouter avant le "End Sub": LineNom=LineNom+1.
Cordialement,
el_linwin
lermite222
Messages postés
8702
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 190
29 juil. 2008 à 14:37
29 juil. 2008 à 14:37
Bonjour,
J'ai déjà répondu 2 fois à ta question mais avec les bug de CCM !!!!
J'ai pas bien saisi mais peutêtre ceci...
A+
J'ai déjà répondu 2 fois à ta question mais avec les bug de CCM !!!!
J'ai pas bien saisi mais peutêtre ceci...
Static LineNom As Long If LineNom =0 then LineNom =10 Else LineNom =LineNom +1 End If
A+
saian-sugus
Messages postés
34
Date d'inscription
jeudi 24 juillet 2008
Statut
Membre
Dernière intervention
20 avril 2010
29 juil. 2008 à 15:02
29 juil. 2008 à 15:02
Merci lermite222,
mais comme décrit ci-dessous, ta réponse fonctionne, mais un nouveau problème se lève :
Lorsque la classe change, une nouvelle feuille ne se copie pas mais au contraire, les noms continuent de se copier à la suite de la page copiée en premier
mais comme décrit ci-dessous, ta réponse fonctionne, mais un nouveau problème se lève :
Lorsque la classe change, une nouvelle feuille ne se copie pas mais au contraire, les noms continuent de se copier à la suite de la page copiée en premier
saian-sugus
Messages postés
34
Date d'inscription
jeudi 24 juillet 2008
Statut
Membre
Dernière intervention
20 avril 2010
29 juil. 2008 à 14:50
29 juil. 2008 à 14:50
Re-bonjour,
J'ai adapté la solution à el_linwin
mon code se présente comme ceci :
Option Explicit
Dim LineIndex As Long
Dim LineCalcul As Long
Dim LineNom As Long
Sub APPLICATION()
Dim j As Long
Dim ClasseName As String
LineNom = 10
Worksheets("liste").Activate
Range("c2").Select
ActiveCell.CurrentRegion.Sort Key1:=Range("c2"), Order1:=xlAscending, Header:=xlYes
LineIndex = 1
LineCalcul = LineIndex + 1
For j = LineCalcul To 5000
ClasseName = Worksheets("liste").Cells(LineCalcul, 3)
If ClasseName = "" Then Exit For
PROCEDURE ClasseName
LineIndex = LineIndex + 1
DoEvents
Next j
End Sub
Sub PROCEDURE(ClasseName As String)
Dim j As Long
Dim NewClasse As String
OpenNewSheet ClasseName
For j = LineCalcul To 5000
NewClasse = Worksheets("liste").Cells(LineCalcul, 3)
If NewClasse = ClasseName Then
LineNom = 10
PROCEDURE2 ClasseName, j
Else
LineIndex = j + 1
Exit For
End If
DoEvents
Next j
End Sub
Sub OpenNewSheet(SheetName As Variant)
On Local Error Resume Next
Sheets("modèle").Copy Before:=Sheets(3)
ActiveSheet.Name = SheetName
End Sub
Sub PROCEDURE2(SheetName As Variant, LineCalcule As Long)
Dim nom As String
Dim Prenom As String
nom = Worksheets("liste").Cells(LineCalcule, 1)
Prenom = Worksheets("liste").Cells(LineCalcule, 2)
Worksheets(SheetName).Cells(LineNom, 2) = nom
Worksheets(SheetName).Cells(LineNom, 3) = Prenom
LineNom = LineNom + 1
End Sub
J'ai déclaré la variable sous Option Explicit, et j'ai rentré le LineNom=10 tout au début, ne sachant ou le mettre.
Nouveau problème qui ne se fesait pas auparavant :
Lorsque je suis arrivé à la fin d'une classe, au lieu de changer "de manière de faire" le programme continue à me rajouter des noms dans la même page
Voici un apercu de ma feuille "liste" :
nom prenom classe année
V*** S*** 401_F 2008-2009
Z*** S*** 401_F 2008-2009
A*** M*** 501_D 2008-2009
A*** N*** 501_D 2008-2009
J'ai adapté la solution à el_linwin
mon code se présente comme ceci :
Option Explicit
Dim LineIndex As Long
Dim LineCalcul As Long
Dim LineNom As Long
Sub APPLICATION()
Dim j As Long
Dim ClasseName As String
LineNom = 10
Worksheets("liste").Activate
Range("c2").Select
ActiveCell.CurrentRegion.Sort Key1:=Range("c2"), Order1:=xlAscending, Header:=xlYes
LineIndex = 1
LineCalcul = LineIndex + 1
For j = LineCalcul To 5000
ClasseName = Worksheets("liste").Cells(LineCalcul, 3)
If ClasseName = "" Then Exit For
PROCEDURE ClasseName
LineIndex = LineIndex + 1
DoEvents
Next j
End Sub
Sub PROCEDURE(ClasseName As String)
Dim j As Long
Dim NewClasse As String
OpenNewSheet ClasseName
For j = LineCalcul To 5000
NewClasse = Worksheets("liste").Cells(LineCalcul, 3)
If NewClasse = ClasseName Then
LineNom = 10
PROCEDURE2 ClasseName, j
Else
LineIndex = j + 1
Exit For
End If
DoEvents
Next j
End Sub
Sub OpenNewSheet(SheetName As Variant)
On Local Error Resume Next
Sheets("modèle").Copy Before:=Sheets(3)
ActiveSheet.Name = SheetName
End Sub
Sub PROCEDURE2(SheetName As Variant, LineCalcule As Long)
Dim nom As String
Dim Prenom As String
nom = Worksheets("liste").Cells(LineCalcule, 1)
Prenom = Worksheets("liste").Cells(LineCalcule, 2)
Worksheets(SheetName).Cells(LineNom, 2) = nom
Worksheets(SheetName).Cells(LineNom, 3) = Prenom
LineNom = LineNom + 1
End Sub
J'ai déclaré la variable sous Option Explicit, et j'ai rentré le LineNom=10 tout au début, ne sachant ou le mettre.
Nouveau problème qui ne se fesait pas auparavant :
Lorsque je suis arrivé à la fin d'une classe, au lieu de changer "de manière de faire" le programme continue à me rajouter des noms dans la même page
Voici un apercu de ma feuille "liste" :
nom prenom classe année
V*** S*** 401_F 2008-2009
Z*** S*** 401_F 2008-2009
A*** M*** 501_D 2008-2009
A*** N*** 501_D 2008-2009
saian-sugus
Messages postés
34
Date d'inscription
jeudi 24 juillet 2008
Statut
Membre
Dernière intervention
20 avril 2010
29 juil. 2008 à 14:57
29 juil. 2008 à 14:57
Je sais pas si j'ai été très clair dans ce que je souhaite faire, je reprend:
ma feuille liste se présente sous cette forme :
nom prenom classe année
V*** S*** 401_F 2008-2009
Z*** S*** 401_F 2008-2009
A*** M*** 501_D 2008-2009
A*** N*** 501_D 2008-2009
il existe une feuille modèle, que je copierai à chaque nouvelle classe.
Alors tout d'abord j'effectue un tri alphabétique de classe
Ensuite, je rencontre une classe inconnue alors je copie la feuille modèle et je la fait renommé en 401_F.
Je rentre en B10 et C10 les noms et prénoms
Je retourne sur ma liste et passe la ligne en dessous pour copier les donnée en B11 et C11 les noms prénoms si la classe est identique
ou je recommence le processus pour copier la table modèle et la renommé en 501_D, et coller les noms et prénoms correspondant en B10 et C10
et ainsi de suite.. et tout cela automatisé..
J'espère avoir été clair de ce que j'ai tenté de faire, merci de votre aide :s
ma feuille liste se présente sous cette forme :
nom prenom classe année
V*** S*** 401_F 2008-2009
Z*** S*** 401_F 2008-2009
A*** M*** 501_D 2008-2009
A*** N*** 501_D 2008-2009
il existe une feuille modèle, que je copierai à chaque nouvelle classe.
Alors tout d'abord j'effectue un tri alphabétique de classe
Ensuite, je rencontre une classe inconnue alors je copie la feuille modèle et je la fait renommé en 401_F.
Je rentre en B10 et C10 les noms et prénoms
Je retourne sur ma liste et passe la ligne en dessous pour copier les donnée en B11 et C11 les noms prénoms si la classe est identique
ou je recommence le processus pour copier la table modèle et la renommé en 501_D, et coller les noms et prénoms correspondant en B10 et C10
et ainsi de suite.. et tout cela automatisé..
J'espère avoir été clair de ce que j'ai tenté de faire, merci de votre aide :s
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
lermite222
Messages postés
8702
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 190
29 juil. 2008 à 15:07
29 juil. 2008 à 15:07
Si c'est possible, met ton classeur sur Cjoint, ce serra plus efficasse.
https://www.cjoint.com/
et tu met le lien dans un poste suivant.
https://www.cjoint.com/
et tu met le lien dans un poste suivant.
saian-sugus
Messages postés
34
Date d'inscription
jeudi 24 juillet 2008
Statut
Membre
Dernière intervention
20 avril 2010
29 juil. 2008 à 15:25
29 juil. 2008 à 15:25
Non, malheureusement impossible.
Mais copie ces cellules dans uen fiche excel dans chaque onglet
liste (nom de l'onglet)
NOM PRENOM CLASSE_ETUDIANT ANNEE_ACADEMIQUE
Giroud André 111_A 2008-2009
Martin René 111_A 2008-2009
Zermatten Rudy 111_A 2008-2009
Zouper Marco 111_A 2008-2009
Falcon Michel 112_A 2008-2009
Wobi Markus 112_A 2008-2009
Grido Mario 112_A 2008-2009
Bornet Marin 112_A 2008-2009
Milu Tristan 112_A 2008-2009
Germanier Christian 112_B 2008-2009
Fumeau Tristan 122_B 2008-2009
et concernant l'onglet modèle, il suffit de savoir que le programme doit commencer à coller en B10 et C10.
Ensuite le code
Option Explicit
Dim LineIndex As Long
Dim LineCalcul As Long
Sub APPLICATION()
Dim j As Long
Dim ClasseName As String
Worksheets("liste").Activate
Range("c2").Select
ActiveCell.CurrentRegion.Sort Key1:=Range("c2"), Order1:=xlAscending, Header:=xlYes
LineIndex = 1
LineCalcul = LineIndex + 1
For j = LineCalcul To 5000
ClasseName = Worksheets("liste").Cells(LineCalcul, 3)
If ClasseName = "" Then Exit For
PROCEDURE ClasseName
LineIndex = LineIndex + 1
DoEvents
Next j
End Sub
Sub PROCEDURE(ClasseName As String)
Dim j As Long
Dim NewClasse As String
OpenNewSheet ClasseName
For j = LineCalcul To 5000
NewClasse = Worksheets("liste").Cells(LineCalcul, 3)
If NewClasse = ClasseName Then
PROCEDURE2 ClasseName, j
Else
LineIndex = j + 1
Exit For
End If
DoEvents
Next j
End Sub
Sub OpenNewSheet(SheetName As Variant)
On Local Error Resume Next
Sheets("modèle").Copy Before:=Sheets(3)
ActiveSheet.Name = SheetName
End Sub
Sub PROCEDURE2(SheetName As Variant, LineCalcule As Long)
Dim nom As String
Dim Prenom As String
Static LineNom As Long
If LineNom = 0 Then
LineNom = 10
Else
LineNom = LineNom + 1
End If
nom = Worksheets("liste").Cells(LineCalcule, 1)
Prenom = Worksheets("liste").Cells(LineCalcule, 2)
Worksheets(SheetName).Cells(LineNom, 2) = nom
Worksheets(SheetName).Cells(LineNom, 3) = Prenom
End Sub
Le problème semble être que je lui demande si NewClasse=ClasseName alors y rajoute à la suite.
Hors la définition des deux champs est la même (voir souligné).
Je suis entrain de réfléchir au problème, si vous avez une idée merci de votre aide.
Mais copie ces cellules dans uen fiche excel dans chaque onglet
liste (nom de l'onglet)
NOM PRENOM CLASSE_ETUDIANT ANNEE_ACADEMIQUE
Giroud André 111_A 2008-2009
Martin René 111_A 2008-2009
Zermatten Rudy 111_A 2008-2009
Zouper Marco 111_A 2008-2009
Falcon Michel 112_A 2008-2009
Wobi Markus 112_A 2008-2009
Grido Mario 112_A 2008-2009
Bornet Marin 112_A 2008-2009
Milu Tristan 112_A 2008-2009
Germanier Christian 112_B 2008-2009
Fumeau Tristan 122_B 2008-2009
et concernant l'onglet modèle, il suffit de savoir que le programme doit commencer à coller en B10 et C10.
Ensuite le code
Option Explicit
Dim LineIndex As Long
Dim LineCalcul As Long
Sub APPLICATION()
Dim j As Long
Dim ClasseName As String
Worksheets("liste").Activate
Range("c2").Select
ActiveCell.CurrentRegion.Sort Key1:=Range("c2"), Order1:=xlAscending, Header:=xlYes
LineIndex = 1
LineCalcul = LineIndex + 1
For j = LineCalcul To 5000
ClasseName = Worksheets("liste").Cells(LineCalcul, 3)
If ClasseName = "" Then Exit For
PROCEDURE ClasseName
LineIndex = LineIndex + 1
DoEvents
Next j
End Sub
Sub PROCEDURE(ClasseName As String)
Dim j As Long
Dim NewClasse As String
OpenNewSheet ClasseName
For j = LineCalcul To 5000
NewClasse = Worksheets("liste").Cells(LineCalcul, 3)
If NewClasse = ClasseName Then
PROCEDURE2 ClasseName, j
Else
LineIndex = j + 1
Exit For
End If
DoEvents
Next j
End Sub
Sub OpenNewSheet(SheetName As Variant)
On Local Error Resume Next
Sheets("modèle").Copy Before:=Sheets(3)
ActiveSheet.Name = SheetName
End Sub
Sub PROCEDURE2(SheetName As Variant, LineCalcule As Long)
Dim nom As String
Dim Prenom As String
Static LineNom As Long
If LineNom = 0 Then
LineNom = 10
Else
LineNom = LineNom + 1
End If
nom = Worksheets("liste").Cells(LineCalcule, 1)
Prenom = Worksheets("liste").Cells(LineCalcule, 2)
Worksheets(SheetName).Cells(LineNom, 2) = nom
Worksheets(SheetName).Cells(LineNom, 3) = Prenom
End Sub
Le problème semble être que je lui demande si NewClasse=ClasseName alors y rajoute à la suite.
Hors la définition des deux champs est la même (voir souligné).
Je suis entrain de réfléchir au problème, si vous avez une idée merci de votre aide.
saian-sugus
Messages postés
34
Date d'inscription
jeudi 24 juillet 2008
Statut
Membre
Dernière intervention
20 avril 2010
29 juil. 2008 à 18:12
29 juil. 2008 à 18:12
Merci à tout ceux qui m'ont aidé, les problèmes sont résolus.
Bonne soirée
Bonne soirée
el_linwin
Messages postés
519
Date d'inscription
vendredi 25 juillet 2008
Statut
Membre
Dernière intervention
16 août 2008
90
29 juil. 2008 à 20:17
29 juil. 2008 à 20:17
Bonsoir saian-sugus,
N'hésitez pas à faire passer le statut de la discussion en "Résolu". =)
Cordialement,
el_linwin
N'hésitez pas à faire passer le statut de la discussion en "Résolu". =)
Cordialement,
el_linwin
saian-sugus
Messages postés
34
Date d'inscription
jeudi 24 juillet 2008
Statut
Membre
Dernière intervention
20 avril 2010
30 juil. 2008 à 11:33
30 juil. 2008 à 11:33
Toute mes excuses je ne connaissai pas, je saurai pour la prochaine fois bonne soirée
el_linwin
Messages postés
519
Date d'inscription
vendredi 25 juillet 2008
Statut
Membre
Dernière intervention
16 août 2008
90
29 juil. 2008 à 11:31
29 juil. 2008 à 11:31
Bonjour saian-sugus,
Lorsque vous dites: faire avancer de 1 à chaque passage, c'est-à-dire à chaque appel de la procédure PROCEDURE2 ?
Si c'est le cas, il faut sortir la déclaration de la variable de la procédure, en faire une variable globale initialisée au début du programme, ou avant d'utiliser la procédure pour la première fois, et ajouter juste avant le "End Sub": LineNom=LineNom+1
Cordialement,
el_linwin
Lorsque vous dites: faire avancer de 1 à chaque passage, c'est-à-dire à chaque appel de la procédure PROCEDURE2 ?
Si c'est le cas, il faut sortir la déclaration de la variable de la procédure, en faire une variable globale initialisée au début du programme, ou avant d'utiliser la procédure pour la première fois, et ajouter juste avant le "End Sub": LineNom=LineNom+1
Cordialement,
el_linwin
lermite222
Messages postés
8702
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 190
29 juil. 2008 à 11:37
29 juil. 2008 à 11:37
Bonjour,
sait pas si j'ai bien saisi,
A+
sait pas si j'ai bien saisi,
Static LineNom As Long If LineNom = 0 then LineNom =10 Else LineNom = LineNom +1 End if
A+
For k "nouvelle variable"=1 to 500 (nombre de passages)
Worksheets(SheetName).Cells(LineNom, 2) = nom
Worksheets(SheetName).Cells(LineNom, 3) = Prenom
LineNom = LineNom + 1
un truc dans le genre, bon courage
Worksheets(SheetName).Cells(LineNom, 2) = nom
Worksheets(SheetName).Cells(LineNom, 3) = Prenom
LineNom = LineNom + 1
un truc dans le genre, bon courage
Milou2211
Messages postés
35
Date d'inscription
mardi 29 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2008
11
29 juil. 2008 à 11:44
29 juil. 2008 à 11:44
BOnjour,
SI j'ai bien compris le pb, il faudrait que ta variable LINENOM soit globale, donc définie en dehors de tes procédures avec pour valeur initiale 10.
Puis, dans PROCEDURE2, tu l'incrémentes linenom=linenom+1.
Ca marche ?
SI j'ai bien compris le pb, il faudrait que ta variable LINENOM soit globale, donc définie en dehors de tes procédures avec pour valeur initiale 10.
Puis, dans PROCEDURE2, tu l'incrémentes linenom=linenom+1.
Ca marche ?
salut,
For k (nouvelle variable) = 1 to ???(nombre de passages)
Worksheets(SheetName).Cells(LineNom, 2) = nom
Worksheets(SheetName).Cells(LineNom, 3) = Prenom
LineNom = LineNom + 1
un truc dans le genre,
bon courage
For k (nouvelle variable) = 1 to ???(nombre de passages)
Worksheets(SheetName).Cells(LineNom, 2) = nom
Worksheets(SheetName).Cells(LineNom, 3) = Prenom
LineNom = LineNom + 1
un truc dans le genre,
bon courage
Frappe Misere
Messages postés
2677
Date d'inscription
vendredi 22 février 2008
Statut
Membre
Dernière intervention
10 août 2011
568
29 juil. 2008 à 11:55
29 juil. 2008 à 11:55
déclare ta variable pour qu elle soit publique.
dans ta fonction, tu ajoutes juste linenom = linenom +1.
dans ta fonction, tu ajoutes juste linenom = linenom +1.