Boucle pour "enregistrer" un userform
Bonjour,
Je saite "enregistrer" les valeur(commentaires) saisie dans ma userform. Pour ca je cherche a renvoyer les commentaires dans mon tableau. Il y a cependant une condition, si la condition existe déja dans le tableau, ne pas la recréer, sinon(si elle n'existe pas), je souhaite l'ajouter. Mais après avoir essayer différentes manières, je n'y parviens pas.
Voici mon bout de vba en question :
Sub savecom()
'COMMENTAIRES SAVE +
Dim Lp As Long
Dim Lp1 As Long
Dim II As Byte
Dim JJ As Byte
Worksheets("Feuil1").Select
'lIGNE
For Lp = 9 To Range("B65536").End(xlUp).Row
For II = 5 To 7
For JJ = 10 To 12
If Cells(Lp, "B") Like ComboBox1 Then
'"Textbox" & I
Cells(Lp, "C").Value = Me.Controls("TextBox" & II).Value
Cells(Lp, "D").Value = Me.Controls("TextBox" & JJ).Value
End If
Next JJ
Next II
Next Lp
End Subavec le fichier:
vinny
Salut vinny et le forum
Mon transcodeur pour Excel 2003 faisant des siennes, je réponds juste sur le principe.
Ce que je comprends :
- Tu saisies des données sur un USF. Quand tu valides, tu veux que :
- Si la Combox1 existe en B => mettre les données à la place en...
- Si la Combobox1 n'existe pas en B, créer une nouvelle entrée en B
Je sais que tu as donné un fichier d'essais, mais comme je ne peux pas l'ouvrir, je me suis rabattu sur ta macro...
Ma signature est assez explicite
Pour t'aider, il faut qu'on comprenne ce qu'elle est supposée faire, et c'est pas en décodant une macro qui ne fonctionne pas qu'on peut y arriver !
Ta macro :
Quelque soit le B trouvé on applique :
Cells(Lp, "C").Value = Me.Controls("TextBox" & II).ValueAvec II évoluant de 5 à 7. Comme Cells(Lp, "C") n'évolue pas, les 3 infos se retrouvent successivement en C, et donc ta valeur finale en CLp sera TextBox7
Faire une double boucle ne sert qu'à te ralentir : II et JJ étant utilisé indépendamment l'un de l'autre (sans tenir compte des autres erreurs de la macro), je pense que
For X = 5 To 7
If Cells(Lp, "B") Like ComboBox1 Then
Cells(Lp, "C").Value = Me.Controls("TextBox" & X).Value
Cells(Lp, "D").Value = Me.Controls("TextBox" & X + 5).Value
End If
Next XSerait plus efficace (à condition que Cells(Lp, C/D) évolue) : un seule boucle, et pas de réinscription.
Pour le reste, n'ayant pas d'exemple, juste des idées :
- rechercher la valeur de combobox1 dans B (méthode Find)
- si elle existe renseigner Lp
- Si elle n'existe pas la créer et renseigner Lp
- renseigner les colonnes/lignes adéquates par une (seule) boucle.
- effacer/ré-initialiser l'USF
bonsoir,
@ Gorfael : Il ne s'agissait que une partie du code, pour le reste :
- dans mon userform, je sélectionne un nom dans une combobox1, dont les valeurs se situent en B.
- J'ai 3 cases pour commentaires positifs et 3 cases pour commentaires négatifs, qui se remplisent -> fonctionne bien
- Je modifie ou non ou ajoute des valeurs dans les textbox (qui affichent les commentaires existants), et souhaite les enregistrer dans le tableau!
@Banzai64 : J'ai changer avec ton code, qui fonctionne partiellement...
En effet, quand je selectionne "A" et modifie les commentaires, cela fonctionne (car il y a déja 3 lignes "A" dans le tableau)
Mais quand je selectionne "B" et modifie les commentaires, seuls les 2 premières lignes se modifient ( car il y a que 2 "B" dans le tableau)
Il faudrait donc une condition supplémentaire qui enregistre en dessous du tableau existant s'il n'y a a pas 3 lignes dans le tableau!?
le code complet avec modification de Banzai64 :
Option Explicit
Dim Init As Boolean
Private Sub ComboBox1_Change()
Dim NomSTCom As String
Dim Com As Range
Dim i As Byte
If Init = True Then Exit Sub
'--- tri ---
'Sheets("Feuil1").Select
' Range("b9:b" & [b65000].End(xlUp).Row).Sort Key1:=Range("b9"), Order1:=xlAscending, _
' Header:=xlYes, OrderCustom:=1, MatchCase:=False
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
On Error Resume Next ' Utile car manque les TextBox 8 et 9
For i = 5 To 12
Me.Controls("Textbox" & i) = ""
Next i
On Error GoTo 0
NomSTCom = Me.ComboBox1.Value
With Sheets("Feuil1")
Set Com = .Columns(2).Find(NomSTCom, LookIn:=xlValues, LookAt:=xlWhole)
If Not Com Is Nothing Then
'premier commentaire positif sur le sous traitant selectionnée dans la liste
TextBox5 = .Cells(Com.Row, "C")
TextBox10 = .Cells(Com.Row, "D")
'deuxième commentaire positif sur le sous traitant selectionnée dans la liste
If .Range("B" & Com.Row).Offset(1, 0) = NomSTCom Then
TextBox6 = .Cells(Com.Row, "C").Offset(1, 0)
TextBox11 = .Cells(Com.Row, "D").Offset(1, 0)
End If
'troisième commentaire positif sur le sous traitant selectionnée dans la liste
If .Range("B" & Com.Row).Offset(2, 0) = NomSTCom Then
TextBox7 = .Cells(Com.Row, "C").Offset(2, 0)
TextBox12 = .Cells(Com.Row, "D").Offset(2, 0)
End If
End If
End With
End Sub
'ENREGISTREMENT NOTES & COM
Private Sub CommandButton1_Click()
savecom
Unload Me
End Sub
Sub savecom()
'COMMENTAIRES SAVE +
Dim NomSTCom As String
Dim Com As Range
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
NomSTCom = Me.ComboBox1.Value
With Sheets("Feuil1")
Set Com = .Columns(2).Find(NomSTCom, LookIn:=xlValues, LookAt:=xlWhole)
If Not Com Is Nothing Then
'premier commentaire positif sur le sous traitant selectionnée dans la liste
.Cells(Com.Row, "C") = TextBox5
.Cells(Com.Row, "D") = TextBox10
'deuxième commentaire positif sur le sous traitant selectionnée dans la liste
If .Range("B" & Com.Row).Offset(1, 0) = NomSTCom Then
.Cells(Com.Row, "C").Offset(1, 0) = TextBox6
.Cells(Com.Row, "D").Offset(1, 0) = TextBox11
End If
'troisième commentaire positif sur le sous traitant selectionnée dans la liste
If .Range("B" & Com.Row).Offset(2, 0) = NomSTCom Then
.Cells(Com.Row, "C").Offset(2, 0) = TextBox7
.Cells(Com.Row, "D").Offset(2, 0) = TextBox12
End If
End If
End With
'Dim Lp As Long
'Dim Lp1 As Long
'Dim II As Byte
'Dim JJ As Byte
'
'Worksheets("Feuil1").Select
''lIGNE
'For Lp = 9 To Range("B65536").End(xlUp).Row
' For II = 5 To 7
' For JJ = 10 To 12
'
' If Cells(Lp, "B") Like ComboBox1 Then
'
' '"Textbox" & I
' Cells(Lp, "C").Value = Me.Controls("TextBox" & II).Value
' Cells(Lp, "D").Value = Me.Controls("TextBox" & JJ).Value
' End If
'Next JJ
'Next II
'Next Lp
End Sub
'INITIALIZE
'INITIALIZE
'INITIALIZE
'INITIALIZE
'INITIALIZE
Private Sub UserForm_Initialize()
'Macro Dan : liste ST
Dim J As Long
Init = True
With Sheets("Feuil1")
For J = 9 To .Range("B" & Rows.Count).End(xlUp).Row
Me.ComboBox1 = .Range("B" & J)
If Me.ComboBox1.ListIndex = -1 Then
Me.ComboBox1.AddItem .Range("B" & J) ' On note sa valeur
End If
Next J
End With
Me.ComboBox1.ListIndex = -1
Init = False
End SubVinny