VBA : Interpreteur boolean

J’ai récupérer un interpréteur à cette adresse : http://www.codyx.org/snippet_calculer-expr…-simple_63.aspx

Je l’ai adapté pour résoudre des calculs boolean et non double, maleureusement, il a été développé avec des opérations ternaires et je n’arrive pas à ajouter du code pour prendre en compte l’opération ‘NON’.

Voici le code modifié avec que des OU et des ET, quelqu’un peut m’aider pour prendre en compte les non :

[codebox]
Private Function CalcEx(ByVal Text As String, OD_Resultats As Dictionary)
’------------------------
‘Buffer de charactere
Dim Char As String * 1
’Mot temporaire
Dim Word As String
’Operateur en cours
Dim Oprd As String
’------------------------
‘Tableau d’operateurs indentés
Dim Opr() As String
’Tableau de valeurs indentées
Dim Res() As Double
’Valeur en cours
Dim Value As Boolean
’------------------------
'Compteur d’indentation
Dim j As Long
’Variable de boucle
Dim i As Long

ReDim Res(0)
ReDim Opr(0)

Text = Text & " "
For i = 1 To Len(Text)
'Recuperation du charactere
Char = Mid(Text, i, 1)
'Selection en fonction de la valeur du charactere
Select Case Char
’Si c’est un chiffre ajoute dans le buffer
Case “A” To “Z”: Word = Word & Char
’Si c’est un espace calcule l’expression
Case " ": GoSub Calc
’Si c’est une operation calcule et conserve l’operation en memoire
Case “|”: GoSub Calc: Oprd = Char
Case “&”: GoSub Calc: Oprd = Char

        'Si c'est une debut paranthese indente la valeur
     Case "(":
        'Redimentionne le tableau
        ReDim Preserve Res(j)
        ReDim Preserve Opr(j)
        'Sauve la valeur et l'operande
        Res(j) = Value
        Opr(j) = Oprd
        'Increment
        j = j + 1
        'Initialize les variables temporaires
        Value = 0
        Word = ""
        Oprd = ""

        'Si c'est une fin de paranthere decremente la hierarchie
     Case ")"
        'Si on n'est en indentation "positive"
        If j Then
           'Calcule l'expression
           GoSub Calc
           'Decremente
           j = j - 1
           'Si on dispose d'un operateur
           If Opr(j) = "" Then
              'NOP
           Else
              'Calcule
              Select Case Opr(j)
                 Case "|": GoSub Calc: Oprd = Char
                 Case "&": GoSub Calc: Oprd = Char
              End Select
           End If
        Else
           'NOP
        End If

        'Sinon recupere la valeur pour analyse ulterieure
     Case Else: Word = Word & Char
  End Select

Next

'That it ! Renvoi le resultat ! (En double precision)
CalcEx = Value

Exit Function

Calc:
'Si on dispose d’un operateur
If Oprd = “” Then
’Si le mot est un chiffre
If Word <> “” And OD_Resultats.Exists(Word) Then
’La valeur egale le mot
Value = CBool(OD_Resultats(Word))
Else
’L’operateur egale le mot
If Len(Word) Then Oprd = UCase(Word)
End If
’Initialise le mot (buffer d’expression)
Word = ""
Else

  'Si le mot est numerique
  If OD_Resultats.Exists(Word) Then
     'Calcule
     Select Case Oprd
        Case "|": Value = Value Or OD_Resultats(Word)
        Case "&": Value = Value And OD_Resultats(Word)
     End Select
     'Initialise l'operateur
     Oprd = ""
  Else
     'L'operateur prend la valeur du mot
     If Len(Word) Then Oprd = UCase(Word)
  End If
  'Initialise le mot
  Word = ""

End If
Return

End Function

Public Sub Test()
Dim OD_Dico As Dictionary

Set OD_Dico = New Dictionary
OD_Dico.Add “V”, True
OD_Dico.Add “F”, False

Debug.Print CalcEx(“V | F | V”, OD_Dico)
End Sub
[/codebox]

Les interpréteurs, ca n’a pas l’air de passionner les masses. C’est là que regrète de ne pas avoir suivi les cours d’Analyse Syntaxique en FAC, faut dire aussi qu’en FAC, il mette tellement de formules mathématiques et si peux d’exemples concrets avec du code que ça vous démotive en très peu de temps.

Tu ne définis pas OD_Resultats, ça risque d’être difficile de t’aider si on veut tester cela dans une environnement VBA “standard”. Tu ne donnes pas non plus d’exemples, ce sont des ‘V’ ou des ‘01011001 | 111101’ qu’il faut envoyer ?

Effectivement, je n’ai peut-être pas assez données de détails, je fait des calculs simple genre Vrai ET Vrai = Vrai, Vrai OU Faux = Vrai, …
Pour le dictionnaire de Résultats, il s’agit d’une table qui contient les valeurs des variables
A = Vrai
B = Faux
A | B = Vrai
A & B = Faux

J’aimerai juste obtenir des booléens en sortie, d’ailleur le code que j’ai fillé fonctionne déjà et j’ai bien mis un exemple à la fin de mon code.

[quote=« ZGoblin, post:4, topic: 28982 »]Effectivement, je n’ai peut-être pas assez données de détails, je fait des calculs simple genre Vrai ET Vrai = Vrai, Vrai OU Faux = Vrai, …
Pour le dictionnaire de Résultats, il s’agit d’une table qui contient les valeurs des variables
A = Vrai
B = Faux
A | B = Vrai
A & B = Faux

J’aimerai juste obtenir des booléens en sortie, d’ailleur le code que j’ai fillé fonctionne déjà et j’ai bien mis un exemple à la fin de mon code.[/quote]
Je suis pas super certain de comprendre à quoi ca sert ce que tu veux faire :confused: si A == true et B == false, quelque soit l’opération booléene que tu effectuera, tu trouvera le bon résultat sans passer par un interpréteur. J’ai du raté un truc

Voici le contexte : J’ai un fichier excel avec pleins de données dedant, des données qui sont souvent renseignées avec les pieds, j’ai donc développé un “Programme” en VBA/Excel qui parcours les lignes du fichier pour appliquer une série de test.

Ex : - Colonne A vérifier le format Date “jj/mm/aaaa”
- Colonne B vérifier le format Horraire “hh:mm”

dans certain cas, je doit effectuer un test que si un autre test à réussi (ou échoué).
Il faut aussi noter que tout ceci est 100% configurable, donc je renseigne mes tests dans une feuille excel en indiquant les colonnes à traiter, les différents paramètres, les messages d’erreur en cas de problème et surtout les différents tests qui doivent avoir réussis ET/OU échoués : d’où mon interpréteur.