[VBA] Fonction InStr ne marche pas

Fermé
Plow - 16 août 2012 à 13:40
 Utilisateur anonyme - 16 août 2012 à 17:05
Bonjour à tous

J'ai créé une variable de type String dans laquelle je voudrais faire une recherche pour savoir si une valeur n'existe pas déjà. La voici :

While Sheets("Index").Range("E" & ILine) <> ""
    Range("G2").Value = ILine - 12
    
    LocalAuthors = Split(Sheets("Index").Range("E" & ILine), ", ")
    For i = 0 To (UBound(LocalAuthors) - LBound(LocalAuthors))
        If Not (InStr("; " & LocalAuthors(i), AllAuthors) Or InStr(LocalAuthors(i) & " ;", AllAuthors)) Then
            If AllAuthors = "" Then
                AllAuthors = LocalAuthors(i)
            Else
                AllAuthors = AllAuthors & " ; " & LocalAuthors(i)
            End If
            
            Range("G4").Value = Range("G4").Value + 1
        End If
    Next i
    ILine = ILine + 1
Wend


Visiblement, lorsque je fais un InStr dans AllAuthors (de type String) et que la valeur existe déjà, la condition sera toujours vrai. Que faire ?

Je vous remercie bien :)

4 réponses

Utilisateur anonyme
16 août 2012 à 13:55
Bonjour

J'ai l'impression que tu as inversé les deux paramètres du InStr :
        If Not (InStr( AllAuthors, "; " & LocalAuthors(i)) Or InStr(  AllAuthors,LocalAuthors(i) & " ;")) Then
0
Bonjour.

Merci de ta réponse rapide, mais cela ne marche toujours pas. J'ai tenté autre chose (cette fois qui marche), mais c'est assez moche.

            'IsInside = True
            'For Each Author In Split(AllAuthors, " ; ")
            '    If Author = LocalAuthors(i) Then
            '        IsInside = False
            '    End If
            'Next Author
            'If IsInside And AllAuthors <> "" Then
            '    AllAuthors = AllAuthors & " ; " & LocalAuthors(i)
            '    Range("G4").Value = Range("G4").Value + 1
            'End If
            'If AllAuthors = "" Then
            '    AllAuthors = LocalAuthors(i)
            '    Range("G4").Value = Range("G4").Value + 1
            'End If

(commenté pour tester ta solution à côté). J'arrive avec ce code à 1080 résultats, avec l'autre à plus de 1300. Donc il y a bien un problème d'utilisation de InStr.

Une solution ?
0
Utilisateur anonyme
16 août 2012 à 14:24
Tu trouves 1080 résultats dans un cas et 1300 dans l'autre, mais lequel des deux est exact ? Y en a-t-il seulement un des deux ? As'tu comparé les listes pour voir où était la différence, ça donnerait une idée.

Déjà, dans ton premier script, il y avait plusieurs incohérences :
- Tu utilises LocalAuthors(i) : ton i devrait donc aller de LBound(LocalAuthors) à UBound(LocalAuthors) et non pas de 0 à UBound(LocalAuthors)-LBound(LocalAuthors). Comme UBound(LocalAuthors) est probablement à 0, ça ne change peut-être pas grand chose
- Tu recherches LocalAuthors(i) accompagné d'un point virgule (avant ou après) dans AllAuthors. Mais le premier nom que tu ajoutes n'est pas suivi d'un point virgule. S'il apparaît deux fois de suite, il sera mis deux fois dans AllAuthors.
Mais ces détails n'expliquent pas ton écart 1080/1300.
0
Utilisateur anonyme
16 août 2012 à 17:05
Bonjour,

Suggestion :

    If Not ((InStr(1, AllAuthors, "; " & LocalAuthors(i), vbTextCompare) > 0) Or _
            (InStr(1, AllAuthors, LocalAuthors(i) & " ;", vbTextCompare) > 0)) Then
    End If


Cdt

Lupin
0