Incrémenter une valeur VBA
bonjour,
je voudrais avoir un peu d'aide sur mon projet,
c'est un éditeur de stock le seul problème comme vous allez le voire, dès que je fait une entré dans mon stock sa incrémente pas si la référence et identique ainsi que la marque.
Se que je voudrais si possible, c'est que si le produit existe déja et que je veux faire une entrée de 20 par exemple sa les rajoutes déjà au produit existant en modifiant la date, et non crée dans une ligne différente. Tout cela en pouvant garder la possibilité de rajouter un produit tout nouveau .
merci de votre aide
Bonjour et bienvenue sur le forum,
Je te propose de modifier le code de ton bouton Validation de l'userform USF_C.
Comme ceci:
Private Sub B_Valid_Click()
With Sheets("MIF")
ligne = Application.Match(Me.ComboBox1.Value, .[A:A], 0)
If IsError(ligne) Then
'--- ref non trouvée va en fin de formulaire
ligne = .[a65000].End(xlUp).Row + 1
'--- Transfert Formulaire dans MIF
.Cells(ligne, "A") = Me.ComboBox1
.Cells(ligne, "B") = CDbl(Me.TextBox1)
.Cells(ligne, "C") = UCase(Me.ComboBox2) 'met en majuscules
.Cells(ligne, "D") = Me.ComboBox3
.Cells(ligne, "G") = Date
Call initialise
Else
ligne = .[C:C].Find(Me.ComboBox2.Value).Row
'--- ref trouvée ajoute à la réf
.Cells(ligne, 2) = CDbl(Me.TextBox1) + .Cells(ligne, 2) 'ajoute la quantité
.Cells(ligne, 3) = UCase(Me.ComboBox2) 'met en majuscules
.Cells(ligne, 7) = Date
Call initialise
End If
End With
End Sub@+
ddetp88
Kévin,
En fait je viens de faire des tests et il se trouve que ma réponse est incomplète.
Il faut ajouter un test sur la marque et sur la ligne de la référence.
Voici le nouveau fichier avec le code corrigé.
Private Sub B_Valid_Click()
With Sheets("MIF")
ligne = Application.Match(Me.ComboBox1.Value, .[A:A], 0)
If IsError(ligne) Then
'--- ref non trouvée va en fin de formulaire
ligne = .[a65000].End(xlUp).Row + 1
'--- Transfert Formulaire dans MIF
.Cells(ligne, "A") = Me.ComboBox1
.Cells(ligne, "B") = CDbl(Me.TextBox1)
.Cells(ligne, "C") = UCase(Me.ComboBox2) 'met en majuscules
.Cells(ligne, "D") = Me.ComboBox3
.Cells(ligne, "G") = Date
Call initialise
ElseIf .Cells(ligne, "C").Value = UCase(Me.ComboBox2.Value) Then
'--- ref trouvée ajoute à la réf
.Cells(ligne, "B") = CDbl(Me.TextBox1) + .Cells(ligne, 2) 'ajoute la quantité
.Cells(ligne, "C") = UCase(Me.ComboBox2) 'met en majuscules
.Cells(ligne, "G") = Date
Call initialise
Else
'--- Marque non trouvée va en fin de formulaire
ligne = .[a65000].End(xlUp).Row + 1
'--- Transfert Formulaire dans MIF
.Cells(ligne, "A") = Me.ComboBox1
.Cells(ligne, "B") = CDbl(Me.TextBox1)
.Cells(ligne, "C") = UCase(Me.ComboBox2) 'met en majuscules
.Cells(ligne, "D") = Me.ComboBox3
.Cells(ligne, "G") = Date
Call initialise
End If
End With
End SubA bientôt
ddetp88
Bonjour ,
je te remercie C'est un bon début sa ^^ mais le souci es que si je rajoute une lettre a la référence bha sa marche plus.
après si je garde la même référence mais change la marque sa ne crée pas une autre ligne sa écrase la réf. et dernier petit point si je change de dépôt sa écrase aussi la ref.
mais en tout merci , moi je me pencher sur un "si ref=recherche, marque = marque et que dispo = dispo alors on ajoute à la quantité sinon on créé une nouvelle ligne. tout en mettant a jours la date "
bref sa fait un an que je fait plus de vba et j'ai perdu pas mal d'acquis ... je mis remet donc a fond
Bonjour Kévin,
En fait tu vas devoir fournir des explications supplémentaires.
Dans l'onglet base tu as tes:
- produits avec la référence en première colonne
- fournisseurs (marque du produit je pense) en deuxième colonne
- dépôt ou stock en troisième colonne.
Ces données alimentent tes différents combobox.
Comme ton userform est conçu, tu peux pour une même référence modifier le fournisseur (combobox2). Est-ce bien normal?
Tu peux aussi modifier la colonne "Disponible" en dépôt ou en stock avec le combobox3. Est-ce bien normal?
Tout cela m'interroge quant au bon fonctionnement du fichier que tu as nommé gestion de stock.
Ne faudrait-il pas plutôt des labels en remplacement des combobox 2 et 3?
Ensuite, tu dis:
après si je garde la même référence mais change la marque sa ne crée pas une autre ligne sa écrase la réf. et dernier petit point si je change de dépôt sa écrase aussi la ref.
D'après les tests que je viens de faire, une nouvelle ligne se créait.
cordialement
ddetp88
Bonjour,
se fichier n'est que la premier version la nouvelle je peux pas la mettre le fichier es trop lourd...
en faite je peux pas faire une base de produit comme sa a la main car il y aura plus de 500 ref différente se que je voudrais c'est que dans mif tous se mette bien et s'agrémente sans faire de doublons et apres dans ma nouvelle version l'onglet base ajoute au fur et a mesure les ref mais aussi sans doublons .
Le bouton valide à garder le même code tous le reste sa marche c'est juste quand je fait une entrer de produit ou le problème se pose...
j'ai penser a sa moi :
Private Sub B_Valid_Click()
With Sheets("MIF")
ligne = Application.Match(Me.ComboBox1.Value, .[A:A], 0) And Application.Match(Me.ComboBox2.Value, .[C:C], 0) And Application.Match(Me.ComboBox3.Value, .[D:D], 0)
If IsError(ligne) Then
'--- ref non trouvée va en fin de formulaire
ligne = .[a65000].End(xlUp).Row + 1
'--- Transfert Formulaire dans MIF
.Cells(ligne, "A") = Me.ComboBox1
.Cells(ligne, "B") = CDbl(Me.TextBox1)
.Cells(ligne, "C") = UCase(Me.ComboBox2) 'met en majuscules
.Cells(ligne, "D") = Me.ComboBox3
.Cells(ligne, "G") = Date
Call initialise
Else: .Cells(ligne, "C").Value = UCase(Me.ComboBox2.Value)
'--- ref trouvée ajoute à la réf
.Cells(ligne, "B") = CDbl(Me.TextBox1) + .Cells(ligne, 2) 'ajoute la quantité
.Cells(ligne, "C") = UCase(Me.ComboBox2) 'met en majuscules
.Cells(ligne, "G") = Date
.Cells(ligne, "D").Value = UCase(Me.ComboBox3.Value)
Call initialise
End If
mais sa marche pas
Je viens de me pencher dessus et se script marche le mieux :
Private Sub B_Valid_Click()
With Sheets("MIF")
ligne = Application.Match(Me.ComboBox2.Value, .[A:A], 0)
If IsError(ligne) Then
'--- ref non trouvée va en fin de formulaire
ligne = .[a65000].End(xlUp).Row + 1
.Cells(ligne, "A") = Me.ComboBox1
.Cells(ligne, "B") = CDbl(Me.TextBox1)
.Cells(ligne, "C") = UCase(Me.ComboBox2)
.Cells(ligne, "D") = Me.ComboBox3
.Cells(ligne, "G") = Date
Call initialise
Else: .Cells(ligne, "C").Value = UCase(Me.ComboBox2.Value)
.Cells(ligne, "B") = CDbl(Me.TextBox1) + .Cells(ligne, 2) 'ajoute la quantité
.Cells(ligne, "C") = UCase(Me.ComboBox2) 'met en majuscules
.Cells(ligne, "G") = Date
Call initialise
End If
End With
End Sub la le stock se rajoute bien si la réf es identique mais alors qu'il faudrait que sa rajoute au stock que si la ref plus la marque + la dispo soit identique a la recherche
pour info j ai changer sa pour éviter de faire des doublon et avoir une et supprimer la base qui sera désormais mif
Private Sub UserForm_Initialize()
Me.ComboBox1.RowSource = "MIF!A2:A" & Sheets("MIF").[a65000].End(xlUp).Row
Me.ComboBox2.RowSource = "MIF!B2:B" & Sheets("MIF").[a65000].End(xlUp).Row
Me.ComboBox3.RowSource = "MIF!C2:C" & Sheets("MIF").[a65000].End(xlUp).Row
End Sub
ligne = Application.Match(Me.ComboBox1.Value, .[A:A], 0) And Application.Match(Me.ComboBox2.Value, .[C:C], 0) And Application.Match(Me.ComboBox3.Value, .[D:D], 0)ne peut pas fonctionner puisque match va donner le numéro de ligne de la 1ère référence correspondante.
Je te propose une autre solution avec une boucle.
En revanche il faut tester sur ton fichier original car si les lignes sont nombreuses, la durée de la macro risque de s'allonger.
Il faudra passer par des tableaux à ce moment là.
Private Sub B_Valid_Click()
With Sheets("MIF")
ligne = 2
Do While .Cells(ligne, "A") <> ""
If .Cells(ligne, "A").Value = Me.ComboBox1.Value _
And .Cells(ligne, "C").Value = UCase(Me.ComboBox2.Value) _
And .Cells(ligne, "D") = Me.ComboBox3.Value Then
'--- ref trouvée ajoute à la réf
.Cells(ligne, "B") = CDbl(Me.TextBox1) + .Cells(ligne, 2).Value 'ajoute la quantité
.Cells(ligne, "G") = Date
Call initialise
Unload Me
Exit Sub
End If
ligne = ligne + 1
Loop
If ligne = .[a65000].End(xlUp).Row + 1 Then
'--- Marque non trouvée va en fin de formulaire
'--- Transfert Formulaire dans MIF
.Cells(ligne, "A") = Me.ComboBox1
.Cells(ligne, "B") = CDbl(Me.TextBox1)
.Cells(ligne, "C") = UCase(Me.ComboBox2) 'met en majuscules
.Cells(ligne, "D") = Me.ComboBox3
.Cells(ligne, "G") = Date
Unload Me
Call initialise
End If
End With
End SubCordialement
ah super merci
du coup je comprend pas pourquoi tu dis ligne=2 tu a mis ligne comme sa ?
ou tu aurai très bien pu mettre boucle=2 car c'est biens se qu'il définis le nombre de boucle ?
j'ai repris la variable ligne que tu utilises depuis le début.
L'astuce étant d'utiliser la même variable partout.
Content que tu sois satisfait.
Cordialement
ddetp88
Dac
connais tu un formule exel pour suprimé automatiquement les doublons ?car je copie automatiquement les référence du tableau dans une colonne et je voudrais m'en servir comme petite basse pur éviter 'avoir plusieurs fois la mémé ref dans ma box .
comme tu as excel 2010 va dans le menu données/supprimer les doublons.
Si tu veux bien, il faut relancer un nouveau fil dès lors que la question n'a plus rien à voir avec la question de base.
@+