Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Contrôler validité d'un lien hypertext avec VBA

4 réponses
Avatar
Emile63
Bonjour =E0 tous,
A l'aide d'une proc=E9dure obtenue ici m=EAme par votre aide, je liste sur
un onglet tous les liens qui se trouvent sur une feuille de calcul (et
il y en a beaucoup).
J'aimerais savoir comment je peux l'am=E9liorer en indiquant sur une
colonne suppl=E9mentaire les liens qui ne serraient plus valides ou
cass=E9s.
Merci d'avance pour votre aide.

Cordialement,
Emile

-----------
If N > 0 Then
For i =3D N To 1 Step -1
If InStr(Z.Hyperlinks(i).Address, "@") =3D 0 Then
Cells(MaColonne, 1) =3D Z.Hyperlinks(i).Name
Cells(MaColonne, 2) =3D Z.Hyperlinks(i).ScreenTip
Cells(MaColonne, 3) =3D Z.Hyperlinks(i).Address()
Cells(MaColonne, 4) =3D Z.Hyperlinks(i).Parent.Address
MaColonne=3D MaColonne+ 1
End If
Next i
End If
---------

4 réponses

Avatar
MichD
Bonjour,

Voici un message déjà émis par Laurent Longre sur le sujet :

La procédure fait la vérification des liens situés dans la colonne A1:Ax,
Tu devras adapter selon tes besoins.

'=============================================== J'ai dans Excel une liste d'URL dans une colonne du type http://www.yahoo.fr Je
voudrais les tester pour contrôler si elles sont valides.
Une petite macro qui se contente de mettre en colonne B "OK" ou "Erreur" selon
que les URL en colonne A correspondent à des pages actuellement accessible ou
non. Et "Redirection vers..." si la page est automatiquement redirigée vers
une autre URL.
'------------------------------------------
'Déclaration des API dans le haut d'un module standard
Private Declare Function InternetOpenA Lib "Wininet" _
(ByVal lpszAgent As String, ByVal dwAccessType As Long, _
ByVal lpszProxyName As String, ByVal lpszProxyBypass As String, _
ByVal dwFlags As Long) As Long

Private Declare Function InternetCloseHandle Lib "Wininet" _
(ByVal hInternet As Long) As Long

Private Declare Function InternetOpenUrlA Lib "Wininet" _
(ByVal hInternet As Long, ByVal lpszUrl As String, _
ByVal lpszHeaders As String, ByVal dwHeadersLength As Long, _
ByVal dwFlags As Long, ByVal dwContext As Long) As Long

Private Declare Function InternetQueryOptionA Lib "Wininet" _
(ByVal hInternet As Long, ByVal dwOption As Long, _
ByVal lpBuffer As String, lpdwBufferLength As Long) As Long
'------------------------------------------

sub Test()
Dim hInt As Long, hInt2 As Long, Cell As Range
Dim Buffer As String, dwBufferLength As Long
hInt = InternetOpenA("Excel", 0, vbNullString, vbNullString, &H200000)
With Range("A1", [A1].End(xlDown))
.Offset(0, 1).Clear
For Each Cell In .Cells
Cell(, 2).Select
hInt2 = InternetOpenUrlA(hInt, Cell, vbNullString, 0, 0, 0)
If hInt2 Then
dwBufferLength = 0
InternetQueryOptionA hInt2, 34, vbNullString, dwBufferLength
Buffer = Space$(dwBufferLength - 1)
InternetQueryOptionA hInt2, 34, Buffer, dwBufferLength
If Buffer = Cell Or Buffer = Cell & "/" Then _
ActiveCell = "OK" Else ActiveCell = "Redirigé vers " & Buffer
InternetCloseHandle hInt2
Else: ActiveCell = "Erreur"
End If
Next Cell
.Columns(2).AutoFit
End With
InternetCloseHandle hInt
end sub

Attention, une URL marquée "Erreur" ne correspond pas forcément à une
page inexistante. L'erreur peut être due à un serveur temporairement défaillant.
De même, une URL "OK" ne correspond pas forcément à une page réellement
existante, mais peut résulter d'une page d'erreur "404 Not Found". Donc rien
ne vaut les vérifications "manuelles"!
'===============================================


MichD
------------------------------------------
"Emile63" a écrit dans le message de groupe de discussion :


Bonjour à tous,
A l'aide d'une procédure obtenue ici même par votre aide, je liste sur
un onglet tous les liens qui se trouvent sur une feuille de calcul (et
il y en a beaucoup).
J'aimerais savoir comment je peux l'améliorer en indiquant sur une
colonne supplémentaire les liens qui ne serraient plus valides ou
cassés.
Merci d'avance pour votre aide.

Cordialement,
Emile

-----------
If N > 0 Then
For i = N To 1 Step -1
If InStr(Z.Hyperlinks(i).Address, "@") = 0 Then
Cells(MaColonne, 1) = Z.Hyperlinks(i).Name
Cells(MaColonne, 2) = Z.Hyperlinks(i).ScreenTip
Cells(MaColonne, 3) = Z.Hyperlinks(i).Address()
Cells(MaColonne, 4) = Z.Hyperlinks(i).Parent.Address
MaColonne= MaColonne+ 1
End If
Next i
End If
---------
Avatar
Emile63
On 4 oct, 13:15, Emile63 wrote:
Bonjour MichD,

Merci pour ton aide et ta suggestion. je l'ai testée mais ce n'est pas
vraiment ce que je recherche.
Il faut dire, qu'à la base, mon explication n'étais pas complète. Je
vais préciser et m'expliquer:
Sur env. 400 liens hypertexte que compte ma feuille, seul 75
correspondent a des sites internet (www.xxxxxx.com).
Tous les autres pointent vers différents fichiers (xls, doc, mais
surtout pdf) qui se trouvent sur les disques du réseau.
Ces fichiers sont parfois déplacés ou effacés, et c'est ce qui me
pousse à cette vérification de l'hyperlien.
Au fond, je cherche a contrôler si le lien vers lequel pointe
l'hyperlien (je ne sais pas si c'est très clair ainsi exprimé ) est
toujours actif.

L'idée (qui ne fonctionne pas pour l'instant) c'est d'utiliser le
retour d'erreur:
If Z.Hyperlinks(i).Follow NewWindow:lse =vbNullString
then
Cells(MaColonne, 5) = "Erreur de lien"
Else: Cells(MaColonne, 5) =" Lien Ok"
End if

J'espère que c'est la bonne approche.. Si tu as une idée n'hésite pa s
à m'en faire part.

Très cordialement,
emile


-----------
    If N > 0 Then
        For i = N To 1 Step -1
            If InStr(Z.Hyperlinks(i).Address, "@") = 0 Then
                Cells(MaColonne, 1) = Z.Hyperlinks(i).N ame
                Cells(MaColonne, 2) = Z.Hyperlinks(i).S creenTip
                Cells(MaColonne, 3) = Z.Hyperlinks(i).A ddress()
                Cells(MaColonne, 4) = Z.Hyperlinks(i).P arent.Address

ICI, je verrai bien mon retour d'erreur.... :-))

                MaColonne= MaColonne+ 1
            End If
        Next i
    End If
---------
Avatar
MichD
Comme ceci :
Dans la procédure "Test", Range("A1") contient un lien hypertexte. La fonction EstValide() retourne Vrai si l'adresse du lien
retourne un fichier valide sur le réseau (je n'ai pas vraiment testé, je ne travaille pas en réseau) ou un lien internet (la
procédure ne vérifie pas si le lien internet est valide ou non, sinon, il faut intégrer la fonction de Laurent Longre du
message précédent. La fonction retourne faux si l'adresse du lien ne correspond à aucune des 2 possibilités.

'------------------------------
Sub test()
MsgBox EstValide(Range("A1").Hyperlinks(1))
End Sub
'------------------------------

Function EstValide(Lien As Hyperlink) As Boolean
On Error Resume Next
If Dir(H.Address) <> "" Then
If Err <> 0 Then
Err.Clear
If UCase(Left(H.Address, 4)) = "HTTP" Then
EstValide = True
Else
EstValide = False
End If
Else
EstValide = True
End If
End If
End Function
'------------------------------


MichD
------------------------------------------
"Emile63" a écrit dans le message de groupe de discussion :


On 4 oct, 13:15, Emile63 wrote:
Bonjour MichD,

Merci pour ton aide et ta suggestion. je l'ai testée mais ce n'est pas
vraiment ce que je recherche.
Il faut dire, qu'à la base, mon explication n'étais pas complète. Je
vais préciser et m'expliquer:
Sur env. 400 liens hypertexte que compte ma feuille, seul 75
correspondent a des sites internet (www.xxxxxx.com).
Tous les autres pointent vers différents fichiers (xls, doc, mais
surtout pdf) qui se trouvent sur les disques du réseau.
Ces fichiers sont parfois déplacés ou effacés, et c'est ce qui me
pousse à cette vérification de l'hyperlien.
Au fond, je cherche a contrôler si le lien vers lequel pointe
l'hyperlien (je ne sais pas si c'est très clair ainsi exprimé ) est
toujours actif.

L'idée (qui ne fonctionne pas pour l'instant) c'est d'utiliser le
retour d'erreur:
If Z.Hyperlinks(i).Follow NewWindow:úlse =vbNullString
then
Cells(MaColonne, 5) = "Erreur de lien"
Else: Cells(MaColonne, 5) =" Lien Ok"
End if

J'espère que c'est la bonne approche.. Si tu as une idée n'hésite pas
à m'en faire part.

Très cordialement,
emile


-----------
If N > 0 Then
For i = N To 1 Step -1
If InStr(Z.Hyperlinks(i).Address, "@") = 0 Then
Cells(MaColonne, 1) = Z.Hyperlinks(i).Name
Cells(MaColonne, 2) = Z.Hyperlinks(i).ScreenTip
Cells(MaColonne, 3) = Z.Hyperlinks(i).Address()
Cells(MaColonne, 4) = Z.Hyperlinks(i).Parent.Address

ICI, je verrai bien mon retour d'erreur.... :-))

MaColonne= MaColonne+ 1
End If
Next i
End If
---------
Avatar
Emile63
On 4 oct, 13:15, Emile63 wrote:

Bonjour MichD,

Merci pour ton aide,
j'ai trouvé mon bonheur, en assemblant un peu des deux
propositions... ;-)
Cordialement,
Emile