Un code plus.... propre

theflolyon Messages postés 11 Date d'inscription mardi 8 juillet 2008 Statut Membre Dernière intervention 27 février 2010 - 21 juil. 2008 à 11:04
zen69 Messages postés 584 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 29 avril 2010 - 21 juil. 2008 à 18:17
Bonjour a tous

Une petite question de boucle
j'ai actuellement un code qui me permet de remplir une suite de Textbox en fonction de coordonnées de cellules Excel.
        TextBox_a.Text = Cells(i + 2, 1)
        Textbox_b.Text = Cells(i + 2, 2)
        Textbox_c.Text = Cells(i + 2, 3)
        TextBox_d.Text = Cells(i + 2, 4)
        TextBox_e.Text = Cells(i + 2, 5)
        TextBox_f.Text = Cells(i + 2, 6)
        TextBox_g.Text = Cells(i + 2, 7)
        TextBox_h.Text = Cells(i + 2, 8)
        TextBox_i.Text = Cells(i + 2, 9)
        TextBox_j.Text = Cells(i + 2, 10)
        TextBox_k.Text = Cells(i + 2, 11)
        TextBox_l.Text = Cells(i + 2, 12)
        TextBox_m.Text = Cells(i + 2, 13)
        TextBox_n.Text = Cells(i + 2, 14)
        TextBox_o.Text = Cells(i + 2, 15)
        TextBox_p.Text = Cells(i + 2, 16)
        TextBox_q.Text = Cells(i + 2, 17)
        TextBox_r.Text = Cells(i + 2, 18)
        TextBox_s.Text = Cells(i + 2, 19)
        TextBox_t.Text = Cells(i + 2, 20)
        TextBox_u.Text = Cells(i + 2, 21)
        TextBox_v.Text = Cells(i + 2, 22)
        TextBox_w.Text = Cells(i + 2, 23)
        TextBox_x.Text = Cells(i + 2, 24)
        TextBox_y.Text = Cells(i + 2, 25)
        TextBox_z.Text = Cells(i + 2, 26)
        TextBox_aa.Text = Cells(i + 2, 27)
        TextBox_ab.Text = Cells(i + 2, 28)
        TextBox_ac.Text = Cells(i + 2, 29)

Vous en conviendrez, c'est un peu ... fastidieux. d'ou l'idée d'une boucle.
J'ai donc renommé mes Textbox de Textbox_A en Textbox1, Textbox_B en Textbox2, ect ect

Puis remplacer le code précédent par une boucle For Next
      For t = 1 to 29

            TextBox(t).Text = Cells(i + 2, t)
      Next t
Mais cela ne marche pas.

et je ne comprend pas pourquoi.
J'ai testé avec la
syntaxe TextBox &t.Text = Cells(i + 2, t)et meme
TextBox (&t).Text = Cells(i + 2, t)



... Toujours apprendre, jamais dépendre ...

14 réponses

youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
21 juil. 2008 à 11:12
qu'est ce qui ne fonctionne pas donne nous un message d'erreur

test un truc dans le genre, a toi de gérer tes indices.

For Each ctl As Control In Me.Controls
        If TypeOf ctl Is TextBox Then
           ctl.Text=Cells(indice,indice)
        end if
next

@+
youpi :)
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 juil. 2008 à 11:19
faisable, youpiyoyo, oui,
en testant le début du nom du controle ("TextBox_")
et en déduisant l'indice en fonction du _a _b _aa, etc (calcul simple)
0
theflolyon Messages postés 11 Date d'inscription mardi 8 juillet 2008 Statut Membre Dernière intervention 27 février 2010
21 juil. 2008 à 11:29
Alors pour répondre au post de Youpi :
l'erreur générée est : "erreur de compilation Sub ou Function non définie" en me surlignant textbox(t)
dans ma boucle.

de plus j'ai testé ton code, et cela ne marche pas en l'état. en fait il ne valide pas le code suivant (écrit en rouge)
For Each ctl As Control In Me.Controls

J'ai testé avec la syntaxe suivante
For Each ctl As Control In Userform1

marche pas non plus
... Toujours apprendre, jamais dépendre ...
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
21 juil. 2008 à 11:36
désolé alors, ce code fonctionne avec vb.net, en .net TextBox(indice) ne fonctionne pas.
si tu les noms de tes textbox sont textbox1, textbox2,etc...
pourquoi tu ne ferais pas:
dim txtName as string = "textbox"
for i as int16=0 to 29
me.controls(txtName+trim(val(i))).text=cells(indice,i)
next

tu peux essayer un trycast aussi
je prefere largement ma premiere solution, je trouve ca casse gue**e cette solution, regarde en vb6 ce qui est possible.

youpi :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
theflolyon Messages postés 11 Date d'inscription mardi 8 juillet 2008 Statut Membre Dernière intervention 27 février 2010
21 juil. 2008 à 11:40
Pardon mais ce code est un code VBA sous excel. pas VB.net
Je ne comprenais pas votre "me.controls"

... Toujours apprendre, jamais dépendre ...
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 juil. 2008 à 11:41
YoupiYoyo, tu exagères !

tu files pas du code tout pret a coller, faut que theflolyon reflechisse et l'adapte !
ah non, vraiment, là...

bon, evidemment, je suis ironique...
tu as toutes les billes pour oeuvrer, thefloyon, remontes tes manches...

"... Toujours apprendre, jamais dépendre ..."
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 juil. 2008 à 11:42
salut,

tu peux te faire une petite routine, du genre....

Private Function GetIndexTB(ByRef oTB As Object) As Integer
    If LenB(oTB.Name) > 14 Then
        If LeftB$(oTB.Name, 14) = "TextBox" Then
            GetIndexTB = MidB(oTB.Name, 15)
        End If
    End If
End Function

et tu boucles avec each, du genre...

Dim oCtrl As Object, iIndex As Integer, iRow As Integer
iRow = i + 2
For Each oCtrl In Me.Controls
    If TypeOf oCtrl Is TextBox Then
        iIndex = GetIndexTB(oCtrl)
        If (iIndex > 0) And (iIndex < 30) Then
oCtrl.Text = Cells(iRow, iIndex)
    End If
Next oCtrl
Set oCtrl = Nothing

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
0
crn_c21 Messages postés 302 Date d'inscription samedi 24 janvier 2004 Statut Membre Dernière intervention 4 février 2011
21 juil. 2008 à 11:42
As-tu mis l'index de ton textbox à 0?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 juil. 2008 à 11:46
pas d'index en VBA...

j'avais préparé du code, en parallèle de PCPT...
tant pis, je le place quand même ^^


Private Sub CommandButton1_Click()
Dim oCtl As Object
Dim nCol As Long
Dim sKey As String
'# On enumére les controles, un par un
For Each oCtl In Me.Controls
'# On ne consière que les TextBoxes
If TypeOf oCtl Is MsForms.TextBox Then
'# On teste le début du nom du controle
If Left$(oCtl.Name, 8) = "TextBox_" Then
'# Ce qui suit, dans le nom, est l'indice de la colonne à lire
sKey = Mid$(UCase$(oCtl.Name), 9)
'# On calcule l'indice de la colonne concernée
nCol = Asc(sKey) - 64
If Len(sKey) = 2 Then
nCol = nCol * 26 + Asc(Mid$(sKey, 2, 1)) - 64
End If
'# au final, on place dans le textbox la valeur lue dans la ligne active
'# et de la colonne dont on vient de calculer l'indice
oCtl.Text = Cells(Selection.Row, nCol)
End If
End If
Next oCtl
End Sub
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 juil. 2008 à 11:56
crn_c21
->
non, pas d'index en VBA

Renfield ->
J'ai donc renommé mes Textbox de Textbox_A en Textbox1, Textbox_B en Textbox2, ect ect
il n'y a plus de "_"

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
0
crn_c21 Messages postés 302 Date d'inscription samedi 24 janvier 2004 Statut Membre Dernière intervention 4 février 2011
21 juil. 2008 à 11:58
J'avais aps tout lu mille excuses
0
zen69 Messages postés 584 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 29 avril 2010 1
21 juil. 2008 à 16:58
En fait tes text box sont mal nommé... pour rendre le tout plus propre tu deverais utilisé le meme nom  pour chaque textbox et attribuer un index a chaque text box... qui correpond a une ligne dans excel

de sorte que textBox(index</gras>rownumber)

Comme ca tu peux faire une boucle facilement et proprement

<hr size="2" width="100%" />  zen69 aka Ortho Le Profett
  [site web]
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 juil. 2008 à 17:02
je repète : pas de groupes de controles en VBA !
0
zen69 Messages postés 584 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 29 avril 2010 1
21 juil. 2008 à 18:17
on s'en fou puisque les groupes de controles sont du coté vb... non ?

<hr size="2" width="100%" />  zen69 aka Ortho Le Profett
  [site web]
0
Rejoignez-nous