Fonction inStr VBA

Benjy

XLDnaute Occasionnel
Bonjour à tous !

J'ai une petite question sur la fonction inStr en vba.
Je souhaite tester la présence ou non de certaines chaines de caractère dans une cellule.

J'ai fait quelques recherches sur Google et j'ai trouvé ce site intéressant sur lequel on me donne cet exemple :

Manipuler les chanes de caractres en VB6 et VBA Excel
Exemple :

Code:
Sub RechercheMultiple()
    Dim Cible As String
    
    Cible = "engrenage,reducteur,courroie"
    
    If InStr(Cible, Range("A1")) = 0 Then
        MsgBox "Non"
    Else
        MsgBox "Oui"
    End If
End Sub


D'après l'aide sur cette fonction Le cible et le Range devrait être inversé.
Mais le texte d'explication du site est très claire :
"La fonction Instr peut aussi servir à contrôler si le contenu d'une chaîne est égal à un des mots "cible" défini dans la procédure.
Cet exemple vérifie si le contenu de la cellule A1 est égal à un des 3 mots indiqué dans la variable "Cible". "


Pourtant ce code ne fonctionne pas chez moi.
Je suis obligé de faire comme ceci :

Code:
For x = 15 To j
If InStr(Sheets("bâtiment").Cells(x, 3).Value, "sdb") <> 0 Then
Sheets("bâtiment").Range("AC" & x).Value = 2
ElseIf InStr(Sheets("bâtiment").Cells(x, 3).Value, "SDB") <> 0 Then
Sheets("bâtiment").Range("AC" & x).Value = 2
ElseIf InStr(Sheets("bâtiment").Cells(x, 3).Value, "Sdb") <> 0 Then
Sheets("bâtiment").Range("AC" & x).Value = 2
ElseIf InStr(Sheets("bâtiment").Cells(x, 3).Value, "Salle de bain") <> 0 Then
Sheets("bâtiment").Range("AC" & x).Value = 2
ElseIf InStr(Sheets("bâtiment").Cells(x, 3).Value, "Salle de bains") <> 0 Then
Sheets("bâtiment").Range("AC" & x).Value = 2
ElseIf InStr(Sheets("bâtiment").Cells(x, 3).Value, "Salle de Bain") <> 0 Then
Sheets("bâtiment").Range("AC" & x).Value = 2
ElseIf InStr(Sheets("bâtiment").Cells(x, 3).Value, "Salle de Bains") <> 0 Then
Sheets("bâtiment").Range("AC" & x).Value = 2
ElseIf InStr(Sheets("bâtiment").Cells(x, 3).Value, "salle de bain") <> 0 Then
Sheets("bâtiment").Range("AC" & x).Value = 2
ElseIf InStr(Sheets("bâtiment").Cells(x, 3).Value, "salle de bains") <> 0 Then
Sheets("bâtiment").Range("AC" & x).Value = 2
ElseIf InStr(Sheets("bâtiment").Cells(x, 3).Value, "SALLE DE BAIN") <> 0 Then
Sheets("bâtiment").Range("AC" & x).Value = 2
ElseIf InStr(Sheets("bâtiment").Cells(x, 3).Value, "SALLE DE BAINS") <> 0 Then
Sheets("bâtiment").Range("AC" & x).Value = 2
End If
Next x

Donc je me demande si au vu de l'exemple je n'ai tout simplement pas les yeux en face des trous ou si le site n'est plus à jour.
D'après ce site on peut également gérer les majuscules avec la fonction InStr ce qui m'arrangerait vu le nombre de possibilité d'écrire ma cible.

Voilà si quelqu'un peut m'éclairer sur mon problème...

Merci d'avance,

Benjy
 

Efgé

XLDnaute Barbatruc
Re : Fonction inStr VBA

Bonjour Benjy , essai ceci sans oublier les virgules de début et de fin:
VB:
Cible = ",engrenage,reducteur,courroie,"
et ensuite utilise ceci
VB:
If InStr(Cible, LCase("," & Range("A1").Value & ",")) = 0 Then
La liste est en minuscule et LCase vétrifie la cellule en minuscule... Cordialement
 

tototiti2008

XLDnaute Barbatruc
Re : Fonction inStr VBA

Bonjour Benjy,

L'exemple de départ part du principe que la cellule A1 (range("A1")) contient un seul mot, ce que tu as été obligé de reproduire dans ton code en testant tous les mots les uns après les autres
Pour gérer les majuscules/minuscules, tu peux ajouter vbTexteCompare dans tes fonctions Instr pour éviter d'avoir à mettre toutes les combinaisons majuscules/minuscules possibles

Code:
For x = 15 To j
If InStr(Sheets("bâtiment").Cells(x, 3).Value, "sdb", vbtextcompare) <> 0  or InStr(Sheets("bâtiment").Cells(x, 3).Value, "salle de bain", vbtextcompare) Then
Sheets("bâtiment").Range("AC" & x).Value = 2
End If
Next x

Edit : Salut Efgé :)
 

Benjy

XLDnaute Occasionnel
Re : Fonction inStr VBA

Bonjour Tototiti2008 et Efgé !
Merci pour vos réponses.

@Efgé le code ne semble pas fonctionner chez moi. J'ai peut être homis de préciser un détails.
La colonne C contient des noms de pièces qui peuvent contenir plusieurs mots. Ce que je souhaite en réalité c'est tester la présence de plusieurs chaînes de caractère dans les cellules de la colonne C.
Je ne comprends pas pourquoi dans ton code tu marques en premier Cible et ensuite la position.

InStr([start, ]string1, string2[, compare]) : Renvoie la position de la première occurence d'une chaîne de caractères (string2) dans une autre (string1). start est un argument optionnel définissant la position du caractère à partir duquel la recherche commence.

Pour moi String1 doit être ma colonne C et string2 doit être la chaine de caractère que je recherche dans la colonne C non ?

@Tototiti2008 : D'accord donc apparemment je n'ai pas d'autre choix que de fonctionner avec des "or" successifs. Mais ton code gère les majuscules ce qui est déjà un très bon point pour moi.
 

Benjy

XLDnaute Occasionnel
Re : Fonction inStr VBA

Re,

J'ai une incompatibilité de type sur cette ligne :
Code:
If InStr(Sheets("bâtiment").Cells(x, 3).Value, "sdb", vbTextCompare) <> 0 Or InStr(Sheets("bâtiment").Cells(x, 3).Value, "salle de bain", vbTextCompare) Then

J'avais déjà tenter cette possibilité. J'ai remarqué que lorsque je rajoute la "," après ma cible il considère que vbtextCompare est le string2.
 

Si...

XLDnaute Barbatruc
Re : Fonction inStr VBA

Salut

Si...tu utilises bien les * tu peux essayer :
Code:
Option Compare Text
Sub comp()
  j=30
  With Sheets("bâtiment")
    For x = 15 To j
      If .Cells(x, 3) Like "sdb" Or .Cells(x, 3) Like "Salle de bain*" Then .Range("AC" & x) = 2
    Next
  End With
End Sub
 

tototiti2008

XLDnaute Barbatruc
Re : Fonction inStr VBA

Re,

désolé, essaye

Code:
If InStr(1,Sheets("bâtiment").Cells(x, 3).Value, "sdb",  vbTextCompare) <> 0 Or InStr(1,Sheets("bâtiment").Cells(x, 3).Value,  "salle de bain", vbTextCompare) <>0 Then

Edit : Bonjour Si...
 

Benjy

XLDnaute Occasionnel
Re : Fonction inStr VBA

Re,

Parfait tototiti2008. effectivement je n'avais pas pensé à rajouter la position de départ.
Je vais fonctionner avec des or successifs. 2 ou 3 devrait suffire à couvrir la totalité de mes possibilités.

@ Si.. intéressant. Les * sont en remplacement des "s" si je comprends bien. Enfin représente n'importe quel caractère ?

Merci à vous pour la rapidité. Toujours au Top ce site.
 

ROGER2327

XLDnaute Barbatruc
Re : Fonction inStr VBA

Bonjour à tous



Une autre approche :​
VB:
Sub tata()
    j = 30
    With Sheets("bâtiment")
        For x = 15 To j
            If RM(.Cells(x, 3).Value) Then .Range("AC" & x).Value = 2 Else .Range("AC" & x).Value = Empty
        Next x
    End With
End Sub

Private Function RM(r$) As Boolean
    Dim Cible As String
    Cible = WorksheetFunction.Trim(LCase(r))
    RM = Cible Like "*sdb*" Or Cible Like "*salle de bain*" Or Cible Like "*salles de bain*"
End Function



ROGER2327
#5934


Jeudi 26 Merdre 139 (Sainte Barbaque, naïade - fête Suprême Quarte)
24 Prairial An CCXX, 4,3479h - caille-lait
2012-W24-2T10:26:06Z
 

Statistiques des forums

Discussions
312 233
Messages
2 086 466
Membres
103 225
dernier inscrit
PAPA ALIOUNE HANE