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

Rechercher des sujets similaires à "simplifier ecriture boucle textbox combo"