Résolu : VBA - xx.Find - Passer à la nouvelle recherche si aucun résultat trouvé

KennyAix

XLDnaute Nouveau
Bonjour à tous,

j'ai parcouru la recherche (ici et ailleurs sur le web), sans trouver de solution (simple) à mon problème.

Pour éclaircir les raisons d’utiliser cette méthode plutôt qu'une autre, je vais vous expliquer comment fonctionne le fichier dans lequel je dois importer des données.

Il s'agit d'un fichier, identique sur le fond, mais pas sur la forme.
Il exporte uniquement des données réelles, et lorsqu'un un résultat devrait être 0, il n'affiche tout simplement pas la ligne concernée.

J'utilise donc la fonction "Selection.Find", afin de récupérer la donnée que si la cellule est présente.

Cependant, lorsque c'est absent, il me prend du coup une cellule qui ne correspond pas.

J'aimerais, lorsque le résultat de la recherche est "null", que cela saute à la prochaine étape.
J'ai bien vu des solutions à ça, mais j'ai des dizaines de recherche de ce type, et cela me semblera trop complexe à mettre en oeuvre (je suis débutant VBA quasi autodidacte depuis une formation sur les bases de la programmation VBA via Excel).

Voici donc un exemple du code qui me pose problème :

Code:
Sub ImportDonnéesHLC()
'
' ImportDonnéesHLC Macro
' Importe les données du fichier HLC NIVEAU 2 du lundi (il faut choisir le fichier à ouvrir)
'
Dim pathFichier As String, NomFichierHLC As String, tmpStr() As String
Dim leClasseur As Workbook
Dim NumSem As String

Suppression du rafraichissement de l'ecran
   Application.ScreenUpdating = False
    
' Récupérer le fichier ReportingHLC à ouvrir (path complet)
    pathFichier = Application.GetOpenFilename("Fichier excel,*.xls", , "Sélection du fichier Activite FIT du lundi de la semaine suivante")
   
' Ouvrir le fichier ReportingHLC
    Set leClasseur = Application.Workbooks.Open(pathFichier)
   
' Récupérer le nom du fichier ReportingHLC
    tmpStr = Split(pathFichier, "\")
    NomFichierHLC = tmpStr(UBound(tmpStr))
    
' Demande du nom du fichier mensuel
    NumSem = InputBox("Entrez le numéro de semaine à traiter, sous le format nombre uniquement", "Numéro de semaine")
     
    On Error Resume Next
    
' Lancement de la procédure d'importation des données

''' Focus sur les "En cours" '''
 
 ' En cours Dysfonctionnement SC
 
    Windows(NomFichierHLC).Activate
    Rows("40:65").Select
    Selection.Find(What:="En cours Dysfonctionnement SC", After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False).Activate
    ActiveCell.Offset(0, 1).Range("A1").Copy
    Windows("Matrice Weekly ITS Fixe 2013.xlsm").Activate
    Range("E136").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

        
' En cours Expertise N2 FIT
 
    Windows(NomFichierHLC).Activate
    Rows("40:65").Select
    Selection.Find(What:="En cours Expertise N2 FIT", After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False).Activate
    ActiveCell.Offset(0, 1).Range("A1").Copy
    Windows("Matrice Weekly ITS Fixe 2013.xlsm").Activate
    Range("E137").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

 Réactivation du rafraichissement de l'ecran
    Application.ScreenUpdating = True
    
End Sub

Dans cet exemple, si la cellule devant contenir "En cours Dysfonctionnement SC" n'est pas trouvée, cela me copie le contenu la cellule B40 à la place, alors que j'aimerais que ça passe à la recherche suivante.

Merci de votre aide :)

PS : je n'ai pas mis le code complet car il y a plus de 500 lignes mais le reste est quasi identique ou alors ne pose aucun soucis :)
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : VBA - Selection.Find - Passer à la nouvelle recherche si aucun résultat trouvé

Bonjour Kenny et bienvenu, bonjour le forum,

Peut-être comme ça :
Code:
Dim cc As Workbook
Dim r1 As Range

Set cc = Workbooks("Matrice Weekly ITS Fixe 2013.xlsm")
Windows(NomFichierHLC).Activate
Set r1 = Rows("40:65").Find(What:="En cours Dysfonctionnement SC", After:=ActiveCell, LookIn:=xlFormulas, _
   LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
   MatchCase:=False, SearchFormat:=False).Activate
If Not r1 Is Nothing Then r1.Offset(0, 1).Range("A1").Copy
    cc.Activate
    Sheets("Feuil1").Activate 'nom de l'onglet à vérifier
    Range("E136").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End If
       
' En cours Expertise N2 FIT
 
Dim r2 As Range
Windows(NomFichierHLC).Activate
Set r2 = Rows("40:65").Find(What:="En cours Expertise N2 FIT", After:=ActiveCell, LookIn:=xlFormulas, _
   LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
   MatchCase:=False, SearchFormat:=False).Activate
If Not r2 Is Nothing Then
    r2.Offset(0, 1).Range("A1").Copy
    cc.Activate
    Sheets("Feuil1").Activate 'nom de l'onglet à vérifier
    Range("E137").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
End If
 

KennyAix

XLDnaute Nouveau
Re : VBA - Selection.Find - Passer à la nouvelle recherche si aucun résultat trouvé

Bonjour Robert,

et merci pour ton aide.

Je rencontre 3 soucis avec ce code (dont 2 résolus) :


  1. la fonction "End If" n'est pas acceptée --> Pop up d'erreur "Erreur de compilation : End If sans bloc If" alors qu'il est bien présent avec le "If Not r1..."
    En le supprimant, cela fonctionne bien...mais

  2. la fonction "Rows("40:65").Find" ne sélectionne pas les lignes demandées, j'ai donc mis simplement à la place :
    Code:
    Columns("A:A").Select
    Set r1 = Selection.Find
  3. un dernier soucis se pose sur le résultat de la fonction :
    Code:
    Columns("A:A").Select
    Set r1 = Selection.Find(What:="Trt Ano FIT-Change", After:=ActiveCell, LookIn:=xlFormulas, _
       LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
       MatchCase:=False, SearchFormat:=False).Activate
    If Not r1 Is Nothing Then r1.Offset(0, 1).Range("A1").Copy
        Matrice.Activate
        Range("E99").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    'End If
    Le résultat de r1 est égal à "Nothing" alors que le terme recherché est bien présent et la cellule est bien sélectionnés dans colonne...
    Du coup le A1 correspondant n'est pas copié, et cela colle les dernières données copiées.

Merci encore pour votre aide !
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : VBA - Selection.Find - Passer à la nouvelle recherche si aucun résultat trouvé

Bonjour Kenny, bonjour le forum,

Il faut éviter autant que possible les Select qui ralentissent considérablement l'exécution du code et sont sujets à plantages.
Si Rows("40:65").Find ne fonctione pas essaie plutôt ActiveSheet.Rows("40:60") mais pas Select.
Si tu mets If... Then + la résponse à la condition sur la même ligne, le End If est en trop. Je m'étais moi-même trompé dans l'exemple envoyé...
Essaie comme ça et tes deux derniers problèmes seront résolus (je pense) :
Code:
If Not r1 Is Nothing Then
     r1.Offset(0, 1).Range("A1").Copy
     Matrice.Activate
     Range("E99").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
       :=False, Transpose:=False
End If
 

KennyAix

XLDnaute Nouveau
Re : VBA - Selection.Find - Passer à la nouvelle recherche si aucun résultat trouvé

Bonjour Robert,

merci pour cette réponse rapide.

Le problème du "End If" est en effet réglé en allant à la ligne.

Cependant, même avec
Code:
Set r1 = ActiveSheet.Rows("40:65").Find(What:="Trt Ano FIT-Change", After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False).Activate
le résultat est "Nothing" pour r1 :confused:

J'ai aussi testé ça mais idem il ne trouve plus rien.
Code:
Set r1 = ActiveSheet.Columns("A:A").Find(What:="Trt Ano FIT-Change", After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False).Activate
J'ai ensuite testé la "mauvaise" méthode avec Selection.Find, cela sélectionne bien la cellule correspondante cette-fois, mais le résultat de r1 est toujours "Nothing" :confused:

Merci encore.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : VBA - Selection.Find - Passer à la nouvelle recherche si aucun résultat trouvé

Bonjour Kenny, bonjour le forum,

Pourquoi tu recherches dans les formules et pas dans le texte ? Et pourquoi le Activate à la fin ? Essaie comme ça :
Code:
Set r1 = ActiveSheet.Rows("40:65").Find("Trt Ano FIT-Change", , xlValues, xlWhole)
Si il ne trouve pas c'est que que Trt Ano FIT-Change a au moins un caractère différent (un espace peut-être)...
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 328
Membres
103 180
dernier inscrit
Vcr