Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Chaine de caractère à comparer ordre indifférent

B

ben

Guest
Bonjour le forum

j'ai un souci concernant une comparaison de chaines de caractère

J'ai une listbox avec différente valeurs
TOTO
TITI

j'ai le code suivant pour l'extraire en chaine de caractère :

Dim sTxt As String

Dim resultat As String



For irow = 0 To UserForm1.listbox2.ListCount - 1
If sTxt = "" Then
sTxt = UserForm1.listbox2(irow)
Else
sTxt = sTxt & "+" & UserForm1.listbox2.List(irow)
End If
Next irow

resultat = sTxt


resultat est donc égal à "TOTO+TITI"

je compare ensuite cette chaine à une cellule, si il me trouve la même chaine il m'affiche dans une textbox la valeur de l'offset(0,2)
Code suivant :

If UserForm1.listbox2.ListCount >= 2 Then
Sheets("gestion").Select
For Each orge In ActiveSheet.Range("A3:A" & ActiveSheet.Range("B65536").End(xlUp).Row)
If orge.Value = UserForm1.cbx_choix.Value _
And orge.Offset(0, 1).Value = UserForm1.txt_choix_item.Value _
And orge.Offset(0, 2).Value = resultat Then
UserForm1.TextBox1.Value = orge.Offset(0, 3).Value
Else
UserForm1.TextBox1.Value = "inexistant"
UserForm1.CommandButton5.Visible = True
End If
Next orge

Mon problème est que si il y a comparaison entre "TOTO+TITI" et "TITI+TOTO" il m'affiche inexistant alors qu'il devrait m'afficher un N° correspondant à l'offset(0,2)

Comment puis je faire pour gérer une comparaison de chaine ds un ordre indifférent ?

Merci pour votre aide
 
W

wally

Guest
Bonjour ben et le forum,

Une possibilité serait de trier les deux chaînes de caractères avant de les comparer. Pour cela, procéder comme suit :

1. Ajouter dans ton code la fonction suivante :

Function Comparaison(sTxt1 As String, sTxt2 As String) As Boolean

Dim tTxt1() As String
Dim tTxt2() As String

tTxt1() = Split(sTxt1, "+")
tTxt2() = Split(sTxt2, "+")

Call Tri_Bulle(tTxt1)
Call Tri_Bulle(tTxt2)

If Join(tTxt1, "+") = Join(tTxt2, "+") Then
Comparaison = True
End If

End Function


2. Ajouter dans ton code la procédure suivante :

Sub Tri_Bulle(tTri)

Dim iVar1 As Integer
Dim iVar2 As Integer
Dim iVar3 As Integer

Dim sTemp As String

For iVar1 = LBound(tTri) To UBound(tTri)
iVar2 = iVar1
For iVar3 = iVar2 + 1 To UBound(tTri)
If tTri(iVar3) <= tTri(iVar2) Then
iVar2 = iVar3
End If
Next iVar3
If iVar1 <> iVar2 Then
sTemp = tTri(iVar2)
tTri(iVar2) = tTri(iVar1)
tTri(iVar1) = sTemp
End If
Next iVar1

End Sub


3. Modifier ton code, en remplaçant la ligne :

And orge.Offset(0, 2).Value = resultat Then

par celle-ci :

And Comparaison(orge.Offset(0, 2).Value, resultat) = True Then


Slts

wally
 
B

ben

Guest
salut wally !
tu es toujours là qd j'ai besoin de toi !
Tu est vraiment trop sympa et sa marche du premier coup en plus !!
Sans toi je je te promets j'avancerai vraiment pas vite

J'ai une toute petite question hors sujet
J'ai un userform1 avec une image
Dans ce userform j'ai des frame1, 2, et 3
Pour voir l'image en entier je voudrai rendre ces frame transparant sais tu comment faire ?
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…