XL 2016 Recherche d'url valides

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

azraelle

XLDnaute Nouveau
Bonjour à tous, c'est mon premier post dans ce forum. Je ne suis pas débutante sur Excel, mais je ne suis pas experte non plus. J'utilise des macros régulièrement pour automatiser des tâches dans mon boulot, mais là je sèche.
J'ai un fichier avec une seule colonne qui comprend des URL.
Mon souci : avoir dans la deuxième colonne OK si l'URL est valide, et NOK si elle ne l'est pas.
Comme mon fichier fait environ 160 000 lignes, je ne suis pas très partant pour vérifier les URL à la main...
Je travaille sur Excel 2016.
Merci d'avance pour l'aide que vous pourrez m'apporter, bonne soirée 🙂
 
Solution
Hello,
la première erreur c'est parce que tu as ?v901 à la fin de ton url. La deuxième je ne sais pas .
J'ai changé le code . L'objet qui est utilisé pour les requêtes est plus élaboré . Si le nom d'image se termine par ?xxxx je supprime cette partie. Quand il y a une erreur je ne bloque pas je passe à l'image suivante (il n'y ni OK ni NOK sur la ligne)
VB:
Sub DownloadImages()
Dim myURL As String
Dim cell, dlPath$, NomImg$, imgSrc$, splitter
Dim WinHttpReq As Object, oStream As Object, RegEx As Object, Matches As Object
Set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
Set oStream = CreateObject("ADODB.Stream")
Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Pattern = "[^/\\]+$" ' Motif pour extraire nom d'image dans URL...
Bonjour à tous, c'est mon premier post dans ce forum. Je ne suis pas débutante sur Excel, mais je ne suis pas experte non plus. J'utilise des macros régulièrement pour automatiser des tâches dans mon boulot, mais là je sèche.
J'ai un fichier avec une seule colonne qui comprend des URL.
Mon souci : avoir dans la deuxième colonne OK si l'URL est valide, et NOK si elle ne l'est pas.
Merci d'avance pour l'aide que vous pourrez m'apporter, bonne soirée 🙂
Hello,
qu'entends-tu par url valide ? une url dont la syntaxe est correcte (ex : https://monsite.com) ou une url qui est "vivante" c'est à dire qui répond à un ping ou qui affiche quelque chose ou qui répond à une requête http ? Sinon donne-nous un exemple d'url non valide.
Ami calmant, J.P
 
Hello,
qu'entends-tu par url valide ? une url dont la syntaxe est correcte (ex : https://monsite.com) ou une url qui est "vivante" c'est à dire qui répond à un ping ou qui affiche quelque chose ou qui répond à une requête http ? Sinon donne-nous un exemple d'url non valide.
Ami calmant, J.P
Effectivement, j'aurais dû préciser... 🙂
Dans ma liste il y a pas mal d'URL qui ne mènent nulle part (error 404 par exemple). Je recherche les URL qui répondent à un ping, et encore mieux (mais je sais que c'est encore plus compliqué) une URL qui renvoie vers une image. Voir exemples en PJ
 

Pièces jointes

Dernière édition:
Effectivement, j'aurais dû préciser... 🙂
Dans ma liste il y a pas mal d'URL qui ne mènent nulle part (error 404 par exemple). Je recherche les URL qui répondent à un pign, et encore mieux (mais je sais que c'est encore plus compliqué) une URL qui renvoie vers une image. Je posterai un exemple seulement mardi (je ne bosse pas avant et n'ai pas mon fichier sous la main) 🙁
OK mais 160000 lignes ça risque d'être très long à tester surtout qu'une erreur 404 peut apparaître après un temps assez important. Si ce n'est pas indiscret à quoi va servir cela ?
 
OK mais 160000 lignes ça risque d'être très long à tester surtout qu'une erreur 404 peut apparaître après un temps assez important. Si ce n'est pas indiscret à quoi va servir cela ?
Je travaille en bibliothèque et notre logiciel permet d'avoir accès au catalogue de tous les documents que nous avons. Il permet aussi d'afficher les jaquettes de nos documents, ce qui rend la recherche plus aisée et agréable pour les usagers. Mais certaines jaquettes (URL) sont parfois obsolètes. J'extrais donc la liste une à deux fois par an pour essayer de vérifier les jaquette "périmées" afin de les remplacer.
 
Je travaille en bibliothèque et notre logiciel permet d'avoir accès au catalogue de tous les documents que nous avons. Il permet aussi d'afficher les jaquettes de nos documents, ce qui rend la recherche plus aisée et agréable pour les usagers. Mais certaines jaquettes (URL) sont parfois obsolètes. J'extrais donc la liste une à deux fois par an pour essayer de vérifier les jaquette "périmées" afin de les remplacer.
Ok ben je pense qu'avec ton classeur exemple , on comprend bien ce que tu recherches , il va bien y avoir quelqu'un ici qui va te proposer quelque chose. Le balayage de toutes les url risque de durer plusieurs heures voir plusieurs jours.
 
Ok ben je pense qu'avec ton classeur exemple , on comprend bien ce que tu recherches , il va bien y avoir quelqu'un ici qui va te proposer quelque chose. Le balayage de toutes les url risque de durer plusieurs heures voir plusieurs jours.
Je peux scinder mon tableau, et j'ai plusieurs "familles" d'URL (pas mal de domaines identiques par exemple que je peux regrouper)
 
Hello,
voilà ce que je te propose :
1 - on définit une plage nommée Urls qui représente la plage des Urls qu'on veut tester.
2 - Dans la macro
1 - Pour toutes les cellules qui se trouvent dans la plage nommée
1 - On extrait le nom de l'image (NomImg) à l'aide des expressions régulières
2 - On lance une requête http sur l'Url
3 - Si le résultat de la requête est 200 c'est qu'elle a réussit alors on sauvegarde le fichier dans le répertoire dlPath
4 - Si la requête a réussit on écrit aussi OK dans la colonne qui correspond et dans la colonne Nom image sauvegardée on écrit le nom de l'image
5 - Si la requêté échoue , on met NOK dans la colonne qui correspond et on met dans la colonne code Erreur, le code Erreur de la requête

Le code VBA :
VB:
Sub DownloadImages()
Dim cell, dlPath$, NomImg$, imgSrc$
Dim WinHttpReq As Object, oStream As Object, RegEx As Object, Matches As Object
Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
Set oStream = CreateObject("ADODB.Stream")
Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Pattern = "[^/\\]+$" ' Motif pour extraire nom d'image dans URL
dlPath = "D:\tmp\dlImages\"
For Each cell In Sheets("Feuil1").Range("Urls")
    imgSrc = cell
    Set Matches = RegEx.Execute(imgSrc)
    If Matches.Count = 1 Then
       NomImg = Matches(0)
    Else
       Cells.Offset(0, 3) = "Nom d'image incorrect"
       GoTo NextIteration
    End If
    WinHttpReq.Open "GET", imgSrc, False
    WinHttpReq.send
    Debug.Print imgSrc, WinHttpReq.Status
    If WinHttpReq.Status = 200 Then
       oStream.Open
       oStream.Type = 1
       oStream.Write WinHttpReq.responseBody
       oStream.SaveToFile dlPath & NomImg, 2 ' 1 = no overwrite, 2 = overwrite
       oStream.Close
       cell.Offset(0, 1) = "OK"
       cell.Offset(0, 3) = NomImg
    Else
       cell.Offset(0, 1) = "NOK"
       cell.Offset(0, 2) = WinHttpReq.Status
    End If
NextIteration:
Next cell
Set WinHttpReq = Nothing: Set oStream = Nothing: Set Matches = Nothing: Set RegEx = Nothing
MsgBox "Vérification terminée !"
End Sub

test_URL.gif


En pièce jointe le classeur correspondant

Ami calmant, J.P
 

Pièces jointes

Hello,
voilà ce que je te propose :
1 - on définit une plage nommée Urls qui représente la plage des Urls qu'on veut tester.
2 - Dans la macro
1 - Pour toutes les cellules qui se trouvent dans la plage nommée
1 - On extrait le nom de l'image (NomImg) à l'aide des expressions régulières
2 - On lance une requête http sur l'Url
3 - Si le résultat de la requête est 200 c'est qu'elle a réussit alors on sauvegarde le fichier dans le répertoire dlPath
4 - Si la requête a réussit on écrit aussi OK dans la colonne qui correspond et dans la colonne Nom image sauvegardée on écrit le nom de l'image
5 - Si la requêté échoue , on met NOK dans la colonne qui correspond et on met dans la colonne code Erreur, le code Erreur de la requête

Le code VBA :
VB:
Sub DownloadImages()
Dim cell, dlPath$, NomImg$, imgSrc$
Dim WinHttpReq As Object, oStream As Object, RegEx As Object, Matches As Object
Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
Set oStream = CreateObject("ADODB.Stream")
Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Pattern = "[^/\\]+$" ' Motif pour extraire nom d'image dans URL
dlPath = "D:\tmp\dlImages\"
For Each cell In Sheets("Feuil1").Range("Urls")
    imgSrc = cell
    Set Matches = RegEx.Execute(imgSrc)
    If Matches.Count = 1 Then
       NomImg = Matches(0)
    Else
       Cells.Offset(0, 3) = "Nom d'image incorrect"
       GoTo NextIteration
    End If
    WinHttpReq.Open "GET", imgSrc, False
    WinHttpReq.send
    Debug.Print imgSrc, WinHttpReq.Status
    If WinHttpReq.Status = 200 Then
       oStream.Open
       oStream.Type = 1
       oStream.Write WinHttpReq.responseBody
       oStream.SaveToFile dlPath & NomImg, 2 ' 1 = no overwrite, 2 = overwrite
       oStream.Close
       cell.Offset(0, 1) = "OK"
       cell.Offset(0, 3) = NomImg
    Else
       cell.Offset(0, 1) = "NOK"
       cell.Offset(0, 2) = WinHttpReq.Status
    End If
NextIteration:
Next cell
Set WinHttpReq = Nothing: Set oStream = Nothing: Set Matches = Nothing: Set RegEx = Nothing
MsgBox "Vérification terminée !"
End Sub

Regarde la pièce jointe 1212256

En pièce jointe le classeur correspondant

Ami calmant, J.P
Wow ! J'essaye ça dès que possible ! Merci pour tes recherches en tout cas 🙂
 
Hello,
voilà ce que je te propose :
1 - on définit une plage nommée Urls qui représente la plage des Urls qu'on veut tester.
2 - Dans la macro
1 - Pour toutes les cellules qui se trouvent dans la plage nommée
1 - On extrait le nom de l'image (NomImg) à l'aide des expressions régulières
2 - On lance une requête http sur l'Url
3 - Si le résultat de la requête est 200 c'est qu'elle a réussit alors on sauvegarde le fichier dans le répertoire dlPath
4 - Si la requête a réussit on écrit aussi OK dans la colonne qui correspond et dans la colonne Nom image sauvegardée on écrit le nom de l'image
5 - Si la requêté échoue , on met NOK dans la colonne qui correspond et on met dans la colonne code Erreur, le code Erreur de la requête

Le code VBA :
VB:
Sub DownloadImages()
Dim cell, dlPath$, NomImg$, imgSrc$
Dim WinHttpReq As Object, oStream As Object, RegEx As Object, Matches As Object
Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
Set oStream = CreateObject("ADODB.Stream")
Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Pattern = "[^/\\]+$" ' Motif pour extraire nom d'image dans URL
dlPath = "D:\tmp\dlImages\"
For Each cell In Sheets("Feuil1").Range("Urls")
    imgSrc = cell
    Set Matches = RegEx.Execute(imgSrc)
    If Matches.Count = 1 Then
       NomImg = Matches(0)
    Else
       Cells.Offset(0, 3) = "Nom d'image incorrect"
       GoTo NextIteration
    End If
    WinHttpReq.Open "GET", imgSrc, False
    WinHttpReq.send
    Debug.Print imgSrc, WinHttpReq.Status
    If WinHttpReq.Status = 200 Then
       oStream.Open
       oStream.Type = 1
       oStream.Write WinHttpReq.responseBody
       oStream.SaveToFile dlPath & NomImg, 2 ' 1 = no overwrite, 2 = overwrite
       oStream.Close
       cell.Offset(0, 1) = "OK"
       cell.Offset(0, 3) = NomImg
    Else
       cell.Offset(0, 1) = "NOK"
       cell.Offset(0, 2) = WinHttpReq.Status
    End If
NextIteration:
Next cell
Set WinHttpReq = Nothing: Set oStream = Nothing: Set Matches = Nothing: Set RegEx = Nothing
MsgBox "Vérification terminée !"
End Sub

Regarde la pièce jointe 1212256

En pièce jointe le classeur correspondant

Ami calmant, J.P
Alors ça fonctionne très bien sur la première ligne, en revanche, j'ai une erreur sur la seconde
1738575545436.png


Mais ça doit être juste une case à cocher quelque part ça...

🤔

 
C'est certainement que dans la macro tu n'as pas changé le chemin où l'on écrit les fichiers avec un chemin valide sur ton ordinateur (le chemin doit déjà exister) :
VB:
dlPath = "D:\tmp\dlImages\"
Ah bah voilà, j'avais pas tout lu... J'ai bien créé un répertoir et mis le bon nom dans la macro :
1738577436567.png

1738577470402.png

Mais il doit y avoir la même subtilité pour NomImg ? (que je n'ai pas vue ou pas comprise...)
 
Ah bah voilà, j'avais pas tout lu... J'ai bien créé un répertoir et mis le bon nom dans la macro :

Regarde la pièce jointe 1212265
Mais il doit y avoir la même subtilité pour NomImg ? (que je n'ai pas vue ou pas comprise...)
Le souci c'est ton SaveTofile il faut que tu laisses ce que j'ai mis et que tu change le dlPath comme ceci :
VB:
dlPath = "C:\tmp\dlImages\"
et dans ton répertoire c:\tmp il doit y avoir un répertoire dlImages qui existe où sinon le créer
 
Le souci c'est ton SaveTofile il faut que tu laisses ce que j'ai mis et que tu change le dlPath comme ceci :
VB:
dlPath = "C:\tmp\dlImages\"
et dans ton répertoire c:\tmp il doit y avoir un répertoire dlImages qui existe où sinon le créer
J'avais bien mis un dossier dlImages, mais je n'avais pas changé le nom du dossier au bon endroit... 🙂
Merci infiniment, ça fonctionne du feu de D.. !
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
16
Affichages
638
Réponses
24
Affichages
6 K
Retour