Problème de copie/recherche Instr
Résolu
Reizo
Messages postés
17
Date d'inscription
Statut
Membre
Dernière intervention
-
Reizo Messages postés 17 Date d'inscription Statut Membre Dernière intervention -
Reizo Messages postés 17 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Voila j'ai un code (avec commentaires) qui fait une recherche partielle d'une feuille sur une autre et dès que ma fonction Instr retourne l'occurence, mon code est censé copier la ligne correspondante dans une nouvelle feuille, or, mon problème est que, au final ça me copie toutes les lignes analysées dans la nouvelle feuille, si quelqu'un a une solution voici mon code :
Merci pour votre aide, Bonne journée.
Voila j'ai un code (avec commentaires) qui fait une recherche partielle d'une feuille sur une autre et dès que ma fonction Instr retourne l'occurence, mon code est censé copier la ligne correspondante dans une nouvelle feuille, or, mon problème est que, au final ça me copie toutes les lignes analysées dans la nouvelle feuille, si quelqu'un a une solution voici mon code :
Private Sub CommandButton1_Click() 'Ceci est juste la définition de la fonction de recherche, le nom importe peu Dim iR As Long 'iR est l'indice de ligne recherchée, cette variable change dans la première boucle (elle passe en revue les lignes de Donery de 2 à 30000 sur la quatrième colonne) Dim iAV As Long 'Ceci est la ligne dans laquelle le résultat de la recherche sera collé sur une nouvelle feuille Dim iL As Long 'iL est l'indice de la ligne utilisée pour la recherche, cette variable change dans la deuxieme boucle Dim L1 As Long 'L1 est la ligne jusqu'à laquelle la premiere boucle parcourt le tableau Dim L2 As Long 'L2 est la ligne jusqu'à laquelle la deuxieme boucle parcourt le tableau Dim R As Worksheet 'Définition de la variable R comme étant une feuille excel Dim AV As Worksheet 'Définition de la variable AV comme étant une feuille excel Set R = Worksheets("Donery") 'Feuille de l'entreprise Set AV = Worksheets("Feuil1") 'Nouvelle feuille Set EQ = Worksheets("Equivalences") 'Feuille d'où provient la donnée de recherche Dim PositionOccurence As Integer iAV = 2 'Début de collage sur la nouvelle feuille à la ligne 2 For iR = 2 To 50 'Boucle balayant toutes les lignes de l'entreprise concernée For iL = 2 To 4 'Boucle balayant toutes les lignes de références dans la feuille équivalences PositionOccurence = InStr(1, R.Cells(iR, 4).Value, EQ.Cells(iL, 7).Value, vbTextCompare) If PositionOccurence <> 0 Then R.Range(iR & ":" & iR).Copy AV.Cells(iAV, 1) 'Commande de copie iAV = iAV + 1 'Incrémentation du compteur de ligne sur laquelle la copie sera collée End If Next iL Next iR End Sub
Merci pour votre aide, Bonne journée.
A voir également:
- Problème de copie/recherche Instr
- Copie cachée - Guide
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Super copie - Télécharger - Gestion de fichiers
- Copie écran samsung - Guide
- Copie disque dur - Guide
7 réponses
Bonjour
As-tu fait du pas à pas pour vérifier la valeur de PositionOccurence ?
N'oublie pas qu'il y a de nombreux cas où Instr rend autre chose que zéro sans que la chaîne soit trouvée, par exemple si String1 est null ou string2 est vide ou null.
As-tu fait du pas à pas pour vérifier la valeur de PositionOccurence ?
N'oublie pas qu'il y a de nombreux cas où Instr rend autre chose que zéro sans que la chaîne soit trouvée, par exemple si String1 est null ou string2 est vide ou null.
Oui j'ai fait du pas à pas et apparemment, PositionOccurence a la valeur "1" 50 fois de suite et je ne sais pas pourquoi...
Sinon que me conseillez-vous comme méthode ?
Sinon que me conseillez-vous comme méthode ?
Quand tu fais du pas à pas, arrête-toi sur un cas où tu trouves 1 alors que tu t'attends à 0.
Vérifie les valeurs de R.Cells(iR, 4) et EQ.Cells(iL, 7). Si tu ne comprends pas pourquoi InStr ne te donne pas la bonne valeur, relis la définition de la fonction InStr, et reviens mettre ici les valeurs de R.Cells(iR, 4) et de EQ.Cells(iL, 7)
Vérifie les valeurs de R.Cells(iR, 4) et EQ.Cells(iL, 7). Si tu ne comprends pas pourquoi InStr ne te donne pas la bonne valeur, relis la définition de la fonction InStr, et reviens mettre ici les valeurs de R.Cells(iR, 4) et de EQ.Cells(iL, 7)
J'ai fait ce que tu m'as dit, je me suis arrêté à un moment ou Instr me renvoie 1 alors que je m'attends à 0.
Les valeurs de R.Cells et EQ.Cells sont bonnes.
Instr est censée me retourner 1 quand EQ.Cells(iL, 7) est null ou nothing, elle est censée me retourner 0 quand EQ.Cells(iL, 7) est introuvable ou R.Cells(iR, 4) est null ou nothing ou quand 1 > R.Cells(iR, 4) (ce que je comprend pas trop d'ailleurs).
Et la valeur dont je dois me servir est quand Instr trouve une occurence, elle est censée me renvoyer la ligne correspondante, or ben, elle me la renvoie pas.
En fait au final Instr me renvoie toujours soit 1 soit 0 et quand je mets
Elle me copie toutes les lignes analysées dans la nouvelle feuille
Les valeurs de R.Cells et EQ.Cells sont bonnes.
Instr est censée me retourner 1 quand EQ.Cells(iL, 7) est null ou nothing, elle est censée me retourner 0 quand EQ.Cells(iL, 7) est introuvable ou R.Cells(iR, 4) est null ou nothing ou quand 1 > R.Cells(iR, 4) (ce que je comprend pas trop d'ailleurs).
Et la valeur dont je dois me servir est quand Instr trouve une occurence, elle est censée me renvoyer la ligne correspondante, or ben, elle me la renvoie pas.
En fait au final Instr me renvoie toujours soit 1 soit 0 et quand je mets
PositionOccurence = InStr(2, R.Cells(iR, 4).Value, EQ.Cells(iL, 7).Value, vbTextCompare) If PositionOccurence <> 0 And PositionOccurence <> 1 Then R.Range(iR & ":" & iR).Copy AV.Cells(iAV, 1)
Elle me copie toutes les lignes analysées dans la nouvelle feuille
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Problème réglé, j'ai juste changé la condition, si la case n'est pas vide et qu'elle correspond ça renverra forcément quelque chose d'autre que 1 ou 0 donc ça marche comme ça :
En tous cas merci de ton aide, a bientot.
PositionOccurence = InStr(1, R.Cells(iR, 4).Value, EQ.Cells(iL, 7).Value, vbTextCompare) If PositionOccurence > 1 Then R.Range(iR & ":" & iR).Copy AV.Cells(iAV, 1) 'Commande de copie
En tous cas merci de ton aide, a bientot.
ou quand 1 > R.Cells(iR, 4) (ce que je comprend pas trop d'ailleurs)
J'ai d'abord cru que tu avais mal lu la doc... Mais je lis bien la même chose que toi. Sûrement une erreur de l'aide, la seule chose logique ici serait
si start > longueur(string1)
Les valeurs de R.Cells et EQ.Cells sont bonnes.
Si tu as obtenu 1, c'est bien que tu étais dans un des cas prévus pour avoir 1.
Pourrais-tu, au lieu de me dire que c'était les "bonnes" valeurs, me dire quelles valeurs il y avait ?
J'ai d'abord cru que tu avais mal lu la doc... Mais je lis bien la même chose que toi. Sûrement une erreur de l'aide, la seule chose logique ici serait
si start > longueur(string1)
Les valeurs de R.Cells et EQ.Cells sont bonnes.
Si tu as obtenu 1, c'est bien que tu étais dans un des cas prévus pour avoir 1.
Pourrais-tu, au lieu de me dire que c'était les "bonnes" valeurs, me dire quelles valeurs il y avait ?
If PositionOccurence <> 0 And PositionOccurence <> 1 Then
R.Range(iR & ":" & iR).Copy AV.Cells(iAV, 1)
Je n'avais pas relevé... Ça semble tellement impossible... En pas à pas, tu passes donc systématiquement sur la ligne R.Range(iR & ":" & iR).Copy AV.Cells(iAV, 1), même si PositionOccurence = 0 ou 1 ?
R.Range(iR & ":" & iR).Copy AV.Cells(iAV, 1)
Je n'avais pas relevé... Ça semble tellement impossible... En pas à pas, tu passes donc systématiquement sur la ligne R.Range(iR & ":" & iR).Copy AV.Cells(iAV, 1), même si PositionOccurence = 0 ou 1 ?
les valeurs de R.Cells et EQ.Cells étaient des chaines de caractères du genre WL524-624 des trucs comme ça ou des références contenant WL...... etc.
oui en pas à pas étrangement on voit bien que, que la valeur soit à 1 ou 0 on passe directement à la ligne de copie, d'ailleurs j'ai toujours pas compris les subtilités de Instr mais bon, maintenant que ça marche je ne vais pas me plaindre ^^
oui en pas à pas étrangement on voit bien que, que la valeur soit à 1 ou 0 on passe directement à la ligne de copie, d'ailleurs j'ai toujours pas compris les subtilités de Instr mais bon, maintenant que ça marche je ne vais pas me plaindre ^^