VBA Find (encore)
Résolu
dudu
-
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
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
A voir également:
- VBA Find (encore)
- Find and mount - Télécharger - Récupération de données
- Ava find - Télécharger - Divers Utilitaires
- Excel compter cellule couleur sans vba - Guide
- Fonction find vba ✓ - Forum Excel
- Fonction Find vba ✓ - Forum Excel
5 réponses
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
Ta boucle je comprend pas ce que tu veux faire.
A+
'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+
J'ai penser que tu avais Excel 2007 ou +
Pour la suite, plus le temps maintenant.
A=
LastLigne = Sheets("RDSI").[A65536].End(XlUp).Row
Pour la suite, plus le temps maintenant.
A=
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
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
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...
Mais j'ai employer une autre solution qui fonctionne bien.
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.
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.
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)
;-)
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)
;-)
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 ?
Et me semble que tu te décourage asser vite.
Sur quel ligne l'erreur ?
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.
??
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.
??
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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.
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.
Merci de ton aide
NB : quand j'exécute ta commande pour trouver la dernière ligne, j'ai erreur 424 objet requis ???