VBA Find (encore)

Résolu/Fermé
dudu - 12 févr. 2011 à 12:04
 dudu - 15 févr. 2011 à 13:52
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

lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
12 févr. 2011 à 15:27
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
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
12 févr. 2011 à 16:40
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
ok c'est mieux
je suis bien en 2007 - mais je sauvegarde en 2003 - toute l'entreprise n'a pas encore migré ...
0
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 13/02/2011 à 13:21
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
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
14 févr. 2011 à 16:39
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
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

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

Posez votre question
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 14/02/2011 à 20:24
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
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