VBA Remplacer des cellule par valeur tableau et Aide Userform
Bonjour,
Afin de mieux organiser ma VBA je cherche à changer des référence à des colonne type :
Colonne A de la feuille Feuil1 (comme sur le code ci dessous)
en
tableau1 colonne "nom de la colonne" d'un tableau
Private Sub CommandButton1_Click()
Dim L As Integer
If MsgBox("Confirmez-vous l'insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d'ajout") = vbYes Then
L = Sheets("PRODUIT - Stock").Range("a65536").End(xlUp).Row + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau non vide
Worksheets("PRODUIT - Stock").Range("A" & L).Value = CDbl(ComboBox1)
Worksheets("PRODUIT - Stock").Range("B" & L).Value = TextBox1
Worksheets("PRODUIT - Stock").Range("F" & L).Value = CDbl(TextBox9)
Worksheets("PRODUIT - Stock").Range("D" & L).Value = CDbl(TextBox3)
Worksheets("PRODUIT - Stock").Range("E" & L).Value = CDbl(TextBox4)
End If
End SubEgalement je cherche a changer se code
Private Sub CommandButton2_Click()
Dim Ligne As Long
Dim I As Integer
If MsgBox("Confirmez-vous la modification de ce contact ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 2
For I = 1 To 4
If Me.Controls("TextBox" & I).Visible = True Then
Ws.Cells(Ligne, I + 2) = Me.Controls("TextBox" & I)
End If
Next I
End If
End SubMais au lieu de me remplir
Textbox1> colonne A
Textbox2>Colonne B
Je souhaiterais faire :
Textbox1 > tableauX Colonne "nom colonne"
Textbox2 > tableauY Colonne "nom colonne"
Un Grand Merci!
Bonjour MaxXx, bonjour le forum,
Perso je n'ai pas compris grand chose... Le fichier qui va bien il est où ?...
Bonjour MaxXx, Bonjour ThauThème,
Si j'ai bien compris, il faut en premier lieu mettre vos données sous forme de tableaux structurés. En évitant les lignes vides, on obtiendrait ceci :
Private Sub CommandButton1_Click()
Dim L As Integer
If MsgBox("Confirmez-vous l'insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d'ajout") = vbYes Then
L = Range("Stock").rows.count + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau non vide
Range("Stock[Qté]")(L).Value = CDbl(ComboBox1)
Worksheets("PRODUIT - Stock").Range("B" & L).Value = TextBox1 '<<< idem pour les autres
Worksheets("PRODUIT - Stock").Range("F" & L).Value = CDbl(TextBox9)
Worksheets("PRODUIT - Stock").Range("D" & L).Value = CDbl(TextBox3)
Worksheets("PRODUIT - Stock").Range("E" & L).Value = CDbl(TextBox4)
End If
End SubPour l'autre code, soit il faut appliquer la même logique (et peut-être que la boucle sera à oublier à moins de trouver un dénominateur commun à chaque nom de tableau), soit je n'ai pas compris
Cdlt,
Je n'ai pas pu le mettre entier avec l'hébergeur du forum, il fait 3mo...
Pour la première demande,
Aujourd'hui il envoi la valeur textbox1 dans Worksheets("PRODUIT - Stock").Range("B" & L)
Je souhaiterais qu'il l'envoi dans la tableauStock Colonne "produit"
Cela revient au même résultat, mais si j'insert une colonne je doit tout reprendre...
Pour la deuxième demande,
Aujourd'hui en lançant mon userform PRODUIT, dans Quantité stock par exemple(textbox2) il affiche la valeur de la colonne C de la feuille Produit Stock, je souhaiterais qu'il m'affiche la colonne "quantité en Stock" du tableau "tableaustock"
Afin de pouvoir changer les nom de mes textbox plus explicite que 1-2-3 et comme en haut de pouvoir insérer une colonne. sans tout refaire.
J'aurais ensuite une 3ème demande lorsque j'aurais ranger un peu tout cela,
c'est ajouter a mon userform une Combobox "marque" qui fait référence à une liste dans une nouvelle feuille, afin d'avoir la marque du produit puis sa description dans le Userform, mais que si la marque n'est pas dans la liste, qu'il l'ajoute à la liste puis tri de AaZ.
Voici un essai pour votre seconde demande si je l'ai comprise (j'ai déjà répondu à la première) :
Private Sub CommandButton2_Click()
Dim ctrl as Control
Dim Ligne As Long
Dim suffixe$
If MsgBox("Confirmez-vous la modification de ce contact ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 2
For each ctrl in Me.controls 'poru chaque ctrl de l'userform
if typename(ctrl) = "TextBox" and ctrl.visible then 'si c'est une textbox visible
suffixe = replace(ctrl.name, "TextBox_", "") 'suffixe prend le nom de la textbox sans le préfixe ("TextBox_")
Range("Stock[" & suffixe & "]")(Ligne) = ctrl 'la valeur est reportée à la colonne PORTANT LE MEME NOM QUE LE SUFFIXE DE LA TEXTBOX !!! à la ligne Ligne (de mon tableau "Stock")
End If
next ctrl
end if
end if
End SubExemple :
La valeur de TextBox_Quantité est reportée dans la colonne Quantité du TableauStock
La valeur de TextBox_PU est reportée dans la colonne PU du TableauStock
Bien entendu, il faudra renommer et adapter les noms de le code qui ne sont qu'illustratifs !
Edit : Tant que possible, il faut des noms clairs et courts : "Quantité de produits en stock" devient "Qté", "TableauStock" > "Stock"
Merci!
J'ai essayé, mais je suis en erreur et je ne sais pas ou...
EDIT:
J'ai trouvé le problème mais ne sais pas le résoudre, Les dernières lignes ne fonctionne plus forcement vu que j'ai tout renommé... et je n'arrive pas a adapter ton code :
For Each ctrl In Me.Controls 'poru chaque ctrl de l'userform
If TypeName(ctrl) = "TextBox" And ctrl.Visible Then 'si c'est une textbox visible
suffixe = Replace(ctrl.Name, "TextBox_", "") 'suffixe prend le nom de la textbox sans le préfixe ("TextBox_")
Range("TableauStock[" & suffixe & "]")(Ligne) = ctrl 'la valeur est reportée à la colonne PORTANT LE MEME NOM QUE LE SUFFIXE DE LA TEXTBOX !!! à la ligne Ligne
End If
Next ctrl
Private Sub UserForm_Initialize()
TextBox_Date_Vente.Value = DateValue(Now)
TextBox_Date_Achat.Value = DateValue(Now)
TextBox_Qté_Créa.Value = 0
Dim J As Long
Dim i As Integer
' ComboBox2.ColumnCount = 1 'Pour la liste déroulante Civilité
'ComboBox2.List() = Array("", "M.", "Mme", "Mlle")
Set Ws = Sheets("PRODUIT - Stock") 'Correspond au nom de votre onglet dans le fichier Excel
With Me.ComboBoxcb
For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
.AddItem Ws.Range("A" & J)
Next J
End With
For i = 1 To 7
Me.Controls("TextBox" & i).Visible = True
Next i
End Sub
J'ai essayé plusieurs choses, mais rien...
'Pour le formulaire
Private Sub UserForm_Initialize()
TextBox_Date_Vente.Value = DateValue(Now)
TextBox_Date_Achat.Value = DateValue(Now)
TextBox_Qté_Créa.Value = 0
Dim J As Long
Dim i As Integer
Dim ctrl As Control
Dim suffixe$
Dim Ligne As Long
' ComboBox2.ColumnCount = 1 'Pour la liste déroulante Civilité
'ComboBox2.List() = Array("", "M.", "Mme", "Mlle")
Set Ws = Sheets("PRODUIT - Stock") 'Correspond au nom de votre onglet dans le fichier Excel
With Me.ComboBoxcb
For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
.AddItem Ws.Range("A" & J)
Next J
End With
' For i = 1 To 7
' Me.Controls("TextBox" & i).Visible = True
' Next i
For Each ctrl In Me.Controls 'poru chaque ctrl de l'userform
If TypeName(ctrl) = "TextBox" And ctrl.Visible Then 'si c'est une textbox visible
suffixe = Replace(ctrl.Name, "TextBox_", "") 'suffixe prend le nom de la textbox sans le préfixe ("TextBox_")
Range("TableauStock[" & suffixe & "]")(Ligne) = ctrl 'la valeur est reportée à la colonne PORTANT LE MEME NOM QUE LE SUFFIXE DE LA TEXTBOX !!! à la ligne Ligne
End If
Next ctrl
End Sub
'Pour la liste déroulante Code client
Private Sub ComboBoxcb_Change()
Dim Ligne As Long
Dim ctrl As Control
Dim suffixe$
Dim Ligne As Long
If Me.ComboBoxcb.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBoxcb.ListIndex + 2
For Each ctrl In Me.Controls 'poru chaque ctrl de l'userform
If TypeName(ctrl) = "TextBox" And ctrl.Visible Then 'si c'est une textbox visible
suffixe = Replace(ctrl.Name, "TextBox_", "") 'suffixe prend le nom de la textbox sans le préfixe ("TextBox_")
Range("TableauStock[" & suffixe & "]")(Ligne) = ctrl 'la valeur est reportée à la colonne PORTANT LE MEME NOM QUE LE SUFFIXE DE LA TEXTBOX !!! à la ligne Ligne
End If
Next ctrl
End If
End If
End Sub
'Pour le bouton Nouveau contact
Je n'ai pas encore regardé le fichier. Mais peut-être que je n'ai pas été assez clair.
Disons que tu as 4 textbox. Elles sont nommées : "TextBox_Qté", "TextBox_PU", "TextBox_HT", "TextBox_TTC".
Alors il faut que 4 de tes colonnes du tableau Stock soient nommées "Qté", "PU", "HT", "TTC" pour que mon 1er code fonctionne (je t'invite donc à renommer ton tableau "Stock" et pas "tableaustock").
Et pour rappel, ce code est censé s'exécuter au clic d'un bouton, c'est le moment où toutes les valeurs saisies dans l'Userform sont reportées sur la feuille. Donc il faut bien laisser ce bout de code sous l'évènement CommandButton_Click.
Oui c'est ce que j'ai essayer de faire merci
Bonsoir,
Je viens de voir votre fichier. J'ai dû modifier pas mal de noms (accents manquants, underscore, le multipage et les pages, ...). Je ne vous cache pas que les userforms, ce n'est pas ce qui m'excite le plus
Etant donné que vous avez une partie générale et des sous-parties singulières, il faut bien réfléchir à toute la construction en amont parce que ça peut vite devenir chaotique (et on en est pas loin d'ailleurs
Pour l'instant, ce n'est pas grand-chose mais vous aurez le principe pour la suite :
Private Sub CommandButton_Nouveau_Click()
Dim ctrl As Control
Dim suffixe$
Dim valeur
Dim L As Integer
If Not MsgBox("Confirmez-vous l'insertion de ce nouveau produit ?", vbYesNo, "Demande de confirmation d'ajout") = vbYes Then Exit Sub
L = Range("Stock").Rows.Count + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau non vide
Range("Stock[Code_Barre]")(L).Value = CDbl(ComboBoxcb)
For Each ctrl In Me.Controls 'poru chaque ctrl de l'userform
If TypeName(ctrl) = "TextBox" And ctrl.Parent.Name = "Page_Nouveau" Then 'si c'est une textbox de nouveau produit
'If TypeName(ctrl) = "TextBox" And (ctrl.Parent.Name = "Page_Nouveau" or ctrl.Parent.Name = Me.name) Then 'option2
suffixe = Replace(ctrl.Name, "TextBox_", "") 'suffixe prend le nom de la textbox sans le préfixe ("TextBox_")
If IsNumeric(ctrl) Then valeur = CDbl(ctrl) Else valeur = ctrl 'si la valeur du controle est numérique, convertir en double
Range("Stock[" & suffixe & "]")(L) = valeur 'la valeur est reportée à la colonne PORTANT LE MEME NOM QUE LE SUFFIXE DE LA TEXTBOX !!! à la ligne Ligne
End If
Next ctrl
End SubLa page "Nouveau produit" est nommée "Page_Nouveau". Donc pour chaque textbox de cette page, on prend la valeur (convertie en double lorsqu'elle est numérique, laissée telle qu'elle est sinon). L'option 2 (en commentaire) permet de prendre les valeurs des textbox communes (dont le parent est l'userform).
Mais comme je vous ai dit, avant de vous avancer dans le code, réfléchissez bien à la façon d'organiser l'userform, à bien tout nommer (de façon logique avec des dénominateurs communs correspondant aux noms des objets visés sur la feuille) pour permettre de rendre les exécutions dynamiques.
Cdlt,