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
>
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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ù ?
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
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
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ù ?
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
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
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ù ?
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ù ?