VBA Find (encore)

Résolu
dudu -  
 dudu -
Bonjour,

J'ai deux fichiers ouverts contenant des informations référencées sous un code.
Je veux lire le premier pour vérifier que chaque code lu est présent dans le deuxième.
J'utilise la fonction find. je définit une plage sur les colonnes du 2 fichiers concernées par la recherche : Set Plage = Workbooks(NomRDSI).Sheets(FeuilleRDSI).Range(Cells(2, 1), Cells(LastLigne, 3)). La définition de la "plage" me renvoit toujours "Nothing" ???!!!
SI j'inverse pour voir les deux fichier, Set Plage = Workbooks(Nom).Sheets("version").Range(Cells(2, 1), Cells(LastLigne, 3)), la palge est bien différente de Nothing.
J'ai mis un on error rsume next. Quand je l'enlèv j'ai l'erreur : 1004

Quelqu'un peut-il m'aider à comprendre.
Merci d'avance

Dim ProjetRecherché As Range
Dim Boucle1 As Long
Dim Dernièreligne, LastLigne As Long
Dim Posit As Long
Dim Plage As Range
Dim Cellule As Range
Dim CodeProjetPlage As Range
Dim nbPTotal, nbPNew, nbPSupp As Long

Sub liensRDSI()

' Récupération fichier version et ouverture de Extract RDSI
Nom = ActiveWorkbook.Name
Feuille1 = ActiveWorkbook.ActiveSheet.Name

Chemin = Application.ThisWorkbook.Path
RDSI = Chemin & "\RDSI.xls"
FeuilleRDSI = "RDSI"
NomRDSI = "RDSI.xls"

'On Error Resume Next
Workbooks.Open Filename:=RDSI
Workbooks(NomRDSI).Activate

' recherche de la dernière ligne de la feuille RDSI.xls\version
For ligne = 2 To 9999999
If Workbooks(NomRDSI).Sheets(FeuilleRDSI).Cells(ligne, 1) = "" Then
LastLigne = ligne - 1
ligne = 9999999
End If
Next

Set Plage = Workbooks(NomRDSI).Sheets(FeuilleRDSI).Range(Cells(2, 1), Cells(LastLigne, 3))
' Commentaire : Set Plage = Workbooks(Nom).Sheets("version").Range(Cells(2, 1), Cells(LastLigne, 3))

Workbooks(Nom).Activate

' initialisation des variables
Version = Workbooks(Nom).Sheets("Paramètre").Cells(2, 2)
Boucle1 = 3
ligne = 2

' recherche de la dernière ligne de la feuille V----.xls\version
For ligne = 3 To 9999
If Workbooks(Nom).Sheets(Feuille1).Cells(ligne, 2) = "" Then
Dernièreligne = ligne
ligne = 99999
End If
Next

While Boucle1 < Dernièreligne
Set ProjetRecherché = Workbooks(Nom).Sheets(Feuille1).Cells(Boucle1, 3)
' MsgBox (Plage.Find(ProjetRecherché))
If Not (Plage.Find(ProjetRecherché) Is Nothing) Then
Workbooks(Nom).Sheets(Feuille1).Cells(Boucle1, 9) = "inexistant"
' MsgBox (ProjetRecherché & " non trouvé")
Else
Workbooks(Nom).Sheets(Feuille1).Cells(Boucle1, 9) = "non"
' MsgBox (ProjetRecherché & " trouvé")
End If

Boucle1 = Boucle1 + 1
Wend
End Sub

5 réponses

  1. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour,
    'On Error Resume Next JAMAIS METTRE DÉTECTION ERREUR QUAND ONT CRÉE LA MACRO
    Workbooks.Open Filename:=RDSI
    'Workbooks(NomRDSI).Activate Pas besoin, le dernier fichier ouvert est le fichier actif.
    ' recherche de la dernière ligne de la feuille RDSI
        LastLigne  = Sheets("RDSI").[A999999].End(XlUp).Row

    Ta boucle je comprend pas ce que tu veux faire.

    A+
    0
    1. dudu
       
      j'ai 1 premier fichier "V11.10.XLS" qui contient dans sa feuille "Version" une liste avec en colonne 3 un code dont je veux vérifier la présence dans le deuxième fichier "RDSI" feuille "RDSI". Si trouvé je mets "non" en colonne 9 de version sinon je mets "inexistant". Dans "RDSI" le code est en colonne 1. Je défini une Plage (2, 1) à (lastligne , 3) pour ensuite faire une recherche dans cette plage avec "find". C'est à l'exécution du "set plage" que l'erreur 1004 apparaît.

      Merci de ton aide

      NB : quand j'exécute ta commande pour trouver la dernière ligne, j'ai erreur 424 objet requis ???
      0
  2. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    J'ai penser que tu avais Excel 2007 ou +
    LastLigne  = Sheets("RDSI").[A65536].End(XlUp).Row

    Pour la suite, plus le temps maintenant.
    A=
    0
    1. dudu
       
      ok c'est mieux
      je suis bien en 2007 - mais je sauvegarde en 2003 - toute l'entreprise n'a pas encore migré ...
      0
    2. dudu
       
      du coup j'ai allégé le code - ci-après

      Sub liensRDSI()

      ' initialisation des variables
      Nom = ActiveWorkbook.Name
      Feuille1 = ActiveWorkbook.ActiveSheet.Name
      Chemin = Application.ThisWorkbook.Path
      RDSI = Chemin & "\RDSI.xls"
      FeuilleRDSI = "RDSI"
      NomRDSI = "RDSI.xls"
      Version = Workbooks(Nom).Sheets("Paramètre").Cells(2, 2)
      Boucle1 = 3
      ligne = 2

      ' recherche de la dernière ligne + 1 de la feuille V----.xls\version
      DernièreLigne = Workbooks(Nom).Sheets(Feuille1).[B65536].End(xlUp).Row + 1

      'ouverture de Extract RDSI
      'On Error Resume Next
      Workbooks.Open Filename:=RDSI

      ' recherche de la dernière ligne de la feuille RDSI.xls\version
      ' si Excel 2007 et + ==> LastLigne = Sheets(FeuilleRDSI).[A999999].End(xlUp).Row
      LastLigne = Sheets("RDSI").[A65536].End(xlUp).Row

      'Set Plage = Workbooks(Nom).Sheets("version").Range(Cells(2, 1), Cells(LastLigne, 3))
      Set Plage = Workbooks(NomRDSI).Sheets(FeuilleRDSI).Range(Cells(2, 1), Cells(LastLigne, 3))

      While Boucle1 < DernièreLigne
      Set ProjetRecherché = Workbooks(Nom).Sheets(Feuille1).Cells(Boucle1, 3)
      If Not (Plage.Find(ProjetRecherché) Is Nothing) Then
      Workbooks(Nom).Sheets(Feuille1).Cells(Boucle1, 9) = "inexistant"
      Else
      Workbooks(Nom).Sheets(Feuille1).Cells(Boucle1, 9) = "non"
      End If

      Boucle1 = Boucle1 + 1
      Wend
      End Sub
      0
  3. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    J'ignore la cause, mais avec la solution Finf je ne parvient pas à faire une sélection valable..
    Par exemple recherche = B et qu'il trouve Bleu il retourne que c'est trouvé.
    Essaye quand même...
    Sub TesterFind1() 
    Dim Plage As Range, Wks As Workbook 
    Dim Cel As Range, Chemin As String 
    Dim DerLigne As Long, R As String 
        Set Wks = ThisWorkbook 
        Chemin = Wks.Path 
         
        Workbooks.Open (Chemin & "\RDSI.xls") 
        DerLigne = Sheets("RDSI").Range("A65536").End(xlUp).Row 
        Set Plage = Sheets("RDSI").Range("A1:A" & DerLigne) 
         
        Wks.Activate 
        Sheets("Version").Select 
        DerLigne = Range("C65536").End(xlUp).Row 
         
        For Each Cel In Range("C1:C" & DerLigne) 
        If Not Plage.Find(Cel.Text) Is Nothing Then R = "NON" Else R = "Inexistant" 
            Cells(Cel.Row, 9) = R 
        Next Cel 
    End Sub 

    Mais j'ai employer une autre solution qui fonctionne bien.
    Sub testerFind2() 
    Dim PlageExt As Range, PlageInt As Range 
    Dim Nom As String 
    Dim CelExt As Range, CelInt As Range 
    Dim Chemin As String, B As Boolean 
         
        Nom = ThisWorkbook.Name 
        Chemin = ThisWorkbook.Path 
        Workbooks.Open (Chemin & "\RDSI.xls") 
        Sheets("RDSI").Select 
        Set PlageExt = Range("A1:A" & Range("A65536").End(xlUp).Row) 
         
        Workbooks(Nom).Activate 
        Sheets("Version").Select 
        Set PlageInt = Range("C1:C" & Range("C65536").End(xlUp).Row) 
        For Each CelInt In PlageInt 
            B = True 
            For Each CelExt In PlageExt 
                If CelInt = CelExt Then 
                    Cells(CelInt.Row, 9) = "NON" 
                    B = False: Exit For 
                End If 
            Next CelExt 
            If B Then Cells(CelInt.Row, 9) = "Inexistant" 
        Next CelInt 
    End Sub

    Note : possible une ou deux faute de syntaxe, j'ai tester avec les noms de mes classeurs.
    A+
    L'expérience instruit plus sûrement que le conseil. (André Gide)
    Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
    NOTE : Je ne répond pas aux MP pour les questions techniques.
    Ça doit se passer sur le forum pour que tous puisse y participer ou en profiter.
    0
    1. dudu
       
      Merci
      Impossible de faire fonctionner ces fonction. CelExt renvoi systématiquement nothing !!!
      Du coup je suis revenu à la programmation clmassique avec une boucle de comparaison à chaque occurence du fichier de départ.; 166 X 1500 ... C'est long, mais ça marche.

      Merci pour l'aide
      A+

      Pour acquérir de l'expérience rien ne vaut l'apprentissage auprès d'experts chevronnés, patients et passionnés par le transferts de compétence. (mon Grandpère)
      Si tu te tapes sur les doigts avec ton marteau, ne t'en veux pas, c'est le métier qui rentre. (toujours mon Grandpère)
      ;-)
      0
  4. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Les 2 codes FONCTIONNENT, je vois pas ce qui pourrait donner cette erreur
    Et me semble que tu te décourage asser vite.
    Sur quel ligne l'erreur ?
    0
    1. dudu
       
      J'avais un peu de taf et devais arriver à un résultat rapide.
      C'est fait.
      Je reviens donc sur ton code.
      Il ne fait pas d'erreur, mais il ne trouve aucune valeur de PlageInt dans PlageExt. Alors qu'il devrait.
      En testant, j'ai vu que l'instruction Range("A65536").End(xlUp).Row remontait 1 alors qu'il y plus de 14000 lignes.
      Je l'ai remplacé par :
      LastLigne = Sheets("RDSI").[A65536].End(xlUp).Row
      Set PlageExt = Range("A2:A" & LastLigne)
      et là c'est ok.
      Mais, CelExt n'est jamais renseigné. je me suis mis un compteur et un test sur la valeur de ligne à partir de laquelle je devrai trouver le 1er CelInt (11865) :

      For Each CelInt In PlageIn
      B = True
      For Each CelExt In PlageExt
      a = a + 1
      If a > 11865 Then
      MsgBox (a & " " & CelInt & " " & CelExt)
      End If
      If CelInt = CelExt Then
      Cells(CelInt.Row, 9) = "oui"
      B = False: Exit For
      End If
      Next CelExt
      If B Then Cells(CelInt.Row, 9) = "non
      Next CelInt

      le display donne : 11866 006024
      la valeur de a, la valeur de CelInt, mais pas de valeur pour CelExt.

      ??
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    le display donne : 11866 006024
    Ce qui veux dire que ta donnée est en texte, Si dans l'autre c'est un nombre.. 6024, tu ne trouvera jamais de concordance.
    Mais ton test n'est pas bon
    Regarde où se trouve la même donnée dans l'autre classeur
    et tu remplace le XX par le N° de la ligne

    Sub testerFind2() 
    Dim PlageExt As Range, PlageInt As Range 
    Dim Nom As String 
    Dim CelExt As Range, CelInt As Range 
    Dim Chemin As String, B As Boolean 
    
        Nom = ThisWorkbook.Name 
        Chemin = ThisWorkbook.Path 
        Workbooks.Open (Chemin & "\RDSI.xls") 
        Sheets("RDSI").Select 
        Set PlageExt = Range("A2:A" & Range("A65536").End(xlUp).Row) 
          
        Workbooks(Nom).Activate 
        Sheets("Version").Select 
        Set PlageInt = Range("C1:C" & Range("C65536").End(xlUp).Row) 
        For Each CelInt In PlageInt 
            B = True 
            For Each CelExt In PlageExt 
                If CelInt.Row = 11185 & CelExt.Row = XX Then 
                    MsgBox ( CelInt.Value & "   " & CelExt.Value) 
                End If 
                If CelInt = CelExt Then 
                    Cells(CelInt.Row, 9) = "NON" 
                    B = False: Exit For 
                End If 
            Next CelExt 
            If B Then Cells(CelInt.Row, 9) = "Inexistant" 
        Next CelInt 
    End Sub 
    


    L'expérience instruit plus sûrement que le conseil. (André Gide)
    Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
    NOTE : Je ne répond pas aux MP pour les questions techniques.
    Ça doit se passer sur le forum pour que tous puisse y participer ou en profiter.
    0
    1. dudu
       
      Le test est bon, la valeur XX est justement 11186. Mais peu importe, j'ai trouvé.
      J'avais écrit le code dans la feuille au lieu d'un Module.
      Maintenant ça marche.

      Merci du temps passé
      A+
      0