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.
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 SubSi 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 iBonjour,
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 SubA+
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 SubCdlt,
Cylfo
Voilà le fichier en question,
J'ai essayer vos réponses mais ça n'écrit pas dans les cases.
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 SubC'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.