Erreur de compilation
Bonjour
J'ai écrit une macro nommée ac dans mes modules. Lorsque je la lance j'ai un message d'erreur de compilation qui dit "Next sans For".
J'ai relu le code 5 fois fois, il n'y a pas de Next sans For.
Qu'est ce qui peut générer ce message ?
Pour controle : fichier joint. La macro ac s'exécute quand on est dans la feuille "Planning"
Merci pour les suggestion et/ou réponses que vous pourrez me faire
Cdt
Bonjour Jpr, bonjour le forum,
Il manquait un End If qui empêchait le For de trouver son Next. Je te conseille, pour mieux t'y retrouver, d'indiquer le Next quoi...
For I=...
'
Next I
C'est beaucoup plus clair. À chaque modification j'ai rajouté à la fin du code : '<=== rajouté
Ça résout ce problème mais ça bugue plus loin...
Le code modifié :
Sub ac()
'
' ac Macro
'
'
Dim vNbCentres As Integer 'Utilisation du tableau de N° d'ordre des centres : Dernier N° d'ordre = Nb de centres
Dim vNbLigEff As Integer 'Nb de lignes du tableau Effectif
Dim vNbLigCap As Integer 'Nb de lignes du tableau Capacité
Dim vNCentre 'Nom du centre
Dim vNTheme 'Nom Thème séjour
Dim dc1, dc2, dt1, dt2 'dates : capacité début, capacité fin, thème début, thème fin
Dim NbJrsDC, NbJrsDT 'Nb de jours : dates Capacité (dc2-dc1+1), dates Thème (dt2-dt1+1)
Dim vCapacite 'Capacité d'un centre pour une période donnée
Dim EAtt, EIns 'Effectif Attendu, Effectif Inscrit
Dim EAI 'Effectif Attendu + Inscrit
Dim vEffPng As Integer '"Planning" Effectif d'un Thème sur un Centre pour une Date donnée. Stockée temporairement pour l'ajouter à l'effectif d'un autre adérent sur le même théme/centre/date
Dim vNumLig As Integer 'Pour récupérer le numéro de ligne active "vNumLig = ActiveCell.Row"
'
vNbCentres = Sheets("Tables").Range("I1").End(xlDown).Value
vNbLigEff = Range(Sheets("Effectif").Range("A2"), Sheets("Effectif").Range("A2").End(xlDown)).Cells.Count
vNbLigCap = Range(Sheets("Capacite").Range("A2"), Sheets("Capacite").Range("A2").End(xlDown)).Cells.Count
'Test si N° ordre de centres est numérique. Si non numérique alors pas de centres et Exit Sub
If IsNumeric(vNbCentres) Then
j = 5 'N° ligne Feuille "Planning"
For i = 1 To vNbCentres
'Renvoie le Nom du Centre
vNCentre = Sheets("Tables").Cells(i + 1, 10).Value
Range("A" & j) = vNCentre
Range("A" & j).HorizontalAlignment = xlRight
'Renvoie la capacité du Centre
For ii = 1 To vNbLigCap
If Sheets("Capacite").Cells(ii + 1, 1) = vNCentre Then 'si trouve le nom du centre dans "Capacite"
'Définition des variables
dc1 = Sheets("Capacite").Cells(ii + 1, 2).Value
dc2 = Sheets("Capacite").Cells(ii + 1, 3).Value
NbJrsDC = dc2 - dc1
vCapacite = Sheets("Capacite").Cells(ii + 1, 4).Value
'Recherche de la première cellule correpondant à dc1
Cells(j, 2).Select
Do Until ActiveCell.Offset(1 - j, 0).Value - dc1 = 0 'x = dc1 <=> x-dc1 0
ActiveCell.Offset(0, 1).Select
Loop
'Renvoie la capacité pour la période
For k = 0 To NbJrsDC
ActiveCell.Offset(0, k) = vCapacite
Next k '<=== rajouté
End If
Next ii '<=== rajouté
'A ce stade la ligne centre est affichée avec les capacités sur la période
'Affiche les Thèmes avec Effectif selon les dates
For iii = 1 To vNbLigEff
j = j + 1
If Sheets("Effectif").Cells(iii + 1, 1) = vNCentre Then
'Définitoin des variables
vNTheme = Sheets("Effectif").Cells(iii + 1, 2).Value
dt1 = Sheets("Effectif").Cells(iii + 1, 3).Value
dt2 = Sheets("Effectif").Cells(iii + 1, 4).Value
NbJrsDT = dt2 - dt1
EAtt = Sheets("Effectif").Cells(iii + 1, 6).Value
EIns = Sheets("Effectif").Cells(iii + 1, 7).Value
EAI = EAtt + EIns
Dim x As Integer 'Calcule le nombre de thèmes acffichés pour un centre
'si thème déjà présent dans le planning pour ce centre
Cells(j, 1).Select 'Selectionne la cellule d'affichage du thème sans l'afficher
'calcule le nombre de Thème déjà affichés pour ce centre
x = 0
Do Until ActiveCell.Offset(-1, 0).Value = vNCentre
x = x + 1
ActiveCell.Offset(-1, 0).Select
Loop
Range("A" & j).Select
'Pour tous les thèmes dèjà affiché controle si = le thème en cours
For p = 0 To x
'si = le thème en cours alors reécupére la ligne et ajoute au thème déjà affiché
If ActiveCell.Offset(-1, 0).Value = vNTheme Then
ActiveCell.Offset(-1, 0).Select
''récupére la ligne en cours
ActiveCell.Offset(0, 1).Select 'cf <=> cells(j,2)
Do Until ActiveCell.Offset(1 - j + x, 0).Value - dt1 = 0 'x = dc1 <=> x-dc1 0
ActiveCell.Offset(0, 1).Select
Loop
'Renvoie l'effectif pour la période
For k = 0 To NbJrsDT
vEffPng = ActiveCell.Offset(0, k).Value 'Récupére la valeur de la cellule active dans "Planning"
If vEffPng > 0 Then 'si non vide alors addition avec la nouvelle valeur
ActiveCell.Offset(0, k).Value = EAI + vEffPng
vEffPng = 0 'remise à 0 de la variable
Else
ActiveCell.Offset(0, k).Value = EAI + vEffPng
End If
Next k '<=== rajouté
Else
Cells(j, 2).Select
Do Until ActiveCell.Offset(1 - j, 0).Value - dt1 = 0 'x = dc1 <=> x-dc1 0
ActiveCell.Offset(0, 1).Select
Loop
'Renvoie l'effectif pour la période
For k = 0 To NbJrsDT
vEffPng = ActiveCell.Offset(0, k).Value 'Récupére la valeur de la cellule active dans "Planning"
If vEffPng > 0 Then 'si non vide alors addition avec la nouvelle valeur
ActiveCell.Offset(0, k).Value = EAI + vEffPng
vEffPng = 0 'remise à 0 de la variable
Else
ActiveCell.Offset(0, k).Value = EAI + vEffPng
End If
Next k '<=== rajouté
End If
Next p '<=== rajouté
Range("A" & j) = Sheets("Effectif").Cells(iii + 1, 2) 'Selection = Sheets("Effectif").Cells(iii + 1, 2) 'Affiche le thème
End If '<=== rajouté
Next iii '<=== rajouté
ActiveCell.Select
j = j + 1
Next i '<=== rajouté
Else
Exit Sub
End If
End Sub
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonsoir,
Le code devient effectivement un peu complexe. Il sera très difficilement maintenable.
A priori, il manque un endif sur la condition suivante :
If Sheets("Effectif").Cells(iii + 1, 1) = vNCentre Then
Il y a tellement d'imbrication de boucles et de conditions que même le compilateur se perd
Bon courage !
Bouben
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonsoir ThauThème,
Croisement de messages.
On est d'accord ...
Bonne soirée
Bouben
je vais tester la mise en oeuvre de vos remarques, mais pas ce soir
J'ai conscience que le code est compliqué. Si vous avez des conseils à prodiguer pour le simplifier ou améliorer mon analyse je suis preneur
Merci
Merci beaucoup aux deux internautes qui m'ont répondu.
Je félicite la pertinence de leur réponse, la clarté avec laquelle elle est exprimé et leur rapidité.
Il y a d'autres bugs que je vais chercher à corriger moi même. Il feront éventuellement l'objet d'autres post si je suis trop en difficultés.
Je classe en résolu
Que ce forum continue à vivre