XL 2016 événement Keypress sur textBox userform

tontonexcel

XLDnaute Occasionnel
Bonjour à tous

Je développe un petit formulaire qui contient 6 textbox, je souhaite imposer la saisie alpha en majuscules (au fur et à mesure de la saisie) j'ai donc trouvé ceci qui fonctionne très bien
VB:
Private Sub tb_saisie_phrase_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

Dim val_caractere As String

' Convertir valeur caractère en caractère alpha
val_caractere = Chr(KeyAscii)

' Convertir valeur alpha en caractère ANSI (MAJ TextBox)
KeyAscii = Asc(UCase(val_caractere))

End Sub
Ma problématique est que je voulais optimiser mon code et créer une sous procédure pour éviter de copier coller le code x fois (j'aurais peut-être plus de textBox)
Voici le code qui ne fonctionne pas (les caractères restent en minuscules)
Code:
Private Sub tb_saisie_phrase_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

Call test

End Sub

' -------------------Sous proc
Sub test()

Dim val_caractere As String

' Convertir valeur caractère en caractère alpha
val_caractere = Chr(KeyAscii)

' Convertir valeur alpha en caractère ANSI (MAJ TextBox)
KeyAscii = Asc(UCase(val_caractere))

End Sub
J'ai essayé de bricoler en déclarant notamment la variable KeyAscii en tête de module (voire en public) mais cela ne fonctionne pas. Lorsque je bascule en pas à pas la variable KeyAscii n'est pas initialisée et je pense qu'étant événementielle elle ne peut pas être prise en charge dans une autre procédure

Y a t'il une solution ?
Merci d'avance pour vos réponses
 
Solution
Bonjour le fil et ses intervenants

Y a t'il une solution ?
Merci d'avance pour vos réponses
Oui avec un module de classe
Exemple ci-dessous
(emprunté à M. Gaboly))
1) Insertion d'un module de classe
(qui sera renommé: ClasseTextBoxes
VB:
Option Explicit
Public WithEvents TextBoxes As MSForms.TextBox
Private Sub TextBoxes_Change()
TextBoxes = UCase(TextBoxes)
End Sub
Et dans le code de l'userform
VB:
Option Explicit
Dim TB() As New ClasseTextBoxes

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

Patrice33740

XLDnaute Impliqué
Bonjour,

Il faudrait écrire :
VB:
Private Sub tb_saisie_phrase_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  test KeyAscii
End Sub
Sub test(Key)
  Key = Asc(UCase(Chr(Key)))
End Sub
Mais je pense qu'il est aussi simple d'écrire directement :
VB:
Private Sub tb_saisie_phrase_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  KeyAscii = Asc(UCase(Chr(KeyAscii)))
End Sub
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour le fil et ses intervenants

Y a t'il une solution ?
Merci d'avance pour vos réponses
Oui avec un module de classe
Exemple ci-dessous
(emprunté à M. Gaboly))
1) Insertion d'un module de classe
(qui sera renommé: ClasseTextBoxes
VB:
Option Explicit
Public WithEvents TextBoxes As MSForms.TextBox
Private Sub TextBoxes_Change()
TextBoxes = UCase(TextBoxes)
End Sub
Et dans le code de l'userform
VB:
Option Explicit
Dim TB() As New ClasseTextBoxes

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
EDITION: Ah, je n'avais pas vu le message#2
Bonjour Patrice33740
 
Dernière édition:

Discussions similaires

Réponses
20
Affichages
1 K
Réponses
2
Affichages
147

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16