Vérifier plusieurs string avec des conditions différentes
Bonjour à toutes et à tous,
J'ai besoin du moyen le plus pratique pour mon cas ci-dessous.
J'ai 5 bases de données à vérifier dans 5 feuilles différentes et dans lesquelles je dois checker si un bout de texte apparaît...
les conditions de texte sont tout le temps les mêmes à vérifier et je trouve bête de les récrire à chaque fois et en suite j'aimerai le type d'article pour la suite du code.
Voici un petit exemple ci-dessous :
Sub CheckString()
Dim wb As Workbook, Data As Worksheet
Set wb = Workbooks("classeur1")
Set Data = wb.Sheets("Data")
'Base 1
For x = 1 To 4
value = Data.Cells(x, 1).value
If value Like "*frigo*" Or value Like "*réfrigérateur*" Then
Data.Cells(x, 1).value = value & "1"
Article = "Frigo"
ElseIf value Like "*plaque*" Or value Like "*induction*" Then
Data.Cells(x, 1).value = value & "2"
Article = "plaque"
End If
'du code....
'Base 2
value = Data.Cells(x, 1).value
If value Like "*frigo*" Or value Like "*réfrigérateur*" Then
Data.Cells(x, 1).value = value & "1"
Article = "Frigo"
ElseIf value Like "*plaque*" Or value Like "*induction*" Then
Data.Cells(x, 1).value = value & "2"
Article = "plaque"
End If
'du code....
'Base 3
value = Data.Cells(x, 1).value
If value Like "*frigo*" Or value Like "*réfrigérateur*" Then
Data.Cells(x, 1).value = value & "1"
Article = "Frigo"
ElseIf value Like "*plaque*" Or value Like "*induction*" Then
Data.Cells(x, 1).value = value & "2"
Article = "plaque"
End If
'du code....
'Base 4
value = Data.Cells(x, 1).value
If value Like "*frigo*" Or value Like "*réfrigérateur*" Then
Data.Cells(x, 1).value = value & "1"
Article = "Frigo"
ElseIf value Like "*plaque*" Or value Like "*induction*" Then
Data.Cells(x, 1).value = value & "2"
Article = "plaque"
End If
Next x
End Sub
bonjour, comme ça ?
Sub CheckString()
Dim wb As Workbook, Data As Worksheet, iBase
Set wb = Workbooks("classeur1")
For iBase = 1 To 4
Select Case iBase
Case 1: Set Data = wb.Sheets("Data1")
Case 2: Set Data = wb.Sheets("Data2")
Case 3: Set Data = wb.Sheets("Data3")
Case 4: Set Data = wb.Sheets("Data4")
Case Else: MsgBox "erreur": Exit Sub
End Select
For X = 1 To 4
value = Data.Cells(X, 1).value
If value Like "*frigo*" Or value Like "*réfrigérateur*" Then
Data.Cells(X, 1).value = value & "1"
Article = "Frigo"
ElseIf value Like "*plaque*" Or value Like "*induction*" Then
Data.Cells(X, 1).value = value & "2"
Article = "plaque"
End If
Next
Next
End Sub
Bonjour,
c'est vraiment comme ça que je l'imaginais !
As-tu une idée de comment combiner avec ce code un Range.find et un FindNext ?
Car avec un même numéro je dois rechercher la 1ère occurence que je dois tester au conditions puis tous les FindNext...
D'avance merci de ton retour.
Re,
Est-il possible de mettre qu'une seule fois les conditions pour la 1ère occurrences trouvées et que les conditions restent pour le FindNext ?
Car dans mon cas je dois répéter 2x toutes les conditions...
En tout cas merci pour ton "Case Select" qui m'a permis de bien mieux comprendre cette fonction !
voici un exemple :
Dim wb As Workbook
Set wb = Workbooks("Classeur1")
Set Saisie = wb.Sheets("Saisie")
For iBase = 1 To 4
Select Case iBase
Case 1: Set Data = wb.Sheets("Base1")
Case 2: Set Data = wb.Sheets("Base2")
Case 3: Set Data = wb.Sheets("Base3")
Case 4: Set Data = wb.Sheets("Base4")
End Select
Set lRow = Data.Range("A" & Rows.Count).End(xlUp)
lRow = lRow.Row
For x = 1 To lRow
VE = Saisie.Cells(x, 1).value
With Data.Range("A1:A" & lRow)
Debug.Print "Range : " & "iBase : " & iBase & " " & Data.Range("A1:A" & lRow).Address
Set Find = .Find(VE, LookIn:=xlValues)
If Not Find Is Nothing Then
'Ici mettre les conditions
Data.Cells(x, 2).value = "y"
Do
Set Find = .FindNext(Find)
'Ici mettre les conditions
Data.Cells(x, 2).value = "y"
Loop While Not Find Is Nothing
End If
End With
Next x
Next
MsgBox ("END")
End Sub
bonjour,
alors on doit vérifier chaque plage 4 fois, une fois pour chaque mot et on rassemble ces cellules dans 2 plages UN1 et UN2
Sub Vincent()
Dim UN1 As Range, UN2 As Range, aArr, sFA, s
Set wb = ThisWorkbook
aArr = Array("frigo", "refrigérateur", "plaque", "induction") 'les 4 mots à trouver
For iBase = 1 To 4
Select Case iBase
Case 1: Set Data = wb.Sheets("Base1")
Case 2: Set Data = wb.Sheets("Base2")
Case 3: Set Data = wb.Sheets("Base3")
Case 4: Set Data = wb.Sheets("Base4")
End Select
With Data
'****************************************************************************
'UN1= plage avec les 2 premiers mots, UN2 = plage avec les 2 derniers mots sans les 2 premiers mots
'****************************************************************************
Set UN1 = Nothing: Set UN2 = Nothing 'RAZ ces 2 plages avec ces mots
Set c = .Range(.Range("A1"), .Range("A" & Rows.Count).End(xlUp)).Offset(, 1) 'plage en colonne B à vérifier
For x = 0 To UBound(aArr) 'boucle les 4 mots
sFA = "" 'RAZ first address
Set c1 = c.Find(aArr(x), lookat:=xlPart) 'première cellule avec ce mot
If Not c1 Is Nothing Then
fa = c1.Address 'addresse première cellule
Do 'boucle
If x <= 1 Then 'pour les 2 premiers mots
Set UN1 = Union(c1, IIf(UN1 Is Nothing, c1, UN1)) 'plage avec toutes les cellules qui contiennent un des 2 premiers mots
Else
b = UN1 Is Nothing
If Not b Then b = Intersect(UN1, c1) Is Nothing
If b Then Set UN2 = Union(c1, IIf(UN2 Is Nothing, c1, UN2)) 'exclure que la cellules aussi contient un des 2 premiers mots
End If
Set c1 = c.Find(aArr(x), lookat:=xlPart, after:=c1)
Loop While c1.Address <> fa
End If
Next
End With
s = ""
If Not UN1 Is Nothing Then
s = s & vbLf & "plage avec les 2 premier mots : " & UN1.Address
UN1.Offset(, 11).Value = "Valeur1" 'colonne M est 11 colonnes vers droite >> mettez "valeur1" dans ces cellules
End If
If Not UN2 Is Nothing Then
s = s & vbLf & "plage avec les 2 dernier mots : " & UN2.Address
UN2.Offset(, 11).Value = "valeur2"
End If
If Len(s) Then MsgBox Mid(s, 2), vbInformation, UCase(Data.Name) Else MsgBox "rien", vbInformation, UCase(Data.Name)
Next
End Sub
Re,
Merci pour ta réponse rapide !
c’est dans ces moments là que je me rends compte que j’ai un niveau moyen en VBA Ahahah.
je pense à avoir saisi le truc, par contre imaginons que j’ai plus que 4 mots ?
Par exemple : j’ai 15 articles à vérifier et pour chacun de ces articles il peut avoir (plusieurs conditions) en fonction du texte codifié de l’article…
Exemple:
FrigoArray(….
PlaqueArray(..
RobinetArray (« robinet, mitigeur)
Jusqu’à 15-20 array.. (le nombre de possibilités de recherche par array peut être totalement différent en fonction de l’article..)
c’est toujours possible?
autre méthode :
on a un tableau avec tous les mots dans sa premiere colonne et le texte que vous voulez voire dans sa 2ième colonne. Quand on inspecte la formule, on vera un "MAX" là-dedans, donc s'il y a plusieurs matches, le mots qui se trouve le plus en bas sera le résultat. Donc il faut trier le tableau de cette manière que les mots les plus important se trouvent en bas.
Maintenant avec une formule on peut faire des recherches. Il faut savoir que ce sont des formules matricielles qui consomment beaucoup du processeur. Donc c'est mieux de limiter le nombre de ces formules. On peut faire cela, en remplaçant la formule par sa valeur.
Le nombre de lignes dans ce tableau n'est pa limité, mais augmentera le temps de recalculation.
Sub Vincent2()
With Sheets("blad1")
Set c = .Range("B1").Resize(1000) 'une plage de 1.000 cellules
With c
.FormulaR1C1 = "=""aaaaaaatekst"" & TEXT(RANDBETWEEN(1,99),""00"") & ""bbbbbb""" 'un texte aleatoire dans ces 1.000 cellules
.Value = .Value 'remplacer la formule par sa valeur
End With
With c.Offset(, 5) '5 colonnes vers droite
.Formula2R1C1 = "=IFERROR(INDEX(Tabel1[reponse],1/(1/MAX(ISNUMBER(SEARCH(Tabel1[texte],RC[-5]))*ROW(Tabel1[texte])))-ROW(Tabel1[[#Headers],[reponse]])),""?"")" 'formule
' .Value = .Value '>>>>> plus tard remplacer la formule par sa valeur
End With
End With
End Sub
Bonjour,
merci de ton retour.
J'ai essayé et ça marche, je vais partir sur ta solution.
Je te remercie encore ! Bien joué !