Simplifier l'écriture avec boucle (textbox et combo)
Bonjour,
Je me permets une nouvelle question de débutant, en vue d'améliorer ma modeste pratique. J'ai créé un formulaire, me permettant d'alimenter un tableau excel. Mon formulaire me permet d'inscrire des données (correspondant à une nouvelle visite) et s'inscrivant directement dans une ligne de mon tableau.
J'ai peut-être fait une erreur au départ en renommant mes textbox ou mes combobox pour m'y retrouver. Et désormais, je souhaiterais faciliter ce code en créant une boucle.
Ma question est la suivante : faut-il que je renomme mes textbox et mes combox en textbox1, textbox2, etc ? Peut-on créer des boucles avec des controles différents (textbox ou combobox) ?
J'espère être assez clair. Vous trouverez ci-dessous le code.
Merci à vous de vos conseils,
Tom
'''''''''''''''''''''''''''''''''''''''''''
'Procédure permettant de valider les champs du formulaire, confirmer et quitter
'''''''''''''''''''''''''''''''''''''''''''
Private Sub Cmdbvalider_Click()
Sheets("Reservations 2017").Activate
Range("A6").Select
Selection.End(xlDown).Select 'On se positionne sur la dernière ligne non vide
Selection.Offset(1, 0).Select 'On se décale d'une ligne vers le bas
ActiveCell = TextBoxidentifiant
ActiveCell.Offset(0, 1).Value = Cbinstallation
ActiveCell.Offset(0, 2).Value = TextBoxDateconfirmee
ActiveCell.Offset(0, 3).Value = TextBoxhorairesdebut
ActiveCell.Offset(0, 4).Value = TextBoxhorairesfin
ActiveCell.Offset(0, 5).Value = TextBoxStructure
ActiveCell.Offset(0, 6).Value = Cbcollectivites
ActiveCell.Offset(0, 7).Value = Cbpublic
ActiveCell.Offset(0, 8).Value = TextBoxNbredepersonnes
ActiveCell.Offset(0, 9).Value = TextBoxAccompagnants
ActiveCell.Offset(0, 10).Value = CbVisite
ActiveCell.Offset(0, 11).Value = Cbanimateurs
ActiveCell.Offset(0, 12).Value = Cbpresenceds
ActiveCell.Offset(0, 13).Value = Cbtransport
ActiveCell.Offset(0, 14).Value = TextBoxNomprenom
ActiveCell.Offset(0, 15).Value = TextBoxFonction
ActiveCell.Offset(0, 16).Value = TextBoxcodepostal
ActiveCell.Offset(0, 17).Value = TextBoxVille
ActiveCell.Offset(0, 18).Value = TextBoxemail
ActiveCell.Offset(0, 19).Value = TextBoxTel
ActiveCell.Offset(0, 20).Value = Cbetatdemande
ActiveCell.Offset(0, 21).Value = TextBoxDatedemande
ActiveCell.Offset(0, 22).Value = TextBoxdatesouhaitee
ActiveCell.Offset(0, 23).Value = Cbsuiviepar
ActiveCell.Offset(0, 24).Value = TextBoxcommentaires
ActiveCell.Offset(0, 25).Value = TextBoxtravailamont
ActiveCell.Offset(0, 26).Value = Cbinfopar
ActiveCell.Offset(0, 27).Value = TextBoxduree
ActiveCell.Offset(0, 28).Value = TextBoxcontactcollectivites
Unload Frmajout
MsgBox "Cette demande de visite a bien été ajoutée", vbOKOnly + vbInformation, "CONFIRMATION D'AJOUT"
End Sub
Bonjour,
Tu n'est pas obligé de renommer tous tes contrôles.
L'astuce consiste à utiliser la propriété Tag pour trans mettre des information à ta procédure.
Mets dans le Tag de chaque contrôle, le numéro de colonne (de 1 à 28)
Et essaies ce code
Private Sub Cmdbvalider_Click()
Dim ctl As Control
Dim cel As Range
Set cel = Worksheets("Reservations 2017").Range("A" & Rows.Count).End(xlUp).Offset(1)
For Each ctl In Me.Controls
If IsNumeric(ctl.Tag) Then
cel.Offset(0, CInt(ctl.Tag) - 1).Value = ctl.Value
End If
Next
Unload Frmajout
MsgBox "Cette demande de visite a bien été ajoutée", vbOKOnly + vbInformation, "CONFIRMATION D'AJOUT"
End Sub
Merci beaucoup, Patrice. J'ai tardé à vous répondre.
Je cherche désormais une solution pour créer une même boucle pour modifier les données d'une ligne excel, en recherchant une ligne à partir de la valeur de la colonne A (textboxidentifiant). Pas évident de s'y retrouver parmi les nombreuses solutions proposées sur les forums.
Bonjour,
Tu peux utiliser le même principe que pour tes contrôles :
Private Sub CmdbXxxx_Click()
Dim rng As Range
Dim cel As Range
With Worksheets("Reservations 2017")
Set cel = .Range("A" & Rows.Count).End(xlUp)
Set rng = .Range("A2", cel)
End With
For Each cel In rng.Cells
If cel.Value = TextBoxidentifiant.Value Then
' Ici la modification
' par exemple :
cel.Offset(0, 2).Value = "Ok"
Else
cel.Offset(0, 2).Value = "Pas Ok"
'...
End If
Next
End Sub
Bonjour Patrice,
J'ai à nouveau pris le temps de te répondre, car j'ai essayé plusieurs formules, mais je n'ai pas eu le succès attendu.
Voilà mon dernier essai de code, qui ne fonctionne pas.
Je suis à nouveau preneur de bons conseils. Merci d'avance.
'''''''''''''''''''''''''''''''''''''''''''
'Procédure permettant de charger les données d'une ligne excel à partir d'un identifiant
'''''''''''''''''''''''''''''''''''''''''''
Private Sub ComboBoxrechercheidentifiant_Change()
Dim Lg As Long
Dim Ctl As Control
Dim Cell As Range
Set Cell = Worksheets("Reservations 2017").Range("A" & Rows.Count).End(xlUp).Offset(1)
Lg = ComboBoxrechercheidentifiant.ListIndex + 6
For Each Ctl In Me.Controls
If Ctl.Tag > "1" Then
Ctl.Value = Cell.Ws.Range(Ctl.Tag & Lg)
End If
Next
End Sub
Bonjour,
Sans le fichier et toutes les macro, la réponse tient un peu du hasard !
Mais peut-être qu'au lieu de cette syntaxe qui me parait erronée :
Ctl.Value = Cell.Ws.Range(Ctl.Tag & Lg)
ça marcherait avec :
Ctl.Value = Cell.Parent.Cells(Lg, Ctl.Tag).Value
Mais ce n'est pas la bonne solution, il me semble qu'il serait aussi préférable de rechercher l'identifiant dans la colonne (avec Find) plutôt que d'utiliser le ListIndex du ComboBox,, il suffirait alors de faire :
Ctl.Value = Cell.Offset(0, Ctl.Tag-1).Value
Effectivement, il est préférable que je transmette le fichier en question.
Le voici en pièce jointe. J'ai retiré les données (noms...) en ne gardant que quelques lignes pour l'exemple.
C'est peut-être un peu de la bidouille, j'en conviens.
Merci.
Re,
Voici le code proposé :
Private Sub ComboBoxrechercheidentifiant_Change()
Dim Ctl As Control
Dim Rng As Range
Dim Cel As Range
Dim Id As String
With Worksheets("Reservations 2017")
Set Cel = .Range("A" & Rows.Count).End(xlUp)
Set Rng = .Range("A2", Cel)
End With
Id = ComboBoxrechercheidentifiant.Value
Set Cel = Rng.Find(Id, , xlValues, xlWhole)
If Not Cel Is Nothing Then
For Each Ctl In Me.Controls
If Ctl.Tag > "1" Then
Ctl.Value = Cel.Offset(0, Ctl.Tag - 1).Value
End If
Next
End If
End Sub
Merci Patrice.
Ce code marche très bien. Cela me permet de rapatrier mes données d'une ligne excel dans l'userform. Par contre, je souhaiterais désormais pouvoir modifier ces données et les replacer dans la même ligne d'origine. J'ai repris la même idée que ci-dessus, mais ca ne marche pas.
Quoi qu'il en soit , merci du coup de main.
'''''''''''''''''''''''''''''''''''''''''''
'Procédure permettant de modifier les données d'une ligne excel
'''''''''''''''''''''''''''''''''''''''''''
Private Sub Cmdmodification_Click()
Dim Rng As Range
Dim Cel As Range
Dim ctl As Control
Dim Id As String
With Worksheets("Reservations 2017")
Set Cel = .Range("A" & Rows.Count).End(xlUp)
Set Rng = .Range("A6", Cel)
End With
Id = ComboBoxrechercheidentifiant.Value
Set Cel = Rng.Find(Id, , xlValues, xlWhole)
If Not Cel Is Nothing Then
For Each ctl In Me.Controls
Cel.Offset(0, ctl.Tag - 1).Value = ctl.Value
Next
End If
End Sub
Re,
Il fallait reprendre le même code et charger uniquement l'affectation des valeurs :
Private Sub Cmdmodification_Click()
Dim Rng As Range
Dim Cel As Range
Dim ctl As Control
Dim Id As String
With Worksheets("Reservations 2017")
Set Cel = .Range("A" & Rows.Count).End(xlUp)
Set Rng = .Range("A6", Cel)
End With
Id = ComboBoxrechercheidentifiant.Value
Set Cel = Rng.Find(Id, , xlValues, xlWhole)
If Not Cel Is Nothing Then
For Each ctl In Me.Controls
If ctl.Tag > "1" Then
Cel.Offset(0, ctl.Tag - 1).Value = ctl.Value
End If
Next
End If
Unload Me
End Sub
Bonjour,
Merci Patrice de ton aide. Ca fonctionne très bien.
Je clôture cette discussion