Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

HS - Test post réinstallation Thunderbird

3 réponses
Avatar
Michel Gaboly
Bonjour twinley,

Je viens seulement de lire ton message du 3.

On n'y pense pas toujours, mais quand on a un même traitement pour
plusieurs contrôles, il est souvent intéressant de passer par un module
de classe, ce qui permet d'avoir un code unique.

Pour cela on crée un module de classe avec en haut du module :

Option Explicit
Public WithEvents TextBoxes As MSForms.TextBox
rée une nouclasse (une sorte de catégorie), capable de réagir aux
événements (Events en anglais).

NB - Option Explicit n'est pas indispensable, mais je conseille vivement
de cocher "Déclaration explicite des variables", dans les préférences
(options, sous Windows).


Dans le même module, on indique ce qui doit se passer quand survient
l'événement Change :

Private Sub TextBoxes_Change()
TextBoxes = UCase(TextBoxes)
End Sub
Il reste à créer la passerelle entre classe et les TextBox de ton UserForm.

Pour ce faire, en haut du module associé au UserForm :

Option Explicit
Dim TB() As New ClasseTextBoxes
ce qui crée une matrice destinée à stocker les TextBox à associer à la
classe “TextBoxes”. Cette matrice doit être définie au niveau module.
Elle est alimentée lors de l'initialisation du UserForm :

Private Sub UserForm_Initialize()
Dim TextBoxesCount As Integer, c As Control
' Création de la collection de TextBoxes, gérée par le module de classe
TextBoxesCount = 0
For Each c In Controls
If TypeName(c) = "TextBox" Then
TextBoxesCount = TextBoxesCount + 1
ReDim Preserve TB(1 To TextBoxesCount)
Set TB(TextBoxesCount).TextBoxes = c
End If
Next c
End Sub
NB - dans l'instruction “Set TB(TextBoxesCount).TextBoxes = c”, la
propriété doit correspondre au nom donné à la classe associée aux TextBox.

Dans la procédure ci-dessus, tous les TextBox du UserForm sont traités
de façon identique, mais il est aisé de n'en prendre en compte qu'une
partie, en se basant par exemple sur une convention pour le nom des
TextBox :

If TypeName(c) = "TextBox" And Left(c.Name, 2) = "TT" Then
permet de n'associer à la classe "TextBoxes" que les TextBox dont le nom
commence par "TT".


Le même genre de convention permet de différencier le traitement associé
à l'événement Change. Soit par exemple un UserForm comportant un grand
nombre de TextBox dont le contenu doit être numérique. L'association de
tous ces TextBox à une classe permet de n'avoir une procédure pour
l'événement Change de l'ensemble de ces TextBox. Cependant, il peut être
nécessaire d'avoir plusieurs messages différents à afficher selon qu'il
s'agit de quantités, de prix unitaire, de chiffre d'affaires, ... :

Private Sub Textboxes_Change()
Dim Sep As String, NatureInfo As String, Entier As Boolean
Sep = Application.International(xlDecimalSeparator)
If TextBoxes <> "" Then
TextBoxes = Replace(TextBoxes, ".", Sep)
TextBoxes = Replace(TextBoxes, ",", Sep)
' Construction du message
Select Case Left(TextBoxes.Name, 3)
Case "TCA"
NatureInfo = Traduction("ContrôleCAHT")
Case "TCo"
NatureInfo = Traduction("ContrôleCoÏtHoraire")
Case "THD", "THF"
...

1 - Variant est le type par défaut, et “Dim A as Variant” peut être
remplacé simplement par “Dim A”.



2 - Variant est un type peu efficace en ce qui concerne la mémoire, car
gourmand. Ici le type String est bien mieux adapté.

3 - Il est inutile d'employer “Me” pour qualifier un contrôle d'un
UserForm dans le module associé à celui-ci ; “A = TextBox1” suffit.

4 - Il est inutile de trop décomposer, car cela alourdit inutilement le
code : on peut écrire directement “A = UCase(TextBox1)” au lieu des 2
lignes “A = Me.TextBox1” et “A = UCase(A)”.

5 - Ce point est de loin le plus important, l'emploi d'une variable est
ici parfaitement superflu, car “TextBox1 = UCase(TextBox1)" suffit
largement.


En espérant que tout cela te sera utile.

twinley a écrit :
> Bonsoir à tous,
>
> J'ai un UserForm qui a dix TextBox.
> Cinq TextBox permettent de rentrer du texte.
> Je souhaite passer automatiquement le texte en majuscule.
> J'ai trouvé la petite merveille qui suit...
>
> Private Sub TextBox1_Change()
> Dim A As Variant
> A = Me.TextBox1
> A = UCase(A)
> Me.TextBox1 = A
> End Sub
>
> Mes questions :
> je la met où ?
> je dois en faire une pour chaque TextBox, et la deuxième je la met où ?
>
> Merci pour vos lumières
>
> Bonne soirée
>


--
Cordialement,

Michel Gaboly
www.gaboly.com

3 réponses

Avatar
twinley
Bravo, :-) il faut de la suite dans les idées...

8-)

à+twinley

Bonjour twinley,

Je viens seulement de lire ton message du 3.

On n'y pense pas toujours, mais quand on a un même traitement pour
plusieurs contrôles, il est souvent intéressant de passer par un module
de classe, ce qui permet d'avoir un code unique.

Pour cela on crée un module de classe avec en haut du module :

Option Explicit
Public WithEvents TextBoxes As MSForms.TextBox
rée une nouclasse (une sorte de catégorie), capable de réagir aux
événements (Events en anglais).

NB - Option Explicit n'est pas indispensable, mais je conseille vivement
de cocher "Déclaration explicite des variables", dans les préférences
(options, sous Windows).


Dans le même module, on indique ce qui doit se passer quand survient
l'événement Change :

Private Sub TextBoxes_Change()
TextBoxes = UCase(TextBoxes)
End Sub
Il reste à créer la passerelle entre classe et les TextBox de ton UserForm.

Pour ce faire, en haut du module associé au UserForm :

Option Explicit
Dim TB() As New ClasseTextBoxes
ce qui crée une matrice destinée à stocker les TextBox à associer à la
classe “TextBoxes”. Cette matrice doit être définie au niveau module.
Elle est alimentée lors de l'initialisation du UserForm :

Private Sub UserForm_Initialize()
Dim TextBoxesCount As Integer, c As Control
' Création de la collection de TextBoxes, gérée par le module de classe
TextBoxesCount = 0
For Each c In Controls
If TypeName(c) = "TextBox" Then
TextBoxesCount = TextBoxesCount + 1
ReDim Preserve TB(1 To TextBoxesCount)
Set TB(TextBoxesCount).TextBoxes = c
End If
Next c
End Sub
NB - dans l'instruction “Set TB(TextBoxesCount).TextBoxes = c”, la
propriété doit correspondre au nom donné à la classe associée aux TextBox.

Dans la procédure ci-dessus, tous les TextBox du UserForm sont traités
de façon identique, mais il est aisé de n'en prendre en compte qu'une
partie, en se basant par exemple sur une convention pour le nom des
TextBox :

If TypeName(c) = "TextBox" And Left(c.Name, 2) = "TT" Then
permet de n'associer à la classe "TextBoxes" que les TextBox dont le nom
commence par "TT".


Le même genre de convention permet de différencier le traitement associé
à l'événement Change. Soit par exemple un UserForm comportant un grand
nombre de TextBox dont le contenu doit être numérique. L'association de
tous ces TextBox à une classe permet de n'avoir une procédure pour
l'événement Change de l'ensemble de ces TextBox. Cependant, il peut être
nécessaire d'avoir plusieurs messages différents à afficher selon qu'il
s'agit de quantités, de prix unitaire, de chiffre d'affaires, ... :

Private Sub Textboxes_Change()
Dim Sep As String, NatureInfo As String, Entier As Boolean
Sep = Application.International(xlDecimalSeparator)
If TextBoxes <> "" Then
TextBoxes = Replace(TextBoxes, ".", Sep)
TextBoxes = Replace(TextBoxes, ",", Sep)
' Construction du message
Select Case Left(TextBoxes.Name, 3)
Case "TCA"
NatureInfo = Traduction("ContrôleCAHT")
Case "TCo"
NatureInfo = Traduction("ContrôleCoÏtHoraire")
Case "THD", "THF"
...

1 - Variant est le type par défaut, et “Dim A as Variant” peut être
remplacé simplement par “Dim A”.



2 - Variant est un type peu efficace en ce qui concerne la mémoire, car
gourmand. Ici le type String est bien mieux adapté.

3 - Il est inutile d'employer “Me” pour qualifier un contrôle d'un
UserForm dans le module associé à celui-ci ; “A = TextBox1” suffit.

4 - Il est inutile de trop décomposer, car cela alourdit inutilement le
code : on peut écrire directement “A = UCase(TextBox1)” au lieu des 2
lignes “A = Me.TextBox1” et “A = UCase(A)”.

5 - Ce point est de loin le plus important, l'emploi d'une variable est
ici parfaitement superflu, car “TextBox1 = UCase(TextBox1)" suffit
largement.


En espérant que tout cela te sera utile.

Bonsoir à tous,

J'ai un UserForm qui a dix TextBox.
Cinq TextBox permettent de rentrer du texte.
Je souhaite passer automatiquement le texte en majuscule.
J'ai trouvé la petite merveille qui suit...

Private Sub TextBox1_Change()
Dim A As Variant
A = Me.TextBox1
A = UCase(A)
Me.TextBox1 = A
End Sub

Mes questions :
je la met où ?
je dois en faire une pour chaque TextBox, et la deuxième je la met où ?

Merci pour vos lumières

Bonne soirée







Avatar
Michel Gaboly
Bonsoir,

Ce n'est probablement pas ce qui me manque le plus ;-)))

J'ai supprimé la 0.9 US, la 1.0 Fr tous les fichiers qui vont avec et
réinstallé cette dernière, et cette fois, cela semble fonctionner ;-))


Bravo, :-) il faut de la suite dans les idées...

8-)

à+twinley


Bonjour twinley,

Je viens seulement de lire ton message du 3.

On n'y pense pas toujours, mais quand on a un même traitement pour
plusieurs contrôles, il est souvent intéressant de passer par un
module de classe, ce qui permet d'avoir un code unique.

Pour cela on crée un module de classe avec en haut du module :

Option Explicit
Public WithEvents TextBoxes As MSForms.TextBox
rée une nouclasse (une sorte de catégorie), capable de réagir aux
événements (Events en anglais).

NB - Option Explicit n'est pas indispensable, mais je conseille
vivement de cocher "Déclaration explicite des variables", dans les
préférences (options, sous Windows).


Dans le même module, on indique ce qui doit se passer quand survient
l'événement Change :

Private Sub TextBoxes_Change()
TextBoxes = UCase(TextBoxes)
End Sub
Il reste à créer la passerelle entre classe et les TextBox de ton
UserForm.

Pour ce faire, en haut du module associé au UserForm :

Option Explicit
Dim TB() As New ClasseTextBoxes
ce qui crée une matrice destinée à stocker les TextBox à associer à la
classe “TextBoxes”. Cette matrice doit être définie au niveau module.
Elle est alimentée lors de l'initialisation du UserForm :

Private Sub UserForm_Initialize()
Dim TextBoxesCount As Integer, c As Control
' Création de la collection de TextBoxes, gérée par le module de
classe
TextBoxesCount = 0
For Each c In Controls
If TypeName(c) = "TextBox" Then
TextBoxesCount = TextBoxesCount + 1
ReDim Preserve TB(1 To TextBoxesCount)
Set TB(TextBoxesCount).TextBoxes = c
End If
Next c
End Sub
NB - dans l'instruction “Set TB(TextBoxesCount).TextBoxes = c”, la
propriété doit correspondre au nom donné à la classe associée aux
TextBox.

Dans la procédure ci-dessus, tous les TextBox du UserForm sont traités
de façon identique, mais il est aisé de n'en prendre en compte qu'une
partie, en se basant par exemple sur une convention pour le nom des
TextBox :

If TypeName(c) = "TextBox" And Left(c.Name, 2) = "TT" Then
permet de n'associer à la classe "TextBoxes" que les TextBox dont le
nom commence par "TT".


Le même genre de convention permet de différencier le traitement
associé à l'événement Change. Soit par exemple un UserForm comportant
un grand nombre de TextBox dont le contenu doit être numérique.
L'association de tous ces TextBox à une classe permet de n'avoir une
procédure pour l'événement Change de l'ensemble de ces TextBox.
Cependant, il peut être nécessaire d'avoir plusieurs messages
différents à afficher selon qu'il s'agit de quantités, de prix
unitaire, de chiffre d'affaires, ... :

Private Sub Textboxes_Change()
Dim Sep As String, NatureInfo As String, Entier As Boolean
Sep = Application.International(xlDecimalSeparator)
If TextBoxes <> "" Then
TextBoxes = Replace(TextBoxes, ".", Sep)
TextBoxes = Replace(TextBoxes, ",", Sep)
' Construction du message
Select Case Left(TextBoxes.Name, 3)
Case "TCA"
NatureInfo = Traduction("ContrôleCAHT")
Case "TCo"
NatureInfo = Traduction("ContrôleCoÏtHoraire")
Case "THD", "THF"
...

1 - Variant est le type par défaut, et “Dim A as Variant” peut être
remplacé simplement par “Dim A”.



2 - Variant est un type peu efficace en ce qui concerne la mémoire,
car gourmand. Ici le type String est bien mieux adapté.

3 - Il est inutile d'employer “Me” pour qualifier un contrôle d'un
UserForm dans le module associé à celui-ci ; “A = TextBox1” suffit.

4 - Il est inutile de trop décomposer, car cela alourdit inutilement
le code : on peut écrire directement “A = UCase(TextBox1)” au lieu des
2 lignes “A = Me.TextBox1” et “A = UCase(A)”.

5 - Ce point est de loin le plus important, l'emploi d'une variable
est ici parfaitement superflu, car “TextBox1 = UCase(TextBox1)" suffit
largement.


En espérant que tout cela te sera utile.

Bonsoir à tous,

J'ai un UserForm qui a dix TextBox.
Cinq TextBox permettent de rentrer du texte.
Je souhaite passer automatiquement le texte en majuscule.
J'ai trouvé la petite merveille qui suit...

Private Sub TextBox1_Change()
Dim A As Variant
A = Me.TextBox1
A = UCase(A)
Me.TextBox1 = A
End Sub

Mes questions :
je la met où ?
je dois en faire une pour chaque TextBox, et la deuxième je la met
où ?


Merci pour vos lumières

Bonne soirée








--
Cordialement,

Michel Gaboly
www.gaboly.com



Avatar
twinley
Bonsoir Michel

Je suis passé à côté de ce soucis :-[ car j'ai supprimé la 0.9 US et
installé la 1.0 FR from scratch, comme disent les engliches.

Maintenant que tu profites des émoticons, permet moi de fleurir not'
prose...

:-D

à+twinley

Bonsoir,

Ce n'est probablement pas ce qui me manque le plus ;-)))

J'ai supprimé la 0.9 US, la 1.0 Fr tous les fichiers qui vont avec et
réinstallé cette dernière, et cette fois, cela semble fonctionner ;-))



Bravo, :-) il faut de la suite dans les idées...

8-)

à+twinley


Bonjour twinley,

Je viens seulement de lire ton message du 3.

On n'y pense pas toujours, mais quand on a un même traitement pour
plusieurs contrôles, il est souvent intéressant de passer par un
module de classe, ce qui permet d'avoir un code unique.

Pour cela on crée un module de classe avec en haut du module :

Option Explicit
Public WithEvents TextBoxes As MSForms.TextBox
rée une nouclasse (une sorte de catégorie), capable de réagir aux
événements (Events en anglais).

NB - Option Explicit n'est pas indispensable, mais je conseille
vivement de cocher "Déclaration explicite des variables", dans les
préférences (options, sous Windows).


Dans le même module, on indique ce qui doit se passer quand survient
l'événement Change :

Private Sub TextBoxes_Change()
TextBoxes = UCase(TextBoxes)
End Sub
Il reste à créer la passerelle entre classe et les TextBox de ton
UserForm.

Pour ce faire, en haut du module associé au UserForm :

Option Explicit
Dim TB() As New ClasseTextBoxes
ce qui crée une matrice destinée à stocker les TextBox à associer à
la classe “TextBoxes”. Cette matrice doit être définie au niveau
module. Elle est alimentée lors de l'initialisation du UserForm :

Private Sub UserForm_Initialize()
Dim TextBoxesCount As Integer, c As Control
' Création de la collection de TextBoxes, gérée par le module de
classe
TextBoxesCount = 0
For Each c In Controls
If TypeName(c) = "TextBox" Then
TextBoxesCount = TextBoxesCount + 1
ReDim Preserve TB(1 To TextBoxesCount)
Set TB(TextBoxesCount).TextBoxes = c
End If
Next c
End Sub
NB - dans l'instruction “Set TB(TextBoxesCount).TextBoxes = c”, la
propriété doit correspondre au nom donné à la classe associée aux
TextBox.

Dans la procédure ci-dessus, tous les TextBox du UserForm sont
traités de façon identique, mais il est aisé de n'en prendre en
compte qu'une partie, en se basant par exemple sur une convention
pour le nom des TextBox :

If TypeName(c) = "TextBox" And Left(c.Name, 2) = "TT"
Then
permet de n'associer à la classe "TextBoxes" que les TextBox dont le
nom commence par "TT".


Le même genre de convention permet de différencier le traitement
associé à l'événement Change. Soit par exemple un UserForm comportant
un grand nombre de TextBox dont le contenu doit être numérique.
L'association de tous ces TextBox à une classe permet de n'avoir une
procédure pour l'événement Change de l'ensemble de ces TextBox.
Cependant, il peut être nécessaire d'avoir plusieurs messages
différents à afficher selon qu'il s'agit de quantités, de prix
unitaire, de chiffre d'affaires, ... :

Private Sub Textboxes_Change()
Dim Sep As String, NatureInfo As String, Entier As Boolean
Sep = Application.International(xlDecimalSeparator)
If TextBoxes <> "" Then
TextBoxes = Replace(TextBoxes, ".", Sep)
TextBoxes = Replace(TextBoxes, ",", Sep)
' Construction du message
Select Case Left(TextBoxes.Name, 3)
Case "TCA"
NatureInfo = Traduction("ContrôleCAHT")
Case "TCo"
NatureInfo = Traduction("ContrôleCoÏtHoraire")
Case "THD", "THF"
...

1 - Variant est le type par défaut, et “Dim A as Variant” peut être
remplacé simplement par “Dim A”.



2 - Variant est un type peu efficace en ce qui concerne la mémoire,
car gourmand. Ici le type String est bien mieux adapté.

3 - Il est inutile d'employer “Me” pour qualifier un contrôle d'un
UserForm dans le module associé à celui-ci ; “A = TextBox1” suffit.

4 - Il est inutile de trop décomposer, car cela alourdit inutilement
le code : on peut écrire directement “A = UCase(TextBox1)” au lieu
des 2 lignes “A = Me.TextBox1” et “A = UCase(A)”.

5 - Ce point est de loin le plus important, l'emploi d'une variable
est ici parfaitement superflu, car “TextBox1 = UCase(TextBox1)"
suffit largement.


En espérant que tout cela te sera utile.

Bonsoir à tous,

J'ai un UserForm qui a dix TextBox.
Cinq TextBox permettent de rentrer du texte.
Je souhaite passer automatiquement le texte en majuscule.
J'ai trouvé la petite merveille qui suit...

Private Sub TextBox1_Change()
Dim A As Variant
A = Me.TextBox1
A = UCase(A)
Me.TextBox1 = A
End Sub

Mes questions :
je la met où ?
je dois en faire une pour chaque TextBox, et la deuxième je la met
où ?


Merci pour vos lumières

Bonne soirée