Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

If/then/else combiné avec Find

ninajams

XLDnaute Junior
Bonjour,

J'ai réussi à faire une boucle qui fonction jusqu'à ce que la Fonction Find ne renvoi pas de donnée (ou soit en erreur) car il n'y a rien à trouver.
J'ai essayé d'utiliser if/then/else mais je n'arrive pas à définir la condition.


VB:
Sub Mise_a_jour_disponibilité_boucle()

  Dim L As Worksheet, C As Worksheet, adresse_URL As String
  Dim Trouve As Range, PlageDeRecherche As Range
  Dim disponible As String, DL As Integer, j As Integer, indisponible As String




    'DL = L.Cells(Application.Rows.Count, "A").End(xlUp).Row
    Set L = Worksheets("Liste") 'Je définie mon onglet liste par L
    Set C = Worksheets("code source") 'Je définie mon onglet code source par C
   
    For j = 25 To 30

    adresse_URL = L.Cells(j, 1) 'L'adresse URL se trouve dans la feuille L (liste),première colonne
    codeHtml = htmlCodePage(adresse_URL) 'j'affecte ma variable adresse_URL a ce petit boût de code qui necessite un pack complémentaire pour fonctionner
    Sheets("code source").Activate 'J'active la feuille ou je veux les données
   
    codeHtml = Split(codeHtml, Chr(10)) 'Division par ligne de code
    For i = 0 To UBound(codeHtml) 'je ne comprend pas cette partie du code
        Cells(i + 1, 1) = codeHtml(i) 'je ne comprend pas cette partie du code
    Next 'je ne comprend pas cette partie du code
   
    'résultat je me retrouve avec le code source sur l'onglet code source et je peux lancer ma recherche
   
    Set PlageDeRecherche = Sheets("code source").Columns(1) 'on définit la plage de recherche : onglet code source, colonne 1
    disponible = "<span id=""availability_value"" class=""available"">" 'On affecte à la variable disponible la valeur recherché
    'indisponible = "<span id=""availability_value"" class=""outofstock"">"   'il s'agit de la variable qui est présente si le produit n'est pas disponible
 
    Set Trouve = PlageDeRecherche.Cells.Find(what:=disponible, LookAt:=xlWhole) 'On lance la recherche pour trouver la variable disponible (enfin une partie seulement du texte)
   '----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   ' If "je bloque totalement sur la condition"  Then
        Sheets("liste").Cells(j, 2) = "indisponible" 'résultat de l'erreur suite à plagederecherceh.cells.find qui ne renvoie rien
 
    Else
    Sheets("liste").Cells(j, 2) = Trouve.Value 'le résultat lorsque tous marche
   
    End If
   
    Set Trouve = Nothing
    Set PlageDeRecherche = Nothing
    Sheets("code source").Columns(1).ClearContents
   
    Next j
 
End Sub



Merci de votre aide
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Ninajams,
Tout dépend de ce que renvoie "<span id=""availability_value"" class=""available"">" quand le produit n'est pas disponible.
S'il renvoie "vide" alors peut être que cette solution marchera:
VB:
Set PlageDeRecherche = Sheets("code source").Columns(1) 'on définit la plage de recherche : onglet code source, colonne 1
    disponible = "<span id=""availability_value"" class=""available"">" 'On affecte à la variable disponible la valeur recherché
    'indisponible = "<span id=""availability_value"" class=""outofstock"">"   'il s'agit de la variable qui est présente si le produit n'est pas disponible
 
    Set Trouve = PlageDeRecherche.Cells.Find(what:=disponible, LookAt:=xlWhole) 'On lance la recherche pour trouver la variable disponible (enfin une partie seulement du texte)
   '--------------------------------------------------------------------------------------------------------------
   If disponible=""  Then             ' Si Vide alors Indisponible
        Sheets("liste").Cells(j, 2) = "indisponible" 'résultat de l'erreur suite à plagederecherceh.cells.find qui ne renvoie rien
    Else
        Sheets("liste").Cells(j, 2) = Trouve.Value 'le résultat lorsque tous marche
    End If
A tester.
 

ninajams

XLDnaute Junior
Bonjour,

Merci pour ta réponse mais après test je reçois cette bonne vieille fenêtre erreur d'exécution '91'. Variable objet ou variable de bloc With non définie.

Mai j'ai trouvé la solution !!!

VB:
  Set Trouve = PlageDeRecherche.Cells.Find(what:=disponible, LookAt:=xlPart) 'On lance la recherche pour trouver la variable disponible (enfin une partie seulement du texte)
   '----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  
    If Trouve Is Nothing Then
  
   Sheets("liste").Cells(j, 2) = "indisponible"
  
    
   Else
    Sheets("liste").Cells(j, 2) = Trouve.Value 'le résultat lorsque tout marche
    
  End If

PlageDeRecherche.cells.find renvoie une valeur Nothing lorsqu'elle ne trouve pas de donnée.


Merci pour l'aide.

Cordailement
 

Pièces jointes

  • erreur 91.JPG
    18 KB · Affichages: 15

patricktoulon

XLDnaute Barbatruc
Bonjour
on pourrait avoir un exemple de fichier anonymisé pour que l'on puisse cerné le problème
a travailler avec du html je me servirais d'un doc HTML en mémoire plus rapide plus precis que le find d'une portion de code html
 

ninajams

XLDnaute Junior
Bonjour,

C'est très compliqué parce que les urls renvois sur un site avec mot de passe. Donc même si je vous envoie un fichier test vous ne pourrez pas vérifier le code. Le fichier en lui-même est très simple :
Onglet Liste : Les url sont sur la première colonne
Onglet code source : L'onglet est vide et ne sert qu'a stocké de manière temporaire les données.

La version que j'ai transmis dans le précédent message fonctionne. J'ai traité 1800 url en 30 minutes. Ce qui est plutôt bien par rapport à avant ou je devais ouvrir toute les URL.

Je remet ci-dessous le code fonctionnel auquel j'ai retiré tous les commentaires inutiles

VB:
Sub Mise_a_jour_disponibilité_boucle_épurée()
 
 vchrono = Now()
 
  Dim L As Worksheet, C As Worksheet, adresse_URL As String
  Dim Trouve As Range, PlageDeRecherche As Range
  Dim disponible As String, DL As Integer, j As Integer, indisponible As String
 
  ScreenUpdating = False
 
 
  
    Set L = Worksheets("Liste") 'Je définie mon onglet liste par L
    Set C = Worksheets("code source") 'Je définie mon onglet code source par C
    
    DL = L.Cells(Application.Rows.Count, "A").End(xlUp).Row
    
    For j = 1 To DL

    adresse_URL = L.Cells(j, 1) 'L'adresse URL se trouve dans la feuille L (liste),première colonne
    codeHtml = htmlCodePage(adresse_URL) 'j'affecte ma variable adresse_URL a ce petit boût de code qui necessite un pack complémentaire pour fonctionner
    Sheets("code source").Activate 'J'active la feuille ou je veux les données
    
    codeHtml = Split(codeHtml, Chr(10)) 'Division par ligne de code
    For i = 0 To UBound(codeHtml) 'je ne comprend pas cette partie du code
        Cells(i + 1, 1) = codeHtml(i) 'je ne comprend pas cette partie du code
    Next 'je ne comprend pas cette partie du code
    
    'résultat je me retrouve avec le code source sur l'onglet code source et je peux lancer ma recherche
    
    Set PlageDeRecherche = Sheets("code source").Columns(1) 'on définit la plage de recherche : onglet code source, colonne 1
    
    disponible = "<span id=""availability_value"" class=" 'On affecte à la variable disponible la valeur recherché
    
    Set Trouve = PlageDeRecherche.Cells.Find(what:=disponible, LookAt:=xlPart) 'On lance la recherche pour trouver la variable disponible (enfin une partie seulement du texte)
   '----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  
    If Trouve Is Nothing Then
  
   Sheets("liste").Cells(j, 2) = "URL inactive" '
      
   Else
    Sheets("liste").Cells(j, 2) = Trouve.Value 'le résultat lorsque tout marche
    
  End If
    
    Set Trouve = Nothing
    Set PlageDeRecherche = Nothing
    Sheets("code source").Columns(1).ClearContents
    
    Next j
    
   vchrono = Now() - vchrono

MsgBox Format(vchrono, "h:mm:ss")
  
End Sub

Par contre je suis très intéressé par :

a travailler avec du html je me servirais d'un doc HTML en mémoire plus rapide plus precis que le find d'une portion de code html

Comme je suis vraiment novice sur VBA mes codes ne sont que le regroupement d'autre code que j'essaie de faire fonctionné ensemble.

J'ai essayé de sauté l'étape de découpage du code HTML mais sans succès.

Code:
 codeHtml = Split(codeHtml, Chr(10)) 'Division par ligne de code
    For i = 0 To UBound(codeHtml) 'je ne comprend pas cette partie du code
        Cells(i + 1, 1) = codeHtml(i) 'je ne comprend pas cette partie du code
    Next 'je ne comprend pas cette partie du code

Si je comprend bien tu me conseillerais d'envoyer le codehtml dans un fichier texte temporaire (j'y avais pensé mais je n'ai pas réussi) puis d'effectuer une recherche avec findval.

merci pour ton aide
 

patricktoulon

XLDnaute Barbatruc
re
le code html tu le recupere avec une requete il me semble non? d'ailleurs ce nom de fonction me dit quelque chose "htmlCodePage"

et bien quand tu récupère le code source tu fait un truc du genre :

code=la source de ton code
dim tablo(),elem as object,a&
with createobject("htmlfile")
.body.innerhtml=code
for each elem in .all
redim preserve tablo(0 to a):
if elem.tagname="SPAN" and elem.id="availability_value"then
if elem.classname="available" then tablo(a)="oui" else tablo(a)="non"'stockage ici de la donnée
end if
next
end with

voila en quelques centième de seconde tes span sont déterminés dans une variable tableau
et tu balance le tableau avec par exemple cells(1,1).resize(ubound(tablo)+1,1)=application.transpose(tablo)

voila le temps d'exécution dépendra de ton débit et du trafic sur le site en question
2000 lignes html tu les verrais même pas passer en html
excuse moi j'ai tapé ca a l'arrache mais le principe est la
 

ninajams

XLDnaute Junior
Merci Patrick.

En effet se code provient du site excel-malin.

J'ai adapté ton code mais le temps d'exécution est de ......35 minutes.

Dans tous les cas cette version du code est plus intéressante de mon point de vue car elle me permet d'extraire de manière plus fine les informations.

Je te remercie
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…