PROBLEME BOUCLE

cs_CROCHU Messages postés 8 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 12 avril 2008 - 18 juil. 2007 à 15:18
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 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.......

With UserForm1
Range("B65536").End(xlUp).Offset(1, 0) = TextBox1.Value
Range("C65536").End(xlUp).Offset(1, 0) = TextBox2.Value
Range("D65536").End(xlUp).Offset(1, 0) = TextBox3.Value
Range("E65536").End(xlUp).Offset(1, 0) = TextBox4.Value
Range("F65536").End(xlUp).Offset(1, 0) = TextBox5.Value
Range("G65536").End(xlUp).Offset(1, 0) = TextBox6.Value
Range("H65536").End(xlUp).Offset(1, 0) = TextBox7.Value
Range("I65536").End(xlUp).Offset(1, 0) = TextBox8.Value
Range("L65536").End(xlUp).Offset(1, 0) = TextBox9.Value
Unload Me
End With



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

Emmanuel

7 réponses

tubafat Messages postés 79 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 25 septembre 2007
18 juil. 2007 à 15:55
Salut, quand tu dis que ça ne marche pas, c'est à dire?
En regardant vite fait je suis perplexe devant ces deux lignes:

If CheckBox1.Value = "ENTREE" Then
et
If CheckBox2.Value = "SORTIE" Then

Il me semble qu'une checkbox prend la valeur true ou false...

Tubafat
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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
0
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
19 juil. 2007 à 09:18
E.B.
0
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
19 juil. 2007 à 09:20
p%^$* de corne de bouc !

Message fantome... enfin bref


en gros je disais : l'option button a deux valeurs true false mais pas le checkbox qui en a trois


 


@+

E.B.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
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

MPi
0
cs_CROCHU Messages postés 8 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 12 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





With Sheets("BASE")





For i = 7 To 100
If CheckBox1.Value = True Then
       
Worksheets("BASE").Range("J" & i).Value = Worksheets("BASE").Range("J" & i).Value + UserForm2.SpinButton1.Value
Worksheets("BASE").Range("K" & i).Value = Worksheets("BASE").Range("I" & i).Value * Worksheets("BASE").Range("J" & i).Value
End If





 
 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

Merci a tous de me donner vos conseils avisés

Cordialement,

Emmanuel
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
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

MPi
0
Rejoignez-nous