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
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
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
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 >?
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
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 >?
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
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 >?
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
Aaahhhh, C'est pour ça que certaines applications sont lentes et "mal
fagotées"?
Aaahhhh, C'est pour ça que certaines applications sont lentes et "mal
fagotées"?
Aaahhhh, C'est pour ça que certaines applications sont lentes et "mal
fagotées"?
Merci de ta réponse isabelle
Effectivement cela pourra me servir, mais dans le projet actuel je
pense que je vais plutôt utiliser les collections. Cela me semble plus
adapté à ma situation.
En fait, je veux parcourir certains contrôles d'un même frame, mai je
n'oublie pas cette astuce.
Cordialement
elect
isabelle a écrit :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
Merci de ta réponse isabelle
Effectivement cela pourra me servir, mais dans le projet actuel je
pense que je vais plutôt utiliser les collections. Cela me semble plus
adapté à ma situation.
En fait, je veux parcourir certains contrôles d'un même frame, mai je
n'oublie pas cette astuce.
Cordialement
elect
isabelle a écrit :
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
Merci de ta réponse isabelle
Effectivement cela pourra me servir, mais dans le projet actuel je
pense que je vais plutôt utiliser les collections. Cela me semble plus
adapté à ma situation.
En fait, je veux parcourir certains contrôles d'un même frame, mai je
n'oublie pas cette astuce.
Cordialement
elect
isabelle a écrit :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
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
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
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
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
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
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