Parcours de controles

Le
elect31
Bonjour à tous
Dans le frame d'un userform, j'ai 40 controles divers et variés : 24
comboBox, 8 TextBox, 8 Label
Question : comment éviter de parcourir tous les controles du frame? Il
n'y a que les TextBox tagués "mains" qui m'interessent.
Dans le code ci dessous que j'utilise, Excel parcours tous les controles
jusqu'à ce qu'il en rencontre un tagué "mains".
N'y aurait il pas un moyen d'aller plus vite et de ne parcourir que les
TextBox?

With .Controls("FrameSeance" & CStr(i))
LaColonne = 0
For Each C In .Controls
If C.Tag = "mains" Then
C.Value = CStr(ThisWorkbook.Worksheets(date_seance). _
Range("CA5").Offset(laLigne, LaColonne).Value)
LaColonne = LaColonne + 1
End If
Next C
End With

PS: Ce code fonctionne. Je suis simplement en train d'essayer de
l'optimiser.

Merci de vos réponses
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Benoît Marchand [Benead]
Le #21366931
Bonjour,

Non à ma connaissance il n'est pas possible de parcourir uniquement les
TextBox.

Par contre tu peux remplacer avantageusement l'utilisation des Tag par
TypeName(C) :

Dim C As Control
For Each C In Controls
If TypeName(C) = "TextBox" Then
' ... Ton Code ...
End If
Next C

En terme de rapidité d'exécution, la différence entre 8 contrôles ou 40
sera imperceptiblee sauf si cette boucle est elle-même inclue dans une
ou plusieurs boucles et encore...

Benead
Excel 2000

elect31 a écrit :
Bonjour à tous
Dans le frame d'un userform, j'ai 40 controles divers et variés : 24
comboBox, 8 TextBox, 8 Label
Question : comment éviter de parcourir tous les controles du frame? Il
n'y a que les TextBox tagués "mains" qui m'interessent.
Dans le code ci dessous que j'utilise, Excel parcours tous les
controles jusqu'à ce qu'il en rencontre un tagué "mains".
N'y aurait il pas un moyen d'aller plus vite et de ne parcourir que
les TextBox?

With .Controls("FrameSeance" & CStr(i))
LaColonne = 0
For Each C In .Controls
If C.Tag = "mains" Then
C.Value =
CStr(ThisWorkbook.Worksheets(date_seance). _
Range("CA5").Offset(laLigne, LaColonne).Value)
LaColonne = LaColonne + 1
End If
Next C
End With

PS: Ce code fonctionne. Je suis simplement en train d'essayer de
l'optimiser.

Merci de vos réponses
Benoît Marchand [Benead]
Le #21366921
Bonjour,

Non à ma connaissance il n'est pas possible de parcourir uniquement les
TextBox.

Par contre tu peux remplacer avantageusement l'utilisation des Tag par
TypeName(C) :

Dim C As Control
For Each C In Controls
If TypeName(C) = "TextBox" Then
' ... Ton Code ...
End If
Next C

En terme de rapidité d'exécution, la différence entre 8 contrôles ou 40
sera imperceptiblee sauf si cette boucle est elle-même inclue dans une
ou plusieurs boucles et encore...

A+
Benead
Excel 2000

elect31 a écrit :
Bonjour à tous
Dans le frame d'un userform, j'ai 40 controles divers et variés : 24
comboBox, 8 TextBox, 8 Label
Question : comment éviter de parcourir tous les controles du frame? Il
n'y a que les TextBox tagués "mains" qui m'interessent.
Dans le code ci dessous que j'utilise, Excel parcours tous les
controles jusqu'à ce qu'il en rencontre un tagué "mains".
N'y aurait il pas un moyen d'aller plus vite et de ne parcourir que
les TextBox?

With .Controls("FrameSeance" & CStr(i))
LaColonne = 0
For Each C In .Controls
If C.Tag = "mains" Then
C.Value =
CStr(ThisWorkbook.Worksheets(date_seance). _
Range("CA5").Offset(laLigne, LaColonne).Value)
LaColonne = LaColonne + 1
End If
Next C
End With

PS: Ce code fonctionne. Je suis simplement en train d'essayer de
l'optimiser.

Merci de vos réponses
Benoît Marchand [Benead]
Le #21366911
Bonjour,

Non à ma connaissance il n'est pas possible de parcourir uniquement les
TextBox.

Par contre tu peux remplacer avantageusement l'utilisation des Tag par
TypeName(C) :

Dim C As Control
For Each C In Controls
If TypeName(C) = "TextBox" Then
' ... Ton Code ...
End If
Next C

En terme de rapidité d'exécution, la différence entre 8 contrôles ou 40
sera imperceptiblee sauf si cette boucle est elle-même inclue dans une
ou plusieurs boucles et encore...

A+
Benead
Excel 2000

elect31 a écrit :
Bonjour à tous
Dans le frame d'un userform, j'ai 40 controles divers et variés : 24
comboBox, 8 TextBox, 8 Label
Question : comment éviter de parcourir tous les controles du frame? Il
n'y a que les TextBox tagués "mains" qui m'interessent.
Dans le code ci dessous que j'utilise, Excel parcours tous les
controles jusqu'à ce qu'il en rencontre un tagué "mains".
N'y aurait il pas un moyen d'aller plus vite et de ne parcourir que
les TextBox?

With .Controls("FrameSeance" & CStr(i))
LaColonne = 0
For Each C In .Controls
If C.Tag = "mains" Then
C.Value =
CStr(ThisWorkbook.Worksheets(date_seance). _
Range("CA5").Offset(laLigne, LaColonne).Value)
LaColonne = LaColonne + 1
End If
Next C
End With

PS: Ce code fonctionne. Je suis simplement en train d'essayer de
l'optimiser.

Merci de vos réponses
Benoît Marchand [Benead]
Le #21367051
Bonjour,

Non à ma connaissance il n'est pas possible de parcourir uniquement les
TextBox.

Par contre tu peux remplacer avantageusement l'utilisation des Tag par
TypeName(C) :

Dim C As Control
For Each C In Controls
If TypeName(C) = "TextBox" Then
' ... Ton Code ...
End If
Next C

En terme de rapidité d'exécution, la différence entre 8 contrôles ou 40
sera imperceptiblee sauf si cette boucle est elle-même inclue dans une
ou plusieurs boucles et encore...

A+
Benead
Excel 2000

elect31 a écrit :
Bonjour à tous
Dans le frame d'un userform, j'ai 40 controles divers et variés : 24
comboBox, 8 TextBox, 8 Label
Question : comment éviter de parcourir tous les controles du frame? Il
n'y a que les TextBox tagués "mains" qui m'interessent.
Dans le code ci dessous que j'utilise, Excel parcours tous les
controles jusqu'à ce qu'il en rencontre un tagué "mains".
N'y aurait il pas un moyen d'aller plus vite et de ne parcourir que
les TextBox?

With .Controls("FrameSeance" & CStr(i))
LaColonne = 0
For Each C In .Controls
If C.Tag = "mains" Then
C.Value =
CStr(ThisWorkbook.Worksheets(date_seance). _
Range("CA5").Offset(laLigne, LaColonne).Value)
LaColonne = LaColonne + 1
End If
Next C
End With

PS: Ce code fonctionne. Je suis simplement en train d'essayer de
l'optimiser.

Merci de vos réponses
elect31
Le #21376651
Merci de ta réponse Benoit
Je peux remplacer Tag par TypeName à condition que tous les TextBox
soient concernés. Peut être que seulement certains TextBox (ceux que
j'ai tagué "mains") m'intéressent...
Sinon, effectivement, j'ai souvent plusieurs boucles imbriquées l'une
dans l'autre, d'où mon intention d'essayer d'accélérer le processus.

Bon, tant pis! Même si la réponse à ma question est négative, j'y aurai
au moins gagné la certitude que ce bout de code est optimisé... à moins
que quelqu'un d'autre ait une solution miracle comme certains peuvent
les trouver. Du genre, là où je mets 10 lignes de code, ils en mettent
1. Je suis autodidacte dans le domaine de la programmation, d'où mon
questionnement.
Encore merci à tous ceux qui lisent et qui répondent dans ce forum.

Benoît Marchand [Benead] a écrit :
Bonjour,

Non à ma connaissance il n'est pas possible de parcourir uniquement les
TextBox.

Par contre tu peux remplacer avantageusement l'utilisation des Tag par
TypeName(C) :

Dim C As Control
For Each C In Controls
If TypeName(C) = "TextBox" Then
' ... Ton Code ...
End If
Next C

En terme de rapidité d'exécution, la différence entre 8 contrôles ou 40
sera imperceptiblee sauf si cette boucle est elle-même inclue dans une
ou plusieurs boucles et encore...

Benead
Excel 2000

elect31 a écrit :
Bonjour à tous
Dans le frame d'un userform, j'ai 40 controles divers et variés : 24
comboBox, 8 TextBox, 8 Label
Question : comment éviter de parcourir tous les controles du frame? Il
n'y a que les TextBox tagués "mains" qui m'interessent.
Dans le code ci dessous que j'utilise, Excel parcours tous les
controles jusqu'à ce qu'il en rencontre un tagué "mains".
N'y aurait il pas un moyen d'aller plus vite et de ne parcourir que
les TextBox?

With .Controls("FrameSeance" & CStr(i))
LaColonne = 0
For Each C In .Controls
If C.Tag = "mains" Then
C.Value =
CStr(ThisWorkbook.Worksheets(date_seance). _
Range("CA5").Offset(laLigne, LaColonne).Value)
LaColonne = LaColonne + 1
End If
Next C
End With

PS: Ce code fonctionne. Je suis simplement en train d'essayer de
l'optimiser.

Merci de vos réponses
Benoît Marchand [Benead]
Le #21389281
Bonsoir,

Si tu tiens à optimiser ton code, tu dois utiliser une collection. Tu
fais une première boucle pour créer ta collection de TexBox
(généralement dans l'initialisation du UserForm), ensuite il te suffit
de faire appel a collection de TextBox que tu viens de créer. Cela donne
cela (à adapter) :

' Variable à déclarer en début du UserForm ou si besoin en Public dans
un module classique
Dim TextBoxGroup As New Collection



Private Sub CommandButton1_Click()
.../...
' Boucle interne à ton programme
Dim TxB As Control
For Each TxB In TextBoxGroup
' .../...
TxB.BackColor = &H8080FF
Next TxB
.../...
End Sub



Private Sub UserForm_Initialize()

' A ajouter dans UserForm_Initialize
Dim Ctrl As Control
' Création d'une collection de TextBox ayant "mains" en Tag
For Each Ctrl In Me.Controls
If TypeName(Ctrl) = "TextBox" And Ctrl.Tag = "mains" Then
TextBoxGroup.Add Ctrl
End If
Next Ctrl

End Sub


Si ton programme est gourmand en mémoire et du code s'exécute après le
traitement des TextBox, par exemple quand tu décharges l'Userform
(Unload), il serait judicieux de supprimer ta collection en ajoutant
cette ligne :
Set TextBoxGroup = Nothing

A+
Benead
Excel 2000

elect31 a écrit :
Merci de ta réponse Benoit
Je peux remplacer Tag par TypeName à condition que tous les TextBox
soient concernés. Peut être que seulement certains TextBox (ceux que
j'ai tagué "mains") m'intéressent...
Sinon, effectivement, j'ai souvent plusieurs boucles imbriquées l'une
dans l'autre, d'où mon intention d'essayer d'accélérer le processus.

Bon, tant pis! Même si la réponse à ma question est négative, j'y
aurai au moins gagné la certitude que ce bout de code est optimisé...
à moins que quelqu'un d'autre ait une solution miracle comme certains
peuvent les trouver. Du genre, là où je mets 10 lignes de code, ils en
mettent 1. Je suis autodidacte dans le domaine de la programmation,
d'où mon questionnement.
Encore merci à tous ceux qui lisent et qui répondent dans ce forum.

Benoît Marchand [Benead] a écrit :
Bonjour,

Non à ma connaissance il n'est pas possible de parcourir uniquement
les TextBox.

Par contre tu peux remplacer avantageusement l'utilisation des Tag
par TypeName(C) :

Dim C As Control
For Each C In Controls
If TypeName(C) = "TextBox" Then
' ... Ton Code ...
End If
Next C

En terme de rapidité d'exécution, la différence entre 8 contrôles ou
40 sera imperceptiblee sauf si cette boucle est elle-même inclue dans
une ou plusieurs boucles et encore...

Benead
Excel 2000

elect31 a écrit :
Bonjour à tous
Dans le frame d'un userform, j'ai 40 controles divers et variés : 24
comboBox, 8 TextBox, 8 Label
Question : comment éviter de parcourir tous les controles du frame?
Il n'y a que les TextBox tagués "mains" qui m'interessent.
Dans le code ci dessous que j'utilise, Excel parcours tous les
controles jusqu'à ce qu'il en rencontre un tagué "mains".
N'y aurait il pas un moyen d'aller plus vite et de ne parcourir que
les TextBox?

With .Controls("FrameSeance" & CStr(i))
LaColonne = 0
For Each C In .Controls
If C.Tag = "mains" Then
C.Value =
CStr(ThisWorkbook.Worksheets(date_seance). _
Range("CA5").Offset(laLigne, LaColonne).Value)
LaColonne = LaColonne + 1
End If
Next C
End With

PS: Ce code fonctionne. Je suis simplement en train d'essayer de
l'optimiser.

Merci de vos réponses
elect31
Le #21391201
Aaaaahhhh!
Je savais bien qu'il y aurait un magicien pour me sortir un truc que je
ne connaissais pas.
Je m'en va l'essayer tout de suite.
Bon! Quand tu dis optimiser ton code, tu entends bien le faire aller
plus vite? (Même si je sais que la différence ne sera pas forcément
visible à l'oeil).
En tous les cas merci de cet enseignement. J'en comprends la logique et
je vais voir ce que ça donne dans mon code.
elect

Benoît Marchand [Benead] a écrit :
Bonsoir,

Si tu tiens à optimiser ton code, tu dois utiliser une collection. Tu
fais une première boucle pour créer ta collection de TexBox
(généralement dans l'initialisation du UserForm), ensuite il te suffit
de faire appel a collection de TextBox que tu viens de créer. Cela donne
cela (à adapter) :

' Variable à déclarer en début du UserForm ou si besoin en Public dans
un module classique
Dim TextBoxGroup As New Collection



Private Sub CommandButton1_Click()
.../...
' Boucle interne à ton programme
Dim TxB As Control
For Each TxB In TextBoxGroup
' .../...
TxB.BackColor = &H8080FF
Next TxB
.../...
End Sub



Private Sub UserForm_Initialize()

' A ajouter dans UserForm_Initialize
Dim Ctrl As Control
' Création d'une collection de TextBox ayant "mains" en Tag
For Each Ctrl In Me.Controls
If TypeName(Ctrl) = "TextBox" And Ctrl.Tag = "mains" Then
TextBoxGroup.Add Ctrl
End If
Next Ctrl

End Sub


Si ton programme est gourmand en mémoire et du code s'exécute après le
traitement des TextBox, par exemple quand tu décharges l'Userform
(Unload), il serait judicieux de supprimer ta collection en ajoutant
cette ligne :
Set TextBoxGroup = Nothing

A+
Benead
Excel 2000

elect31 a écrit :
Merci de ta réponse Benoit
Je peux remplacer Tag par TypeName à condition que tous les TextBox
soient concernés. Peut être que seulement certains TextBox (ceux que
j'ai tagué "mains") m'intéressent...
Sinon, effectivement, j'ai souvent plusieurs boucles imbriquées l'une
dans l'autre, d'où mon intention d'essayer d'accélérer le processus.

Bon, tant pis! Même si la réponse à ma question est négative, j'y
aurai au moins gagné la certitude que ce bout de code est optimisé...
à moins que quelqu'un d'autre ait une solution miracle comme certains
peuvent les trouver. Du genre, là où je mets 10 lignes de code, ils en
mettent 1. Je suis autodidacte dans le domaine de la programmation,
d'où mon questionnement.
Encore merci à tous ceux qui lisent et qui répondent dans ce forum.

Benoît Marchand [Benead] a écrit :
Bonjour,

Non à ma connaissance il n'est pas possible de parcourir uniquement
les TextBox.

Par contre tu peux remplacer avantageusement l'utilisation des Tag
par TypeName(C) :

Dim C As Control
For Each C In Controls
If TypeName(C) = "TextBox" Then
' ... Ton Code ...
End If
Next C

En terme de rapidité d'exécution, la différence entre 8 contrôles ou
40 sera imperceptiblee sauf si cette boucle est elle-même inclue dans
une ou plusieurs boucles et encore...

Benead
Excel 2000

elect31 a écrit :
Bonjour à tous
Dans le frame d'un userform, j'ai 40 controles divers et variés : 24
comboBox, 8 TextBox, 8 Label
Question : comment éviter de parcourir tous les controles du frame?
Il n'y a que les TextBox tagués "mains" qui m'interessent.
Dans le code ci dessous que j'utilise, Excel parcours tous les
controles jusqu'à ce qu'il en rencontre un tagué "mains".
N'y aurait il pas un moyen d'aller plus vite et de ne parcourir que
les TextBox?

With .Controls("FrameSeance" & CStr(i))
LaColonne = 0
For Each C In .Controls
If C.Tag = "mains" Then
C.Value =
CStr(ThisWorkbook.Worksheets(date_seance). _
Range("CA5").Offset(laLigne, LaColonne).Value)
LaColonne = LaColonne + 1
End If
Next C
End With

PS: Ce code fonctionne. Je suis simplement en train d'essayer de
l'optimiser.

Merci de vos réponses
isabelle
Le #21392461
bonjour Elect,

une autre méthode est de vérifier son Parent

Private Sub CommandButton1_Click()
Dim c As Control
For Each c In Me.Controls
If TypeName(c) = "TextBox" And c.Parent.Name = "Frame1" Then
MsgBox c.Name
End If
Next c
End Sub

isabelle

Le 2010-03-17 07:06, elect31 a écrit :
Aaaaahhhh!
Je savais bien qu'il y aurait un magicien pour me sortir un truc que
je ne connaissais pas.
Je m'en va l'essayer tout de suite.
Bon! Quand tu dis optimiser ton code, tu entends bien le faire aller
plus vite? (Même si je sais que la différence ne sera pas forcément
visible à l'oeil).
En tous les cas merci de cet enseignement. J'en comprends la logique
et je vais voir ce que ça donne dans mon code.
elect

Benoît Marchand [Benead] a écrit :
Bonsoir,

Si tu tiens à optimiser ton code, tu dois utiliser une collection. Tu
fais une première boucle pour créer ta collection de TexBox
(généralement dans l'initialisation du UserForm), ensuite il te
suffit de faire appel a collection de TextBox que tu viens de créer.
Cela donne cela (à adapter) :

' Variable à déclarer en début du UserForm ou si besoin en Public
dans un module classique
Dim TextBoxGroup As New Collection



Private Sub CommandButton1_Click()
.../...
' Boucle interne à ton programme
Dim TxB As Control
For Each TxB In TextBoxGroup
' .../...
TxB.BackColor = &H8080FF
Next TxB
.../...
End Sub



Private Sub UserForm_Initialize()

' A ajouter dans UserForm_Initialize
Dim Ctrl As Control
' Création d'une collection de TextBox ayant "mains" en Tag
For Each Ctrl In Me.Controls
If TypeName(Ctrl) = "TextBox" And Ctrl.Tag = "mains" Then
TextBoxGroup.Add Ctrl
End If
Next Ctrl

End Sub


Si ton programme est gourmand en mémoire et du code s'exécute après
le traitement des TextBox, par exemple quand tu décharges l'Userform
(Unload), il serait judicieux de supprimer ta collection en ajoutant
cette ligne :
Set TextBoxGroup = Nothing

A+
Benead
Excel 2000

elect31 a écrit :
Merci de ta réponse Benoit
Je peux remplacer Tag par TypeName à condition que tous les TextBox
soient concernés. Peut être que seulement certains TextBox (ceux que
j'ai tagué "mains") m'intéressent...
Sinon, effectivement, j'ai souvent plusieurs boucles imbriquées
l'une dans l'autre, d'où mon intention d'essayer d'accélérer le
processus.

Bon, tant pis! Même si la réponse à ma question est négative, j'y
aurai au moins gagné la certitude que ce bout de code est
optimisé... à moins que quelqu'un d'autre ait une solution miracle
comme certains peuvent les trouver. Du genre, là où je mets 10
lignes de code, ils en mettent 1. Je suis autodidacte dans le
domaine de la programmation, d'où mon questionnement.
Encore merci à tous ceux qui lisent et qui répondent dans ce forum.

Benoît Marchand [Benead] a écrit :
Bonjour,

Non à ma connaissance il n'est pas possible de parcourir uniquement
les TextBox.

Par contre tu peux remplacer avantageusement l'utilisation des Tag
par TypeName(C) :

Dim C As Control
For Each C In Controls
If TypeName(C) = "TextBox" Then
' ... Ton Code ...
End If
Next C

En terme de rapidité d'exécution, la différence entre 8 contrôles
ou 40 sera imperceptiblee sauf si cette boucle est elle-même inclue
dans une ou plusieurs boucles et encore...

Benead
Excel 2000

elect31 a écrit :
Bonjour à tous
Dans le frame d'un userform, j'ai 40 controles divers et variés :
24 comboBox, 8 TextBox, 8 Label
Question : comment éviter de parcourir tous les controles du
frame? Il n'y a que les TextBox tagués "mains" qui m'interessent.
Dans le code ci dessous que j'utilise, Excel parcours tous les
controles jusqu'à ce qu'il en rencontre un tagué "mains".
N'y aurait il pas un moyen d'aller plus vite et de ne parcourir
que les TextBox?

With .Controls("FrameSeance" & CStr(i))
LaColonne = 0
For Each C In .Controls
If C.Tag = "mains" Then
C.Value =
CStr(ThisWorkbook.Worksheets(date_seance). _
Range("CA5").Offset(laLigne,
LaColonne).Value)
LaColonne = LaColonne + 1
End If
Next C
End With

PS: Ce code fonctionne. Je suis simplement en train d'essayer de
l'optimiser.

Merci de vos réponses
Mgr T. Banni
Le #21393141
dis donc, benead, on sait que t'es reviendu, c'est pas la peine de le montrer 3/4 fois :-)
un peu comme moi, en fait, quand je rentre à 5h du mat' d'une petite virée avec mes collègues de l'évêché, je dis à la pendule qui
sonne et assez fort pour que ma bonne l'entende : on sait qu'il est 1h du matin, c'est pas la peine de le répéter 5 fois
Mgr T.B.


""Benoît Marchand [Benead]""
Bonjour,

Non à ma connaissance il n'est pas possible de parcourir uniquement les
TextBox.

Par contre tu peux remplacer avantageusement l'utilisation des Tag par
TypeName(C) :

Dim C As Control
For Each C In Controls
If TypeName(C) = "TextBox" Then
' ... Ton Code ...
End If
Next C

En terme de rapidité d'exécution, la différence entre 8 contrôles ou 40
sera imperceptiblee sauf si cette boucle est elle-même inclue dans une
ou plusieurs boucles et encore...

A+
Benead
Excel 2000

elect31 a écrit :
Bonjour à tous
Dans le frame d'un userform, j'ai 40 controles divers et variés : 24 comboBox, 8 TextBox, 8 Label
Question : comment éviter de parcourir tous les controles du frame? Il n'y a que les TextBox tagués "mains" qui m'interessent.
Dans le code ci dessous que j'utilise, Excel parcours tous les controles jusqu'à ce qu'il en rencontre un tagué "mains".
N'y aurait il pas un moyen d'aller plus vite et de ne parcourir que les TextBox?

With .Controls("FrameSeance" & CStr(i))
LaColonne = 0
For Each C In .Controls
If C.Tag = "mains" Then
C.Value = CStr(ThisWorkbook.Worksheets(date_seance). _
Range("CA5").Offset(laLigne, LaColonne).Value)
LaColonne = LaColonne + 1
End If
Next C
End With

PS: Ce code fonctionne. Je suis simplement en train d'essayer de l'optimiser.

Merci de vos réponses



Benoît Marchand [Benead]
Le #21393961
Bonsoir,

Oui, quand je dis "optimiser le code" c'est pour que son exécution soit
plus rapide, mais parfois pour qu'il soit plus concis ou plus lisible.
Tant que tu es dans une phase d'apprentissage, je te conseille
effectivement de voir comment tu peux faire aller plus vite ton
programme. Ensuite, et si c'est dans le cadre de ta profession, tu
devras toujours te poser la question : le jeu en vaut-il la chandelle ?
Mais si tu codes pour ton compte personnel, aucun problème...

A+
Benead

elect31 a écrit :
Aaaaahhhh!
Je savais bien qu'il y aurait un magicien pour me sortir un truc que
je ne connaissais pas.
Je m'en va l'essayer tout de suite.
Bon! Quand tu dis optimiser ton code, tu entends bien le faire aller
plus vite? (Même si je sais que la différence ne sera pas forcément
visible à l'oeil).
En tous les cas merci de cet enseignement. J'en comprends la logique
et je vais voir ce que ça donne dans mon code.
elect

Benoît Marchand [Benead] a écrit :
Bonsoir,

Si tu tiens à optimiser ton code, tu dois utiliser une collection. Tu
fais une première boucle pour créer ta collection de TexBox
(généralement dans l'initialisation du UserForm), ensuite il te
suffit de faire appel a collection de TextBox que tu viens de créer.
Cela donne cela (à adapter) :

' Variable à déclarer en début du UserForm ou si besoin en Public
dans un module classique
Dim TextBoxGroup As New Collection



Private Sub CommandButton1_Click()
.../...
' Boucle interne à ton programme
Dim TxB As Control
For Each TxB In TextBoxGroup
' .../...
TxB.BackColor = &H8080FF
Next TxB
.../...
End Sub



Private Sub UserForm_Initialize()

' A ajouter dans UserForm_Initialize
Dim Ctrl As Control
' Création d'une collection de TextBox ayant "mains" en Tag
For Each Ctrl In Me.Controls
If TypeName(Ctrl) = "TextBox" And Ctrl.Tag = "mains" Then
TextBoxGroup.Add Ctrl
End If
Next Ctrl

End Sub


Si ton programme est gourmand en mémoire et du code s'exécute après
le traitement des TextBox, par exemple quand tu décharges l'Userform
(Unload), il serait judicieux de supprimer ta collection en ajoutant
cette ligne :
Set TextBoxGroup = Nothing

A+
Benead
Excel 2000

elect31 a écrit :
Merci de ta réponse Benoit
Je peux remplacer Tag par TypeName à condition que tous les TextBox
soient concernés. Peut être que seulement certains TextBox (ceux que
j'ai tagué "mains") m'intéressent...
Sinon, effectivement, j'ai souvent plusieurs boucles imbriquées
l'une dans l'autre, d'où mon intention d'essayer d'accélérer le
processus.

Bon, tant pis! Même si la réponse à ma question est négative, j'y
aurai au moins gagné la certitude que ce bout de code est
optimisé... à moins que quelqu'un d'autre ait une solution miracle
comme certains peuvent les trouver. Du genre, là où je mets 10
lignes de code, ils en mettent 1. Je suis autodidacte dans le
domaine de la programmation, d'où mon questionnement.
Encore merci à tous ceux qui lisent et qui répondent dans ce forum.

Benoît Marchand [Benead] a écrit :
Bonjour,

Non à ma connaissance il n'est pas possible de parcourir uniquement
les TextBox.

Par contre tu peux remplacer avantageusement l'utilisation des Tag
par TypeName(C) :

Dim C As Control
For Each C In Controls
If TypeName(C) = "TextBox" Then
' ... Ton Code ...
End If
Next C

En terme de rapidité d'exécution, la différence entre 8 contrôles
ou 40 sera imperceptiblee sauf si cette boucle est elle-même inclue
dans une ou plusieurs boucles et encore...

Benead
Excel 2000

elect31 a écrit :
Bonjour à tous
Dans le frame d'un userform, j'ai 40 controles divers et variés :
24 comboBox, 8 TextBox, 8 Label
Question : comment éviter de parcourir tous les controles du
frame? Il n'y a que les TextBox tagués "mains" qui m'interessent.
Dans le code ci dessous que j'utilise, Excel parcours tous les
controles jusqu'à ce qu'il en rencontre un tagué "mains".
N'y aurait il pas un moyen d'aller plus vite et de ne parcourir
que les TextBox?

With .Controls("FrameSeance" & CStr(i))
LaColonne = 0
For Each C In .Controls
If C.Tag = "mains" Then
C.Value =
CStr(ThisWorkbook.Worksheets(date_seance). _
Range("CA5").Offset(laLigne,
LaColonne).Value)
LaColonne = LaColonne + 1
End If
Next C
End With

PS: Ce code fonctionne. Je suis simplement en train d'essayer de
l'optimiser.

Merci de vos réponses
Publicité
Poster une réponse
Anonyme