Next sans For?

Sorsha

XLDnaute Nouveau
Bonjour !

J ai cré une petite macro dont l'objet est de tester l'existence d'un lien

Il faut qu'elle s'assure qu'il y ait une valeur dans une case
si oui, elle doit vérifier que le lien est valable. Si le lien est valable, alors elle passe à la ligne suivante, sinon, elle doit ecrire "erreur de lien" dans une case
et si il n'y a pas de valeur dans la case, elle doit passer à la ligne suivante.

j'ai

Dim Lig As Long

For Lig = 2 To Range("L" & Cells.Rows.Count).End(xlUp).Row

If Range("Q" & Lig) = "" Then

Next Lig

Else

If VerifHyperlink(Range("L" & Lig)) = True Then

Range("Q" & Lig) = ""

Else
Range("Q" & Lig) = "Lien pdf invalide"

End If

End If

Next Lig

MAis quand je lance la macro, il me dit "Next sans For"

Ja suis (très) très nulle en vba, je coirs que c'est simplissime, mais je ne vois pas ce que c'est...

Est ce que l'un peut m'aider?

Merci beaucoup !
 

Papou-net

XLDnaute Barbatruc
Re : Next sans For?

Bonjour Sorsha,

Essaie comme ceci (pas testé puisque pas de fichier):

Code:
Dim Lig As Long
For Lig = 2 To Range("L" & Cells.Rows.Count).End(xlUp).Row
   If Not Range("Q" & Lig) = "" Then
     If VerifHyperlink(Range("L" & Lig)) = True Then
       Range("Q" & Lig) = ""
       Else
       Range("Q" & Lig) = "Lien pdf invalide"
     End If
   End If
Next Lig
Cordialement.

Edit : Salut Pierrot, bonne journée.
 
Dernière édition:

Caillou

XLDnaute Impliqué
Re : Next sans For?

Bonjour,

Pour améliorer la lisibilité du code VBA, il est préférable d'utiliser l'indentation (placer des tabulations) pour aligner les structures de controles comme If ... End If ou For ... Next
De plus les structures sont fermées dans l'ordre inverse de l'ouverture comme pour des parenthèses dans une formule Excel ! Par exemple une boucle For dans une condition If devra être fermée (Next) avant la condtion (End If), c'est pour ça que l'on décale avec des tabulations pour faciliter la lecture!

Pour ton code, ça pourrait ressembler à ceci :
Code:
   Dim Lig As Long
    For Lig = 2 To Range("L" & Cells.Rows.Count).End(xlUp).Row
        If Not Range("Q" & Lig) = "" Then
            If VerifHyperlink(Range("L" & Lig)) = True Then
                Range("Q" & Lig) = ""
            Else
                Range("Q" & Lig) = "Lien pdf invalide"
            End If
        End If
    Next Lig

Nb : je n'ai pas regarder ce que fait ce code, mais tu avais 2 Next pour un seul For !

Caillou
 

Papou-net

XLDnaute Barbatruc
Re : Next sans For?

Bonjour,

Pour améliorer la lisibilité du code VBA, il est préférable d'utiliser l'indentation (placer des tabulations) pour aligner les structures de controles comme If ... End If ou For ... Next
De plus les structures sont fermées dans l'ordre inverse de l'ouverture comme pour des parenthèses dans une formule Excel ! Par exemple une boucle For dans une condition If devra être fermée (Next) avant la condtion (End If), c'est pour ça que l'on décale avec des tabulations pour faciliter la lecture!

Pour ton code, ça pourrait ressembler à ceci :
Code:
   Dim Lig As Long
    For Lig = 2 To Range("L" & Cells.Rows.Count).End(xlUp).Row
        If Not Range("Q" & Lig) = "" Then
            If VerifHyperlink(Range("L" & Lig)) = True Then
                Range("Q" & Lig) = ""
            Else
                Range("Q" & Lig) = "Lien pdf invalide"
            End If
        End If
    Next Lig

Nb : je n'ai pas regarder ce que fait ce code, mais tu avais 2 Next pour un seul For !

Caillou


Bonjour Caillou,

Félicitation pour cette explication précise et très pédagogique.

Cordialement.
 

Misange

XLDnaute Barbatruc
Re : Next sans For?

Bonjour

indenter tes macros permet de mieux d'identifier les problèmes
Code:
Sub test()
For Lig = 2 To Range("L" & Cells.Rows.Count).End(xlUp).Row
    If Range("Q" & Lig) = "" Then
        [COLOR=#ff0000]Next Lig[/COLOR]
    Else
        If VerifHyperlink(Range("L" & Lig)) = True Then
            Range("Q" & Lig) = ""
        Else
            Range("Q" & Lig) = "Lien pdf invalide"
        End If
    End If

Next Lig
End Sub

En fait le messages next sans for veulent souvent dire if sans end if.
En pratique tu dois toujours avoir quelque chose du style
Code:
for
   if
   end if
next

la ton premier next est inséré dans le premier test donc ça coince

essaie plutot cela
Code:
Sub test()
For Lig = 2 To Range("L" & Cells.Rows.Count).End(xlUp).Row
    If Range("Q" & Lig) = "" Then
        Exit For
    Else
        If VerifHyperlink(Range("L" & Lig)) = True Then
            Range("Q" & Lig) = ""
        Else
            Range("Q" & Lig) = "Lien pdf invalide"
        End If
    End If

Next Lig
End Sub
 

ROGER2327

XLDnaute Barbatruc
Re : Next sans For?

Bonjour à tous


Indenter correctement le code le rend plus lisible et met en évidence les incohérences de structure.
VB:
Sub toto()
Dim Lig As Long

    For Lig = 2 To Range("L" & Cells.Rows.Count).End(xlUp).Row '
    
        If Range("Q" & Lig) = "" Then '
    
    Next Lig 'Incohérent ! On est dans une structure IF ... THEN ... END
'La clôture de la structure FOR ... NEXT ne doit apparaître qu'après le END.

        Else '

            If VerifHyperlink(Range("L" & Lig)) = True Then '

                Range("Q" & Lig) = "" '

            Else '
            
                Range("Q" & Lig) = "Lien pdf invalide" '

            End If '

        End If '

Next Lig 'Il n'y a de FOR Lig pour justifier ce NEXT.

End Sub

On aura une structure correcte ainsi :
VB:
Sub tata()
Dim Lig As Long

    For Lig = 2 To Range("L" & Cells.Rows.Count).End(xlUp).Row '
    
        If Range("Q" & Lig) = "" Then 'Ne sert à rien puisqu'il n'y a rien
'à traiter avant le ELSE

        Else '

            If VerifHyperlink(Range("L" & Lig)) = True Then '

                Range("Q" & Lig) = "" '

            Else '
            
                Range("Q" & Lig) = "Lien pdf invalide" '

            End If '

        End If '

    Next Lig 'Correct cette fois-ci, pour terminer le FOR Lig initial

End Sub
On peut simplifier :
VB:
Sub tutu()
Dim Lig As Long

    For Lig = 2 To Range("L" & Cells.Rows.Count).End(xlUp).Row '
    
        If Range("Q" & Lig) <> "" Then 'Le changement de condition
'allège la structure.

            If VerifHyperlink(Range("L" & Lig)) = True Then '

                Range("Q" & Lig) = "" '

            Else '
            
                Range("Q" & Lig) = "Lien pdf invalide" '

            End If '

        End If '

    Next Lig 'Correct cette fois-ci, pour terminer le FOR Lig initial

End Sub

Reste à voir si ce code fait le boulot qu'on attend de lui. C'est une autre histoire...​



ROGER2327
#6513


Jeudi 19 Pédale 140 (Sainte Goutte, fête militaire - fête Suprême Quarte)
23 Ventôse An CCXXI, 4,6367h - cochléaria
2013-W11-3T11:07:41Z


________
P.s. : Un peu en retard, le Roger !
 

Sorsha

XLDnaute Nouveau
Re : Next sans For?

Vi tototitit2008 mais en fait y a un Q qui doit etre un l :)

Sub test()
For Lig = 2 To Range("L" & Cells.Rows.Count).End(xlUp).Row
If Range("L" & Lig) = "" Then
Exit For
Else
If VerifHyperlink(Range("L" & Lig)) = True Then
Range("Q" & Lig) = ""
Else
Range("Q" & Lig) = "Lien pdf invalide"
End If
End If

Next Lig
End Sub
 

Sorsha

XLDnaute Nouveau
Re : Next sans For?

Vi
en fait le test porte sur la colonne L et pas Q
En fait ...

Dim Lig As Long

For Lig = 2 To Range("L" & Cells.Rows.Count).End(xlUp).Row '

If Range("L" & Lig) <> "" Then (on teste l'existence d'une valeur dans L)

If VerifHyperlink(Range("L" & Lig)) = True Then (si le lien est bon on ne fait rienL)


Range("Q" & Lig) = "" '

Else '

Range("Q" & Lig) = "Lien pdf invalide" ' (sinon on ecrit invalide en Q)


End If '

End If '

Next Lig

End Sub


Pardon, je ne suis pas très claire...
 

tototiti2008

XLDnaute Barbatruc
Re : Next sans For?

Re-bonjour à tous, :)

peut-être un truc comme ça

Code:
Function VerifHyperlink(Cellule As Range) As Boolean
    
    Dim Cible As String
    VerifHyperlink = False
    
    'Vérifie si la cellule contient un lien hypertexte
    If Cellule.Hyperlinks.Count = 0 Then Exit Function
    
    'Extrait l'adresse du lien
    Cible = Cellule.Hyperlinks(1).Address
        'Vérifie si le fichier existe.
    On Error GoTo ErrLecteur
    If Dir(Cible) <> "" Then
        VerifHyperlink = True
    End If
    On Error GoTo 0
ErrLecteur:
End Function


Sub Lienspdf()
   Dim Lig As Long
    For Lig = 2 To Range("L" & Cells.Rows.Count).End(xlUp).Row
        If Range("L" & Lig) <> "" Then
            If VerifHyperlink(Range("L" & Lig)) Then
                Range("Q" & Lig) = ""
            Else
                Range("Q" & Lig) = "Lien pdf invalide"
            End If
        End If
    Next Lig
End Sub
 

Statistiques des forums

Discussions
312 489
Messages
2 088 852
Membres
103 974
dernier inscrit
chmikha