XL 2010 Manipulation Chaine Caractères

vgendron

XLDnaute Barbatruc
Bonjour à toutes et tous,

Je me tourne vers vous pour un souci de remplacement de chaines de caractères..
dans le fichier joint, j'ai une fonction "EvalExpMixte" qui me sert pour remplacer des chaines de caractères (des paramètres de test) par leur valeur si elle est connue au moment de l'execution de la macro
la chaine à evaluer est une expression mathématique qui peut contenir: des opérateurs et parenthèses..des numériques, des paramètres prédéfinis (dans mon cas: DTC DTC1 DTC2) et des paramètres qui seront calculés lors du test (Trigg_Neu et ParamDTCinside) dans l'exemple

dans la fonction, je commence par "supprimer les opérateurs et parenthèses pour pouvoir isoler chaque opérande de l'expression dans un tableau.
pour chaque opérande, je regarde s'il s'agit
1) d'un paramètre Calculé (je le laisse donc tel quel),
2) d'un numérique==> je le laisse tel quel
3) d'un paramètre préféfinis=> la. je dois le remplacer par sa valeur

le souci, c'est pour remplacer un paramètre à sa bonne place dans la chaine initiale... lorsque le nom du paramètre peut etre confondu avec un autre nom de paramètre (3 eme exemple de mon fichier)

je pourrais remplacer chaque élément de mon tableau par la valeur, mais.. vu que j'ai supprimé les opérateurs et parenthèses.. je ne saurai plus reconstruire ma chaine initiale.. à moins que..??

si vous avez une idée. je prend
Merci à vous
 

Pièces jointes

  • TestEvalExpMixte.xlsm
    21.6 KB · Affichages: 24
Solution
Bonjour,

je ferai ainsi :
VB:
Function EvalExpMixte2(ByVal ch As String) As String
    Const oper As String = "()+-*/"
    Dim param, i As Long, j As Long, tmp
   
    param = [B18:C20].Value
    For i = 1 To Len(oper)
        ch = Replace(ch, Mid(oper, i, 1), "|" & Mid(oper, i, 1))
    Next i
    tmp = Split(ch, "|")
    For i = 0 To UBound(tmp)
        For j = 1 To UBound(param)
            If Mid(tmp(i), 2) = param(j, 1) Then
                tmp(i) = Replace(tmp(i), param(j, 1), param(j, 2))
            End If
        Next j
    Next i
    EvalExpMixte2 = Join(tmp, "")
End Function
je te laisse gérer la "," ayant le "." en séparateur décimal, je n'ai pas de pb avec.
eric

eriiic

XLDnaute Barbatruc
Bonjour,

je ferai ainsi :
VB:
Function EvalExpMixte2(ByVal ch As String) As String
    Const oper As String = "()+-*/"
    Dim param, i As Long, j As Long, tmp
   
    param = [B18:C20].Value
    For i = 1 To Len(oper)
        ch = Replace(ch, Mid(oper, i, 1), "|" & Mid(oper, i, 1))
    Next i
    tmp = Split(ch, "|")
    For i = 0 To UBound(tmp)
        For j = 1 To UBound(param)
            If Mid(tmp(i), 2) = param(j, 1) Then
                tmp(i) = Replace(tmp(i), param(j, 1), param(j, 2))
            End If
        Next j
    Next i
    EvalExpMixte2 = Join(tmp, "")
End Function
je te laisse gérer la "," ayant le "." en séparateur décimal, je n'ai pas de pb avec.
eric
 

vgendron

XLDnaute Barbatruc
Salut @eriiiic

Mais OUI BIEN SUR !!
ajouter un caractère spécial pour identifier les opérateurs.. plutot que les supprimer !!
Ca fonctionne impec !!

Par contre, boucler sur les paramètres prédéfinis pour savoir si je le trouve dans le tmp(i) ca va ramer...
je peux avoir 300 paramètres et des milliers d'expression à evaluer..
je vais plutot boucler sur les Mid(tmp(i), 2)
1) ca me redonne les opérandes que j'avais bien identifiés à l'origine
2) je ne vais pas devoir revoir toute la structure du code global


en tout cas un grand merci!
 

Discussions similaires

Statistiques des forums

Discussions
312 152
Messages
2 085 787
Membres
102 973
dernier inscrit
docpod