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 à 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 à 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 à 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 à 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 à 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 à 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 à 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 à 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 à 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 à 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 à 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
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 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 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
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
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
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
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
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
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...
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
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
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
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
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
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