Sup un caractére dans un textbox

ThomasR

XLDnaute Occasionnel
Bonjour le forum,

je cherche a sup dans plusieur textbox des caractére comme le ';' ou le retour charette 'le Chr(10)'

Hervé m'a un jour donné ce code :

Code:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 
If KeyAscii = 59 Then KeyAscii = 0 
End Sub

qui sert à intérdire pour la saisie.

mon problème est que les utilisateurs font des copier coller et a partir de là insert ces caractere proscri.

je ne veux pas les empécher de faire des copier coller mais remplacer les ';' et les Chr(10) par un point ou autre.

si quelqu'un à une idée

D'avance merci
 

Hellboy

XLDnaute Accro
Bonjour Thomas®

Ca fait un moment !

Regarde si ceci peut faire ton affaire:
Code:
Private Sub TextBox1_Change()
    UserForm1.TextBox1.Value = Replace(UserForm1.TextBox1.Value, ';', '.')
End Sub

Tu n'as qu'a mettre tout les remplacement que tu souhaite.
 

ThomasR

XLDnaute Occasionnel
Bonjour Hellboy,

comme tu dis, ca fait un moment.

Apres une semaine de vacances à monaco la reprise est dure.

Merci pour ton code, je vais essayer avec comme condition

UserForm1.TextBox1.Value = Replace(UserForm1.TextBox1.Value, ';', '.')

UserForm1.TextBox1.Value = Replace(UserForm1.TextBox1.Value, chr(10), '.')

Je pense le faire cette apres midi.

@+
 

ThomasR

XLDnaute Occasionnel
re,

J'ai trouvé un moyen d'optimiser la chose je vous donne le code

(c'est un ami programmeur qui me l'a pondu ;) )

Code:
Private Sub TextBox1_AfterUpdate()


   Car_ori = ';' 'pour le retour chario faire chr(10)
   Car_remp = '-'
   Message = TextBox1.Value
   Pos = InStr(1, Message, Car_ori, 1)
   While Pos <> 0
   Mid(Message, Pos, 1) = Car_remp
   Pos = InStr(1, Message, Car_ori, 1)
   Wend
   TextBox1.Value = Message
End Sub

celon les versions d'excel il faut remplacer le AfterUpdare par _LostFocus.

en procédent de cette facon la macro ne se lance qu'a la perte du focus et non à chaque changement.
 

ThomasR

XLDnaute Occasionnel
re,
:eek: ca marche po :pinch:


cela fonctionne pour remplacer des caractére mais pas le chr(10)

en fait il le voit car il inser bien le caractére en question mais le chr(10) est toujours là

je vous joint un fichier

dans ce fichier on voit que le ; est remplacé par un - sans problème

mais pour le chr(10) il devrait y avoir / à la place.

mais resultat = ◙/ le ◙ =chr(10)

d'avance merci
Thomas®

PS : la macro d'Hellboy ne marche pas chez moi
je suis en excel 97.
 

Hellboy

XLDnaute Accro
Bonjour Thomas®

Je te donne une partie de la réponse, car je ne connais pas toute la solution encore. Avec le Chr(13) tu vas avoir plus de succès, mais pas comme tu le souhaite. Essaie le et tu vas comprendre ce que je veux dire. Je continue a faire les recherches pour le reste de la solution.

vrtCarFound = CStr(Chr(10)) ' Line Feed
vrtCarFound = CStr(Chr(13)) ' Cariage return
 

Hellboy

XLDnaute Accro
re

Bon voila, j'ai trouvé. Lorsque que l'on écrit sur une line suivante dans un textbox, il s'insert pas seulement un Retour de chariot, mais aussi un LineFeed. Donc pour détecter ce que tu veux, tu dois chercher pour un vbCrLf. je te post mon code que j'ai utilisé pour tester.

Private Sub TextBox1_Change()
With UserForm1.TextBox1
For intNbCar = 1 To 2
intStep = 1
Select Case intNbCar
Case 1
vrtCarFound = ';'
vrtCarReplace = '-'
Case 2
vrtCarFound = vbCrLf ' Line Feed
vrtCarReplace = '/'
intStep = 2
Case 3

vrtCarReplace = '/'
End Select
intPosition = InStr(1, .Value, vrtCarFound)
If intPosition > 0 Then
.Value = VBA.Left(.Value, intPosition - 1) & vrtCarReplace & Mid(.Value, intPosition + intStep, 100)
End If
Next
End With
End Sub
 

ThomasR

XLDnaute Occasionnel
re

c'est super

mais comment as tu fais pour trouver ca ??

sinon je l'ai placé dans un TextBox1_AfterUpdate ou TextBox1_LostFocus pour optimiser la macro.

car dans change il boucle à tt les frappes ce qui est plus long.


En tout cas merci Hellboy
 

Hellboy

XLDnaute Accro
re

Je suis content que tu as pu trouver ton compte. J'ai trouver sur le net et la tu me croira pas, mais hier pour un projet pour moi.

Et tu as raison, le type de sub que je t'ai donner est plus long.
Je te la redonne, mais avec des commentaires ajoutés.
Code:
Private Sub TextBox1_Change()
     With TextBox1
          ' Boucle pour passer en revue toutes les entrées non désirées
          For intNbCar = 1 To 3 ' Ajuster le nombre total de la bouble selon le nombre de cas
              intStep = 1
              Select Case intNbCar
                     Case 1
                          vrtCarFound = ';'
                          vrtCarReplace = '-'
                     Case 2
                          vrtCarFound = vbCrLf ' Line Feed
                          vrtCarReplace = '/'
                          intStep = 2
' Cette variable sert dans le cas des doubles carrés causé par un chr(10) et un chr(13)(un saut de ligne)
' Avec la fonction mid, on peut se positionner dans une chaine de caractères, alors dans ce cas si, on
' doit se positionner 2 caractères plus loins et ramasser le reste de la chaine de caractères
                          
                     Case 3
                          'Mettre d'autre option ici
              End Select
              
              intPosition = InStr(1, .Value, vrtCarFound)
              If intPosition > 0 Then
' Ici je rammeasse a partir de la gauche la chaine de caractères jusqu'avant la première instance du caractère non désiré
' Ensuite insère le nouveau caractère
' Ensuite rammasse le reste de la chaine avec Mid
                 .Value = VBA.Left(.Value, intPosition - 1) & vrtCarReplace & Mid(.Value, intPosition + intStep, 100)
              End If
          Next
     End With
End Sub

a+ Thomas
 

ThomasR

XLDnaute Occasionnel
re,

just pour dire d'avoir fait qqchose.

dans ta macro il ne boucle qu'une seul foi

Code:
 With TextBox1
          ' Boucle pour passer en revue toutes les entrées non désirées
ligne1:
          For intNbCar = 1 To 2 ' Ajuster le nombre total de la bouble selon le nombre de cas
              
              Select Case intNbCar
                    Case 1
                        vrtCarFound = ';'
                        vrtCarReplace = '-'
                        intStep = 1
                    Case 2
                        vrtCarFound = vbCrLf ' Line Feed
                        vrtCarReplace = '/'
                        intStep = 2
' Cette variable sert dans le cas des doubles carrés causé par un chr(10) et un chr(13)(un saut de ligne)
' Avec la fonction mid, on peut se positionner dans une chaine de caractères, alors dans ce cas si, on
' doit se positionner 2 caractères plus loins et ramasser le reste de la chaine de caractères
                    'Case 3
                         'Mettre d'autre option ici
              End Select
              
                         intPosition = InStr(1, .Value, vrtCarFound)
                         
              If intPosition <> 0 Then
' Ici je rammeasse a partir de la gauche la chaine de caractères jusqu'avant la première instance du caractère non désiré
' Ensuite insère le nouveau caractère
' Ensuite rammasse le reste de la chaine avec Mid
                  .Value = VBA.Left(.Value, intPosition - 1) & vrtCarReplace & Mid(.Value, intPosition + intStep, 100)
              End If
          Next
If InStr(1, .Value, ';') <> 0 Then GoTo ligne1
If InStr(1, .Value, vbCrLf) <> 0 Then GoTo ligne1

     End With

PS : dis moi si il a une autre facon de faire (mais juste pour la culture car la ca tourne
 

Hellboy

XLDnaute Accro
re

Tu as tout a fait raison, j'avais pas penser a ce détail. Une autre façon de faire:

Code:
intPosition = InStr(1, .Value, vrtCarFound)
While intPosition <> 0
      .Value = VBA.Left(.Value, intPosition - 1) & vrtCarReplace & Mid(.Value, intPosition + intStep, 100)
       intPosition = InStr(1, .Value, vrtCarFound)
Wend

Je boucle jusqu'à ce qu'il n'y est plus d'instance de caractère rechercher.

Pas sure que ça marche, donne moi des nouvelles merci ! (si tu l'essaie bien sur)

a+
 

Discussions similaires

Réponses
20
Affichages
1 K

Statistiques des forums

Discussions
312 338
Messages
2 087 394
Membres
103 537
dernier inscrit
alisafred974