Problème de copie/recherche Instr

Résolu/Fermé
Reizo Messages postés 17 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 21 janvier 2013 - 21 janv. 2013 à 10:05
Reizo Messages postés 17 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 21 janvier 2013 - 21 janv. 2013 à 15:55
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 :

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:

7 réponses

Utilisateur anonyme
21 janv. 2013 à 10:33
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.
0
Reizo Messages postés 17 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 21 janvier 2013
21 janv. 2013 à 10:44
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 ?
0
Utilisateur anonyme
21 janv. 2013 à 13:55
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)
0
Reizo Messages postés 17 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 21 janvier 2013
Modifié par Reizo le 21/01/2013 à 15:08
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

        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
0

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

Posez votre question
Reizo Messages postés 17 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 21 janvier 2013
21 janv. 2013 à 15:30
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 :

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.
0
Utilisateur anonyme
21 janv. 2013 à 15:42
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 ?
0
Utilisateur anonyme
21 janv. 2013 à 15:47
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 ?
0
Reizo Messages postés 17 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 21 janvier 2013
21 janv. 2013 à 15:55
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 ^^
0