cs_Tireur
Messages postés24Date d'inscriptionlundi 19 décembre 2005StatutMembreDernière intervention28 décembre 2008
-
24 déc. 2008 à 23:50
cs_Tireur
Messages postés24Date d'inscriptionlundi 19 décembre 2005StatutMembreDernière intervention28 décembre 2008
-
27 déc. 2008 à 16:44
Bonjour tout le monde. Joyeux noël à tous! Étant pris au travail, je passe le temps en apprenant... Ce qui m'amène à vous poser une question car je ne trouves pas.
Language : VBA
Application : Word 2002 (impossible de changer pour une version plus récente : employeur sans $).
Je désires que lorsque l'utilisateur écrit hul dans la textbox (TbxNoDossier) devienne : HUL- J'usque la ca va pour le faire. La ou j'ai un problème, c'est quand l'utilisateur s'est trompé et qu'il doit effacer une lettre... C'est à dire qu'il presse la touche BackSpace (Ascii = 8). Le trait d'union ne s'efface pas! En fait il s'efface mais mon code le rajoute aussitot. L'utilisateur doit prendre sa souris, tout sélectionner le texte, le supprimer et reprendre du début. J'ai tenté plusieurs approches : KeyUp(), KeyDown(), KeyPress(), Change(). sans résultat.
Au final, l'utilisateur doit écrire : hul12345678 qui deviendra à mesure qu'il écrit : HUL-123456-78 Les lettres et les chiffres sont variables à chaque utilisation du formulaire.
Question 1 : Comment faire pour savoir si l'utilisateur a pressé sur la touche backSpace et garder uniquement les 2 premier caractères ?
Question 2 : Comment faire pour savoir si l'utilisateur a pressé sur la touche - (moins/tiret) et l'enlever de la string puisque le code l'ajoute automatiquement ?
Voici mon code :
Private Sub TbxNoDossier_Change()
' Déclaration des variables.
Dim Donne As String
Dim Longueur As Integer
' Assignation des valeurs aux variables.
Donne = TbxNoDossier.Text
Longueur = Len(Donne)
Select Case Longueur
Case 1
' Ca change le text en majuscule.
Donne = UCase(Donne)
TbxNoDossier.Text = Donne
Case 2
' Ca change le text en majuscule.
Donne = UCase(Donne)
TbxNoDossier.Text = Donne
Case 3
' Ca change le text en majuscule et ca ajoute le trait d'union
Donne = UCase(Donne)
TbxNoDossier.Text = Donne & "-"
Case 10
' Ca change le text en majuscule et ca ajoute le trait d'union
TbxNoDossier.Text = Donne & "-"
Case 13
' Ca donne le focus au bouton qui va vérifier la présence du fichier .txt contenant les infos du client.
BtnVerifier.SetFocus
End Select
cs_Tireur
Messages postés24Date d'inscriptionlundi 19 décembre 2005StatutMembreDernière intervention28 décembre 2008 27 déc. 2008 à 16:44
Alors après 10000 tentatives, j'ai réussi. C'est pas très beau comme code... mais ca fonctionne. Y'a plein de variables et de charabia, mais tout fonctionne!!! Je sais pas pourquoi (incompatibilité de version word???) mais les If KeyAscii n'étaient tout simplement pas "catché" par VBA.
Voila :
1 forme avec une textbox (TbxNoDossier) et deux label invisible (LblEfface, LblLongueurChaine) et un bouton (BtnVerifier). Pourquoi les 2 labels = évite les erreurs de variables entre les sub. C'est pas beau je le sais.
' Le tout donne le résultat suivant : HUL-123456-78 quand l'utilisateur écrit : hul12345678 . Les lettres et les chiffres sont variables à chaque utilisation de la forme. Le pourquoi de l'uniformité : recherche de dossier du client par la suite... Ca évite de créer des doublons si le dossier existe et qu'il n'est pas trouvé en premier lieu.
<hr />
Private Sub TbxNoDossier_Change() ' Déclaration des variables.
Dim Donne As String
Dim Longueur As Integer
' Assignation des valeurs aux variables.
Donne = TbxNoDossier.Text
Longueur = Len(Donne)
Select Case Longueur
Case 1
Donne = UCase(Donne)
TbxNoDossier.Text = Donne
BtnVerifier.Enabled = False
Case 2
Donne = UCase(Donne)
TbxNoDossier.Text = Donne
LblEfface.Caption = "0"
BtnVerifier.Enabled = False
Case 3
Donne = UCase(Donne)
If LblEfface.Caption = "0" Then
TbxNoDossier.Text = Donne & "-"
LblLongueurChaine.Caption = "4"
Else
End If
BtnVerifier.Enabled = False
Case 9
LblEfface.Caption = "0"
BtnVerifier.Enabled = False
Case 10
If LblEfface.Caption = "0" Then
TbxNoDossier.Text = Donne & "-"
LblLongueurChaine.Caption = "11"
Else
End If
BtnVerifier.Enabled = False
Case 13
BtnVerifier.Enabled = True
BtnVerifier.SetFocus
Case Else
BtnVerifier.Enabled = False
End Select
End Sub
<hr />
Private Sub TbxNoDossier_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) ' Désactivation de la touche ''Tiret / moins''.
If KeyAscii = 45 Then
KeyAscii = 0
Else
End If
End Sub
<hr />Private Sub TbxNoDossier_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
' Déclaration des variables.
Dim Donne As String
Dim Longueur As Integer
' Assignation des valeurs aux variables.
Donne = TbxNoDossier.Text
Longueur = Len(Donne)
Select Case Longueur
Case 1
LblLongueurChaine.Caption = "1"
Case 2
LblLongueurChaine.Caption = "2"
Case 3
LblLongueurChaine.Caption = "3"
If LblLongueurChaine.Caption = "4" Then
Donne = Left(TbxNoDossier.Text, 3)
LblEfface.Caption = "1"
TbxNoDossier.Text = Donne
LblLongueurChaine.Caption = "4"
Else
Donne = Left(TbxNoDossier.Text, 2)
LblEfface.Caption = "1"
TbxNoDossier.Text = Donne
LblLongueurChaine.Caption = "2"
End If
Case 4
If KeyCode = 8 Then
If LblLongueurChaine.Caption = "5" Then
Donne = Left(TbxNoDossier.Text, 4)
LblEfface.Caption = "1"
TbxNoDossier.Text = Donne
LblLongueurChaine.Caption = "4"
Else
Donne = Left(TbxNoDossier.Text, 2)
LblEfface.Caption = "1"
TbxNoDossier.Text = Donne
LblLongueurChaine.Caption = "2"
End If
Else
End If
Case 5
LblLongueurChaine.Caption = "5"
Case 6
LblLongueurChaine.Caption = "6"
Case 7
LblLongueurChaine.Caption = "7"
Case 8
LblLongueurChaine.Caption = "8"
Case 9
LblLongueurChaine.Caption = "9"
Case 10
LblLongueurChaine.Caption = "10"
If LblLongueurChaine.Caption = "11" Then
Donne = Left(TbxNoDossier.Text, 10)
LblEfface.Caption = "1"
TbxNoDossier.Text = Donne
LblLongueurChaine.Caption = "11"
Else
Donne = Left(TbxNoDossier.Text, 9)
LblEfface.Caption = "1"
TbxNoDossier.Text = Donne
LblLongueurChaine.Caption = "9"
End If
Case 11
If KeyCode = 8 Then
If LblLongueurChaine.Caption = "12" Then
Donne = Left(TbxNoDossier.Text, 11)
LblEfface.Caption = "1"
TbxNoDossier.Text = Donne
LblLongueurChaine.Caption = "11"
Else
Donne = Left(TbxNoDossier.Text, 10)
LblEfface.Caption = "1"
TbxNoDossier.Text = Donne
LblLongueurChaine.Caption = "10"
End If
Else
End If
Case 12
LblLongueurChaine.Caption = "12"
Case 13
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 25 déc. 2008 à 00:42
salut,
c'est ton choix d'évènement qui n'est pas bon.
si tu travailles au _Change c'est déjà trop tard.
_KeyPress est mieux
en VB6 (mais çà sera pareil) :
Private Sub
Text1_KeyPress(KeyAscii
As Integer
)
With Text1
If KeyAscii = 108 Or KeyAscii = 76 Then 'l ou L
' bien "HU" ?
If UCase$(.Text) = "HU" Then
' on modifie et
annule ta touche
.Text = "HUL-"
KeyAscii = 0
' on replace le
caret
.SelStart = Len(.Text)
End If
ElseIf KeyAscii = vbKeyBack Then 'effacer
' annule et garde
la gauche
KeyAscii = 0
.Text = Left$(.Text, 2)
.SelStart = 2
ElseIf KeyAscii = 45 Then '"-", on annule
KeyAscii = 0
End If
End With
End Sub