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

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

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

Rechercher des sujets similaires à "erreur compilation"