Condition sans utiliser de variables
Bonjour, voici mon problème (Je précise que je suis débutant en VBA, ne pas taper SVP!!)
J'ai un fichier qui me sert à gérer un stock de tôles,
J'ajoute depuis un Userform des formats à un stock, quand le format existe déjà, je ne veux pas l'ajouter, mais modifier la quantité dans la ligne existante.
J'ai fait un bout de code qui compare des valeurs d'une listbox a celle déjà existante dans ma feuille "stock", mon problème est que si je ne passe pas par des variables ça marche pas, alors que la même chose avec variable fonctionne, quelqu'un pourrais t'il m'expliquer pourquoi?
Ci-joint le fichier (Ne pas tenir compte de la page 1 du UserForm qui n'est pas terminée
ActiveWorkbook.Worksheets("Stock").Activate
For i = 2 To Range("a65000").End(xlUp).Row
'Dim Mat As String
'Dim nuance As String
'Dim finition As String
'Dim Ep As Double
'Dim dim1 As Integer
'Dim dim2 As Integer
'Mat = Sheets("Stock").Cells(i, 1).Value
'nuance = Sheets("Stock").Cells(i, 2).Value
'finition = Sheets("Stock").Cells(i, 3).Value
'Ep = Sheets("Stock").Cells(i, 4).Value
'dim1 = Sheets("Stock").Cells(i, 5).Value
'dim2 = Sheets("Stock").Cells(i, 6).Value
'If _
'ListBox1.List(ListBox1.ListIndex, 0) = Mat And _
'ListBox1.List(ListBox1.ListIndex, 1) = nuance And _
'ListBox1.List(ListBox1.ListIndex, 2) = finition And _
'ListBox1.List(ListBox1.ListIndex, 3) = Ep And _
'Textbox3.value = dim1 And _
'Textbox2.value = dim2 _
'Then MsgBox ("Le format existe déja")
If _
ListBox1.List(ListBox1.ListIndex, 0) = Sheets("Stock").Cells(i, 1).Value And _
ListBox1.List(ListBox1.ListIndex, 1) = Sheets("Stock").Cells(i, 2).Value And _
ListBox1.List(ListBox1.ListIndex, 2) = Sheets("Stock").Cells(i, 3).Value And _
ListBox1.List(ListBox1.ListIndex, 3) = Sheets("Stock").Cells(i, 4).Value And _
TextBox3.Value = Sheets("Stock").Cells(i, 5).Value And _
TextBox2.Value = Sheets("Stock").Cells(i, 6).Value _
Then MsgBox ("Le format existe déja")
mon problème est que si je ne passe pas par des variables ça marche pas, alors que la même chose avec variable fonctionne, quelqu'un pourrais t'il m'expliquer pourquoi?
Tes variables sont typées (String, Double ou integer). Lorsque tu leur affectes une valeur, VBA effectue automatiquement la conversion dans le type.
Par exemple :
Dim dim1 As Integer
dim1 = Sheets("Stock").Cells(i, 5).ValueEst l'équivalent de
Dim dim1 As Variant
dim1 = CInt(Sheets("Stock").Cells(i, 5).Value)D'autre part les valeurs contenues dans un Textbox ou un Listbox sont toujours de Type String.
Ceci explique celà :
- soit tu mélanges les types que tu compares (les torchons et les serviettes) et tu laisse VBA comprendre ce qu'il peut (ou ce qu'il veut).
- soit tu convertis les valeurs pour comparer des valeurs de même type (String avec String, Integer avec Integer, ...)
Merci de votre réponse....
Effectivement je commençais à aller vers cette piste, en essayant de comparer juste du texte avec du texte ça fonctionne,
dès que je compare les valeurs dans les combo box qui sont des chiffres avec celle des cellules sans passer par les variables ça marche plus.
Du coup c'est quoi la solution? je suis obligé de passer par les Variables?
Le plus efficace, c'est d'utiliser les fonctions de conversion.
Super merci, ça fonctionne, ce n'est peut être pas très "orthodoxe" mais ça marche en suivant vos conseils
comme je vous l'ai dit je débute et je ne connaissais pas la possibilité de convertir directement une expression dans un type voulu...
ActiveWorkbook.Worksheets("Stock").Activate
For i = 2 To Range("a65000").End(xlUp).Row
If _
ListBox1.List(ListBox1.ListIndex, 0) = Sheets("Stock").Cells(i, 1).Value And _
ListBox1.List(ListBox1.ListIndex, 1) = Sheets("Stock").Cells(i, 2).Value And _
ListBox1.List(ListBox1.ListIndex, 2) = Sheets("Stock").Cells(i, 3).Value And _
CDec(ListBox1.List(ListBox1.ListIndex, 3)) = CDec(Sheets("Stock").Cells(i, 4).Value) And _
TextBox3.Value = CInt(Sheets("Stock").Cells(i, 5).Value) And _
TextBox2.Value = CInt(Sheets("Stock").Cells(i, 6).Value) _
Then
MsgBox ("Le format existe déja la quantité est ajouté au stock existant")
Sheets("Stock").Cells(i, 7).Value = TextBox1.Value + Sheets("Stock").Cells(i, 7).Value
Exit Sub
End If
Next iDans le même registre j'avais un autre problème avec une addition de valeur par lesquelles j'ai du passer par des variables, j'imagine que c'est la même chose?
Dim L1 As Integer
Dim L2 As Integer
Dim L1L2 As Integer
L1 = TextBox2.Value
L2 = TextBox3.Value
L1L2 = L1 + L2
If ListBox1.List(ListBox1.ListIndex, 3) <= 3 And L1L2 >= 3000 And L1 >= 500 And L2 >= 500 Then GoTo A
If 3 < ListBox1.List(ListBox1.ListIndex, 3) <= 5 And L1L2 >= 2500 And L1 >= 400 And L2 >= 400 Then GoTo A
If ListBox1.List(ListBox1.ListIndex, 3) > 5 And L1L2 >= 1500 And L1 >= 400 And L2 >= 400 Then GoTo APeut on ajouter cette fonction de conversion dans le style suivant
CInt(TextBox2.Value)Re,
Lorsqu'une cellule contient un nombre il est toujours de type Double.
Au lieu de :
If CDec(ListBox1.List(ListBox1.ListIndex, 3)) = CDec(Sheets("Stock").Cells(i, 4).Value)Il vaut mieux écrire :
If CDbl(ListBox1.List(ListBox1.ListIndex, 3)) = Sheets("Stock").Cells(i, 4).ValueEt au lieu de :
If TextBox3.Value = CInt(Sheets("Stock").Cells(i, 5).Value)Il faudrait écrire :
If CInt(TextBox3.Value) = CInt(Sheets("Stock").Cells(i, 5).Value)On pourrait aussi comparer les valeurs en type doubles,
mais il y a un risque avec cette conversion, du fait de l'arrondi des nombres binaires en virgule flottante.
If CDbl(TextBox3.Value) = Sheets("Stock").Cells(i, 5).ValueOk merci, c'est un peu plus clair désormais, toutefois si je suis tes conseils cela me donne :
If _
CDbl(ListBox1.List(ListBox1.ListIndex, 0)) = Sheets("Stock").Cells(i, 1).Value And _
CDbl(ListBox1.List(ListBox1.ListIndex, 1)) = Sheets("Stock").Cells(i, 2).Value And _
CDbl(ListBox1.List(ListBox1.ListIndex, 2)) = Sheets("Stock").Cells(i, 3).Value And _
CDbl(ListBox1.List(ListBox1.ListIndex, 3)) = Sheets("Stock").Cells(i, 4).Value And _
CInt(TextBox3.Value) = CInt(Sheets("Stock").Cells(i, 5).Value) And _
CInt(TextBox2.Value) = CInt(Sheets("Stock").Cells(i, 6).Value) _
ThenMais j'ai une erreur d'"incompatibilité de type"
Cette erreur se produit, soit lorsque la fonction de conversion ne reconnait pas l'argument comme un nombre, soit lors de la comparaison de 2 variables de types différents.
Avec Cdbl(), les chiffres textuels doivent être au format local, c'est à dire, en français, avec la virgule comme séparateur décimal (ce qui peut être gênant si on utilise le point du pavé numérique pour saisir le textbox ou le listbox).
Pour convertir en nombre Double, un chiffre textuel dont le séparateur décimal est le point, utilises Val()
If _
Val(ListBox1.List(ListBox1.ListIndex, 0)) = Sheets("Stock").Cells(i, 1).Value And _Merci, tout fonctionne maintenant
A Bientot