VBA Double boucle for avec incrémentation combiné

Bonjour,

Après pas mal de recherche, je ne trouve pas de solution :

Je cherche à faire une double boucle for (donc avec 2 variables) qui s'incrémentent en même temps à chaque tour.

Autrement-dit : Si "i" et "y" sont mes variables, i=1 et y=10, au prochain tour : i=2 et y=11, i=3 et y=12 etc.

Donc mon cas : J'ai un tableau avec des textbox (de 1 à 84) qui remplir une feuille.

image

Voici le code qui remplir mes textbox selon les valeurs des cellules (et j'ai le même code qui fait l'inverse, qui copie les valeurs de textbox dans les cellules).

Evidement c'est pas optimale et je souhaite le faire par des boucles.

Une idée svp ? :)

Private Sub UserForm_Initialize()
Dim i As Integer
Dim ws_elec, ws_gaz, ws_eau As Worksheet

Set ws_elec = Worksheets("3.1 ELEC")
Set ws_gaz = Worksheets("3.2 GAZ")
Set ws_eau = Worksheets("3.3 EAU")

With ws_elec
    'conso ELEC
    TextBox1 = .Cells(9, "E").Value
    TextBox2 = .Cells(10, "E").Value
    TextBox3 = .Cells(11, "E").Value
    TextBox4 = .Cells(12, "E").Value
    TextBox5 = .Cells(13, "E").Value
    TextBox6 = .Cells(14, "E").Value
    TextBox7 = .Cells(15, "E").Value
    TextBox8 = .Cells(16, "E").Value
    TextBox9 = .Cells(17, "E").Value
    TextBox10 = .Cells(18, "E").Value
    TextBox11 = .Cells(19, "E").Value
    TextBox12 = .Cells(20, "E").Value
    'Cout ELEC
    TextBox13 = .Cells(9, "P").Value
    TextBox14 = .Cells(10, "P").Value
    TextBox15 = .Cells(11, "P").Value
    TextBox16 = .Cells(12, "P").Value
    TextBox17 = .Cells(13, "P").Value
    TextBox18 = .Cells(14, "P").Value
    TextBox19 = .Cells(15, "P").Value
    TextBox20 = .Cells(16, "P").Value
    TextBox21 = .Cells(17, "P").Value
    TextBox22 = .Cells(18, "P").Value
    TextBox23 = .Cells(19, "P").Value
    TextBox24 = .Cells(20, "P").Value
End With

With ws_gaz
    'conso GAZ
    TextBox25 = .Cells(9, "F").Value
    TextBox26 = .Cells(10, "F").Value
    TextBox27 = .Cells(11, "F").Value
    TextBox28 = .Cells(12, "F").Value
    TextBox29 = .Cells(13, "F").Value
    TextBox30 = .Cells(14, "F").Value
    TextBox31 = .Cells(15, "F").Value
    TextBox32 = .Cells(16, "F").Value
    TextBox33 = .Cells(17, "F").Value
    TextBox34 = .Cells(18, "F").Value
    TextBox35 = .Cells(19, "F").Value
    TextBox36 = .Cells(20, "F").Value
    'Cout GAZ
    TextBox37 = .Cells(9, "T").Value
    TextBox38 = .Cells(10, "T").Value
    TextBox39 = .Cells(11, "T").Value
    TextBox40 = .Cells(12, "T").Value
    TextBox41 = .Cells(13, "T").Value
    TextBox42 = .Cells(14, "T").Value
    TextBox43 = .Cells(15, "T").Value
    TextBox44 = .Cells(16, "T").Value
    TextBox45 = .Cells(17, "T").Value
    TextBox46 = .Cells(18, "T").Value
    TextBox47 = .Cells(19, "T").Value
    TextBox48 = .Cells(20, "T").Value
    'DJU
    TextBox49 = .Cells(9, "I").Value
    TextBox50 = .Cells(10, "I").Value
    TextBox51 = .Cells(11, "I").Value
    TextBox52 = .Cells(12, "I").Value
    TextBox53 = .Cells(13, "I").Value
    TextBox54 = .Cells(14, "I").Value
    TextBox55 = .Cells(15, "I").Value
    TextBox56 = .Cells(16, "I").Value
    TextBox57 = .Cells(17, "I").Value
    TextBox58 = .Cells(18, "I").Value
    TextBox59 = .Cells(19, "I").Value
    TextBox60 = .Cells(20, "I").Value
End With

With ws_eau
    'conso EAU
    TextBox61 = .Cells(9, "D").Value
    TextBox62 = .Cells(10, "D").Value
    TextBox63 = .Cells(11, "D").Value
    TextBox64 = .Cells(12, "D").Value
    TextBox65 = .Cells(13, "D").Value
    TextBox66 = .Cells(14, "D").Value
    TextBox67 = .Cells(15, "D").Value
    TextBox68 = .Cells(16, "D").Value
    TextBox69 = .Cells(17, "D").Value
    TextBox70 = .Cells(18, "D").Value
    TextBox71 = .Cells(19, "D").Value
    TextBox72 = .Cells(20, "D").Value
    'Cout EAU
    TextBox73 = .Cells(9, "N").Value
    TextBox74 = .Cells(10, "N").Value
    TextBox75 = .Cells(11, "N").Value
    TextBox76 = .Cells(12, "N").Value
    TextBox77 = .Cells(13, "N").Value
    TextBox78 = .Cells(14, "N").Value
    TextBox79 = .Cells(15, "N").Value
    TextBox80 = .Cells(16, "N").Value
    TextBox81 = .Cells(17, "N").Value
    TextBox82 = .Cells(18, "N").Value
    TextBox83 = .Cells(19, "N").Value
    TextBox84 = .Cells(20, "N").Value
End With
End Sub

Si je fais par exemple : ça remplis tous les premiers textbox avec la valeur de la première cellule, en gros pas ce que je souhaite..

for i = 1 To 12
for y = 9 To 20
TextBox & "i" ) .Cells(y, "E").Value
Next y
Next i

Bonjour,

Fournir un classeur ayant au moins le UserForm SVP. Pas vraiment besoin des feuilles.

Sinon tu peux tenter un truc comme ça :

Private Sub UserForm_Initialize()
Dim i As Integer
Dim ArrE, ArrG, ArrW

ArrE = Worksheets("3.1 ELEC").Range("E9:P20").Value
ArrG = Worksheets("3.2 GAZ").Range("F9:T20").Value
ArrW = Worksheets("3.3 EAU").Range("D9:N20").Value
    'conso ELEC
    For i = 1 To 12
    Me.Controls("TextBox" & i) = ArrE(i, 1)
    Next
    'Cout ELEC
    For i = 1 To 12
    Me.Controls("TextBox" & i + 12) = ArrE(i, 12)
    Next

    'conso GAZ
    For i = 1 To 12
    Me.Controls("TextBox" & i + 24) = ArrG(i, 1)
    Next
    'Cout GAZ
    For i = 1 To 12
    Me.Controls("TextBox" & i + 36) = ArrG(i, 15)
    Next
    'DJU
    For i = 1 To 12
    Me.Controls("TextBox" & i + 36) = ArrG(i, 4)
    Next
    'conso EAU
    For i = 1 To 12
    Me.Controls("TextBox" & i + 36) = ArrW(i, 1)
    Next
    'Cout EAU
    For i = 1 To 12
    Me.Controls("TextBox" & i + 72) = ArrW(i, 11)
    Next
End Sub

A+

Bonjour Fafe93,

Tu peux essayer cela :

Private Sub UserForm_Initialize()
Dim nIWS As Integer
Dim wsConso As Worksheet
Dim avInfos As Variant
Dim nICtrl As Integer
Dim nRefCol As Integer
Dim nLig As Long
   ' Tableau permettant un traitement itératif (une dimension par onglet : nom de l'onglet, refs des colonnes)
   avInfos = Array(Array("3.1 ELEC", "E", "P"), Array("3.2 GAZ", "F", "T", "I"), Array("3.3 EAU", "D", "N"))
   ' Init de la référence du contrôle
   nICtrl = 0
   ' Boucle sur les onglets
   For nIWS = 0 To 2
      ' Init de l'onglet
      Set wsConso = Worksheets(avInfos(nIWS)(0))
      ' Boucle sur les références de colonnes
      For nRefCol = 1 To UBound(avInfos(nIWS))
         ' Boucle sur les lignes
         For nLig = 9 To 20
            ' Incrémentation du  n° de contrôle
            nICtrl = nICtrl + 1
            ' Initialisation de la valeur du contrôle
            Me.Controls("TextBox" & nICtrl).Value = wsConso.Cells(nLig, avInfos(nIWS)(nRefCol)).Value
         Next
      Next
   Next
End Sub

Cdlt,

Cylfo

Voilà le fichier en question,

J'ai essayer vos réponses mais ça n'écrit pas dans les cases.

15a3-pilotage-site.xlsm (204.00 Ko)

L'exemple que tu donnais ne faisait qu'écrire dans les TextBox (ce que fait le code que je t'ai communiqué) et il n'y avait aucune indication sur la manière dont était déclenchée la mise à jour des feuilles ...

Voir fichier ci-joint, la procédure est identique, seule ligne qui alimente les TextBox / Cellules est inversée.

Génial merci pour vos réponses rapides !

Autre question, pour le format des textbox, j'ai trouvé ce code :

Private Sub TextBox1_Change()
TextBox1 = Format(TextBox1, "# ### ##0")
End Sub

C'est possible de mettre une boucle aussi sur le "Private Sub TextBox" ? L'idée est de mettre les textbox au format avec millier.

Non, pas de boucle, il faudrait écrire 84 fois les procédures TextBoxN_Change ... Je te propose une solution qui n'impacte pas trop ton code :

  • Création d'un module de classe "TxtBoxNum" dérivant le contrôle TextBox en TextBoxNum avec les procédure Change (pour le formatage) et KeyPress (pour le contrôle des saisies => 0 à 9).
  • Création d'une pseudo collection dans le module1
  • Modification de la procédure Initialize du UserForm pour recenser les contrôle TextBox dans la pseudo-collection
  • Dès que tu saisis dans un TextBox, il est formaté.

Attention : j'ai fait simple et considéré que tous les TextBox du formulaire devaient être formatés en numérique entier. Si tu ajoutes des textbox, il faudra modifier le recensement dans la procédure Initialize pour, par exemple, ne prendre en compte que les TextBox numérotés de 1 à 84.

J'ai modifié la procédure "CommandButton1_Click" wsConso.Cells(nLig, avInfos(nIWS)(nRefCol)).Value = CLng(Me.Controls("TextBox" & nICtrl).Value) pour ajouter la transformation en numérique "CLng( )" du contenu des textbox, je l'avais zappé.

Cdlt,

Cylfo

Eh bien merci pour ton aide ! ça répond parfaitement à ma demande, je vais étudier le code pour en apprendre davantage.

Rechercher des sujets similaires à "vba double boucle incrementation combine"