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...
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
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 !
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 !
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
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...
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
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