cs_CROCHU
Messages postés8Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention12 avril 2008
-
18 juil. 2007 à 15:18
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 2018
-
20 juil. 2007 à 12:32
Problème boucle sur VBA EXCEL
Bonjour à tous,
J'ai un tableau de gestion de stocks qui contient deux feuilles :
1 feuille appelée BASE qui contient en
B12 : le code produit
C12 : le fournisseur
D12 : le code fournisseur
E12 : la famille produit
F12 : le code famille
G12 : le libellé
H12 : la zone
I 12 : le prix unitaire
J 12 : le stock dispo
K12 : le stock valorisé
Sur cette feuille un bouton de commande me permet d'ouvrir un Userform qui me permet à son tour de renseigner les lignes du dessus et dont voici le code :
Jusque là pas de problème.......
La deuxième feuille de ce classeur appelée MVTSSTOCKS doit me permettre d'enregister les entrées et les sorties de produits et surtout de mettre à jour le stock dispo de la feuille BASE ( soit la cellule J12 de cette feuille BASE jusque par exemple la cellule J1000) mais également de mettre à jour la valeur de stock de chaque produit ( soit la valeur K12 de la feuille BASE jusque par exemple la cellule K1000.
Sur cette feuille MVTS DE STOCKS, un bouton de commande me permet d'activer un deuxième Userform qui est censé enregistrer les entrées et les sorties de marchandises, sachant également que les cellules B12 jusque G12 de cette feuille MVTS DE STOCKS reprennent les mêmes informations que les cellules B12 jusque G12 de la feuille BASE.
Voici ce que j'ai écrit et qui ne marche pas :
With UserForm2
Range("B65536").End(xlUp).Offset(1, 0) = TextBox1.Value
Range("I65536").End(xlUp).Offset(1, 0) = TextBox2.Value
Range("J65536").End(xlUp).Offset(1, 0) = TextBox3.Value
Range("K65536").End(xlUp).Offset(1, 0) = SpinButton1.Value
End With
Dim i As Long
With Sheets("BASE")
For i = 12 To 100
Sheets("BASE").Range("B12").Value = Sheets("MVTSSTOCKS").Range("B12").Value
Sheets("BASE").Range("C12") = Sheets("MVTSSTOCKS").Range("C12").Value
Sheets("BASE").Range("D12") = Sheets("MVTSSTOCKS").Range("D12").Value
Sheets("BASE").Range("E12") = Sheets("MVTSSTOCKS").Range("E12").Value
Sheets("BASE").Range("F12") = Sheets("MVTSSTOCKS").Range("F12").Value
Sheets("BASE").Range("G12") = Sheets("MVTSSTOCKS").Range("G12").Value
If CheckBox1.Value = "ENTREE" Then
Worksheets("BASE").Range("J12") = Worksheets("BASE").Range("J12").Value + UserForm2.SpinButton1.Value
Worksheets("BASE").Range("K12") = Worksheets("BASE").Range("I12").Value * Worksheets("BASE").Range("J12").Value
End If
Next i
For i = 12 To 100
If CheckBox2.Value = "SORTIE" Then
Worksheets("BASE").Range("J12") = Worksheets("BASE").Range("J12").Value - UserForm2.SpinButton1.Value
Worksheets("Feuil1").Range("K12") = Worksheets("Feuil1").Range("I12").Value * Worksheets("Feuil1").Range("J12").Value
End If
Next i
Unload Me
End With
Je ne parviens pas à m'en sortir avec ceci et vous remercie tous à l'avance de me consacrer un peu de votre temps pour un problème qui vous semblera certainement simple ;
merci à tous et bon après midi
Cordialement
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 18 juil. 2007 à 17:58
Salut
Exactement, Tubafat
Une CheckBox ne peut pas avoir de Value personnalisée, uniquement True ou False (en VBA)
Si tu veux donner un choix Entrée ou Sortie à ton utilisateur, ce sont des OptionButton qu'il faut utiliser. Une seule de ces deux OptionButton ne sera valide, ton test se simplifiera donc avec une structure genre :
If Option1.Value = True Then
' Si Option1 est 'Entrée'
Ici, les lignes de codes
Else
' Si Option2 est 'Sortie'
Ici, les lignes de codes
End If
De plus, tu fais des boucles de 12 à 100, mais tu n'utilises nulle part la variable 'i'
Alors, à part perder du temps, ces boucles ne servent à rien.
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 19 juil. 2007 à 12:11
Je te conseillerais d'utiliser moins souvent ce genre d'appel
Range("B65536").End(xlUp).Offset(1, 0) = TextBox1.Value Il y aura recalcul à chaque ligne de code...
Tu pourrais utiliser une variable, "Ligne", disons, et appeler cette fonction une seule fois
Dim Ligne as Long
Ligne = Cells(Rows.Count, "A").End(xlUp).Row +1
Range("B" & Ligne) = Textbox1.Value
... et le reste en utilisant Ligne
cs_CROCHU
Messages postés8Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention12 avril 2008 19 juil. 2007 à 14:16
Bonjour à tous,
Je vous remercie pour vos conseils avisés.
Je pense que je me suis assez mal expliqué :
La première feuille de mon tableau ( feuille BASE) me sert par le biai d'un Userform à remplir et renseigner ma base produit ;
le problème se situe au niveau de la deuxième feuille ( feuille MVTSSTOCKS) qui par le biai d'un Userform doit me permettre d'enregistrer les entrées et sorties de produits et de mettre le stock ainsi que la valeur de stock à jour sur la feuille BASE;
Le problème que je rencontre est le suivant
J'ai alimenté ma base produits avec 3 nouveaux articles donc 3 lignes, j'essaie de faire des entrées et des sorties mais soit je n'arrive pas
A faire dire au programme que sur la feuille MVTS DE STOCKS, qu'à partir du code produit selectionné (Range B de cette feuille) :
B12= le code produit
C12= le fournisseur
D12= le code fournisseur
E12=la famille produit
F12=le code famille
G12= le libellé
Sur la feuille BASE
Tout fonctionne néanmmoins au niveau des CheckBoxs, mon souci vient de la boucle qui est je pense mal écrite ou inadéquate ;
Voici ce que j'ai réecrit et qui , je pense n'est pas bon : ( en rouge dans le texte)
With UserForm2
Range("B65536").End(xlUp).Offset(1, 0) = TextBox1.Value
Range("I65536").End(xlUp).Offset(1, 0) = TextBox2.Value
Range("J65536").End(xlUp).Offset(1, 0) = TextBox3.Value
Range("K65536").End(xlUp).Offset(1, 0) = SpinButton1.Value
End With
Dim i As Long
For i = 7 To 100
Sheets("MVTSSTOCKS").Range("B" & i).Value = Sheets("BASE").Range("B" & i).Value
Sheets("MVTSSTOCKS").Range("C" & i).Value = Sheets("BASE").Range("C" & i).Value
Sheets("MVTSSTOCKS").Range("D" & i).Value = Sheets("BASE").Range("D" & i).Value
Sheets("MVTSSTOCKS").Range("E" & i).Value = Sheets("BASE").Range("E" & i).Value
Sheets("MVTSSTOCKS").Range("F" & i).Value = Sheets("BASE").Range("F" & i).Value
Sheets("MVTSSTOCKS").Range("G" & i).Value = Sheets("BASE").Range("G" & i).Value
Next i
If CheckBox2.Value = "SORTIE" Then
Worksheets("BASE").Range("J" & i) = Worksheets("BASE").Range("J & i").Value - UserForm2.SpinButton1.Value
Worksheets("BASE").Range("K" & i) = Worksheets("BASE").Range("I" & i).Value * Worksheets("BASE").Range("J" & i).Value
End If
Next i
End With
Unload Me
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 20 juil. 2007 à 12:32
Dans ta première boucle, comme il n'y a pas de condition, tu réécris tout simplement les lignes de 7 à 100 d'une feuille à l'autre ... et je ne pense pas que ce soit ce que tu cherches à faire ... (?) Si c'était le cas, tu pourrais faire un simple copier / coller, non ?
Dans la 2e boucle, tu utilises encore "SORTIE" pour vérifier Checkbox2.Value (on t'a déjà expliqué le problème...)
De plus, tu redémarres une boucle qui ne sers à rien ou du moins qui n'a pas sa place, puisque le code est déjà en train de boucler.
Pour être plus clair, dans la 1ere boucle tu réécris les cellules B, C, D, E, F et G
Dans la 2e, tu réécris les cellules J et K
Cette deuxième partie pourrait simplement être intégrée dans la première boucle.
Et relis les messages qu'on t'a laissés.
Tu écris ce genre de code pour chaque colonne sur lesquelles tu travailles. S'il y a une cellule vide, tu vas écrire sur la mauvaise ligne...
Range("B65536").End(xlUp).Offset(1, 0) = TextBox1.Value