Modifier un nombre à virgule dans un texte (dans une textbox)

Modifier un nombre à virgule dans un texte (dans une textbox) - VB/VBA/VBS - Programmation

Marsh Posté le 17-01-2008 à 22:19:06    

Bonjour,
 
Voilà le problème :
A partir d'une textbox contenant par exemple :"blabla blabla truc(89,7689) blabla blabla truc(45,78)"
je cherche à modifier les 2 nombres entre parenthèses de tel façon que si je mets  x= 3 et y = -456 que j'obtienne dans une nouvelle textbox quelque chose du genre :
"blabla blabla truc(92,7233) blabla blabla truc(48,-378)" (si je me suis pas trompé)
Sachant aussi que les nombres que je dois modifier doivent impérativement être ceux de "truc(,)" et pas autre chose.
 
Je vois pas par où commencer ou comment procéder, si il faut faire une recherche de caractère puis modifier d'abord les nombres...
J'espère être assez clair dans mes explications (je suis débutant).
 
Merci pour votre aide.  :jap:


Message édité par restk le 06-02-2008 à 22:44:46
Reply

Marsh Posté le 17-01-2008 à 22:19:06   

Reply

Marsh Posté le 18-01-2008 à 01:27:42    

Tu peux essayer les expressions régulières c'est très puissant.
 
En VBA, pour pouvoir en faire il faut rajouter en utilisant une nouvelle bibliothèque.
 
Pour ce faire utilise le menu :
Outils->Références et dans la liste, cocher "Microsoft VBScript Regular Expressions 5.5"
 
Ensuite il faut l'utiliser d'une manière equivalente à

Code :
  1. Sub Test()
  2.     Dim rgxp As New regexp
  3.     Dim matches As MatchCollection
  4.     Dim match_elt As Match
  5.     Dim nb_1 As Integer
  6.     Dim nb_2 As Integer
  7.     rgxp.Pattern = l'expression régulière qui va bien
  8.     rgxp.Global = True
  9.     Set matches = rgxp.Execute(str)
  10.     ' Boucle sur les truc(nb_1,nb_2) trouvés
  11.     For Each match_elt In matches
  12.         ' SubMatches(0) contient la permière parenthèse de capture, SubMatches(1) la deuxième, ....
  13.         nb_1 = match_elt.SubMatches(0) + le nombre x
  14.         nb_2 = match_elt.SubMatches(1) + le nombre y
  15.         ' la méthode value permet d'obtenir la chaine complète
  16.         str = Replace(str, match_elt.Value, la nouvelle chaine genre truc(nb_1 +x, nb_2 +y), , 1)
  17.     Next
  18. End Sub


 
Voilà pour l'utilisation d'une expression régulière.  
 
Histoire de ne pas faire tout le boulot (sinon c'est pas drôle), Il reste des truc à remplir : str doit être remplacé par ta textbox, récupérer X et Y, mettre l'expression régulière  
 
Pour ce qui est l'écriture d'un expression régulière google est ton ami.
Néanmoins qq indices :  

  • les parenthèses servent à capturer l'information (la récupérer), donc il doit y avoir des parenthèse autour des nombres
  • un nombre s'ecrit \d+ (sans signe) ou -?\d+ (pour un signe - optionnel)
  • attention les parenthèses doivent être protégés par \ quand on veut signifier le caractère "(" ou " )" au lieu de la "capture"


Bon courage,
 
Tiens nous au courant


Message édité par dreameddeath le 18-01-2008 à 01:43:45
Reply

Marsh Posté le 20-01-2008 à 14:42:05    

Salut,
 
Pour l'expression régulière, je pense que ça devrait aller, j'obtiens quelque chose du genre :  
rgxp.Pattern = "truc\(-?\d+,-?\d+\)"
 
Par contre je bloque au niveau de la boucle for...each...
le programme bloque à nb_1 = match_elt.SubMatches(0) + le nombre x

quelque soit le nombre x, qu'il existe ou pas, peut être qu'il y a une erreur au niveau des paramètres de l'expression régulière ou l'expression régulière elle-même, mais là je sèche un peu...

Reply

Marsh Posté le 20-01-2008 à 16:36:09    

Donc tu y es presque...
 
il ne te manque plus que dire à VBA ce que tu veux récupérer avec des parenthèses...
 

Reply

Marsh Posté le 20-01-2008 à 18:24:16    

Il manquait pas grand chose effectivement, 4 parenthèses et le problème est réglé  [:gijar]  
Le programme fonctionne maintenant, encore merci pour ton aide  :)

Reply

Marsh Posté le 06-02-2008 à 22:44:03    

edit:  Bonjour,  
Aujourd'hui, je cherche plus à faire du calcul non pas avec des nombres entiers mais à virgule, simple dans le principe mais je n'arrive à effectuer de calcul avec ceux-ci, j'ai un code d'erreur 13 "type incompatible" quelque soit le type de variable que j'applique au "nb_1"  :( .  
J'ajouterai que j'arrive bien à capturer le nombre à virgule entre ().
 
Ma question est donc la suivante : Comment effectuer un calcul de nombre à virgule issu d'une expression régulière ?

Reply

Marsh Posté le 07-02-2008 à 15:44:54    

Bonjour,
 
il est fort probable que le problème vienne de la virgule (ou du point) : la conversion string ==> decimal ne fonctionne qu'avec l'un des deux (dépend de la conf système).
 
Pour ce faire, il faut que tu forces le remplacement :
- soit  "." ==> ","
- soit "," ==> "."
 
Pour cela la fonction replace est bien utile (par exemple autour du match_elt.submatch)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed