home *** CD-ROM | disk | FTP | other *** search
/ Programming Tool Box / SIMS_2.iso / code / system / parser / parse.bas < prev    next >
Encoding:
BASIC Source File  |  1995-02-27  |  60.6 KB  |  797 lines

  1.     Option Explicit
  2. '                                                                                                                                                                                                                                                                                                       '
  3. '                                                                                                                                                                                                                                                                                                        '
  4. 'Contient les dΘclarations globales et les routines utilisΘes                                                                                                                                                                                                                                             '
  5. '                                                                                                                                                                                                                                                                                                          '
  6. '                                                                                                                                                                                                                                                                                                           '
  7.     Const NbOperation = 19                   'Nombre d'opΘration possible
  8.     Const NbFonction = 4
  9.     
  10.     Dim Operation(NbOperation) As String    'Liste des opΘrations disponibles
  11.     Dim Fonction(NbFonction) As String      'Liste des fonctions disponibles
  12.     Dim P(NbOperation) As Integer           'Position des opΘrations
  13.  
  14.     Const POuv = "("
  15.     Const PFerm = ")"
  16.     Const Virgule = ","
  17.     Const MessageErreur = "Error!"
  18.     Const Guillement = """"
  19.     
  20.     Dim Literal() As String                 'Liste des litΘraux dans la formule
  21.     
  22.     Global Intitule() As String                'Liste des variables
  23.     Global NbIntitule As Integer
  24.  
  25. Function CalculeCondition (F As String) As String
  26.     Dim Valeur1 As String
  27.     Dim Valeur2 As String
  28.     Dim Condition As String
  29.  
  30.     Dim X1 As Integer
  31.     Dim X2 As Integer
  32.     Dim X As Integer
  33.     Dim I As Integer
  34.     Dim Nouv As Integer
  35. '                                                                                                                                                                                                                                                                                                                       '
  36. '                                                                                                                                                                                                                                                                                                                        '
  37. 'Cette procΘdure permet de calculer le rΘsultat d'une condition SI                                                                                                                                                                                                                                                          '
  38. '                                                                                                                                                                                                                                                                                                                          '
  39. '                                                                                                                                                                                                                                                                                                                           '
  40.     F = Trim(F)
  41.     '                                                                                                                                                                                                                                           '
  42.     'On recherche les 3 ΘlΘments constitutifs                                                                                                                                                                                                    '
  43.     '                                                                                                                                                                                                                                             '
  44.     X = 0
  45.     I = 0
  46.     Nouv = 0
  47.     '                                                                                                                                                                                                                                                                                                   '
  48.     'Recherche de la condition                                                                                                                                                                                                                                                                           '
  49.     '                                                                                                                                                                                                                                                                                                     '
  50.     While InStr(X + 1, F, Virgule) <> 0 And I <> -1
  51.         'On a trouvΘ une virgule, on vΘrifie pour voir si le nombre de parenthΦse est correcte                                                                                                                                                                                  '
  52.         I = X
  53.         Do
  54.             X1 = InStr(I + 1, F, POuv)
  55.             X2 = InStr(I + 1, F, PFerm)
  56.             If X1 < X2 And X1 <> 0 And X1 < InStr(X + 1, F, Virgule) Then
  57.                 I = X1
  58.                 Nouv = Nouv + 1
  59.             ElseIf X2 < InStr(X + 1, F, Virgule) And X2 <> 0 Then
  60.                 Nouv = Nouv - 1
  61.                 I = X2
  62.             Else
  63.                 I = -1
  64.             End If
  65.         Loop Until I = -1
  66.         'On sort de la boucle                                                                                                                                                                                                                   '
  67.         If I = -1 And Nouv = 0 Then
  68.             'On a trouvΘ le bon opΘrande                                                                                                                                                                                                                                                    '
  69.             Condition = Left$(F, InStr(X + 1, F, Virgule) - 1)
  70.             F = Right$(F, Len(F) - InStr(X + 1, F, Virgule))
  71.         Else
  72.             X = InStr(X + 1, F, Virgule)
  73.             I = 0
  74.         End If
  75.     Wend
  76.     If Condition = "" Then CalculeCondition = MessageErreur: Exit Function
  77.     '                                                                                                                                                                                                                                                                                                   '
  78.     'Recherche des deux valeurs                                                                                                                                                                                                                                                                           '
  79.     '                                                                                                                                                                                                                                                                                                     '
  80.     X = 0
  81.     I = 0
  82.     Nouv = 0
  83.     While InStr(X + 1, F, Virgule) <> 0 And I <> -1
  84.         'On a trouvΘ une virgule, on vΘrifie pour voir si le nombre de parenthΦse est correcte                                                                                                                                                                                  '
  85.         I = X
  86.         Do
  87.             X1 = InStr(I + 1, F, POuv)
  88.             X2 = InStr(I + 1, F, PFerm)
  89.             If X1 < X2 And X1 <> 0 And X1 < InStr(X + 1, F, Virgule) Then
  90.                 I = X1
  91.                 Nouv = Nouv + 1
  92.             ElseIf X2 < InStr(X + 1, F, Virgule) And X2 <> 0 Then
  93.                 Nouv = Nouv - 1
  94.                 I = X2
  95.             Else
  96.                 I = -1
  97.             End If
  98.         Loop Until I = -1
  99.         'On sort de la boucle                                                                                                                                                                                                                   '
  100.         If I = -1 And Nouv = 0 Then
  101.             'On a trouvΘ le bon opΘrande                                                                                                                                                                                                                                                    '
  102.             Valeur1 = Left$(F, InStr(X + 1, F, Virgule) - 1)
  103.             Valeur2 = Right$(F, Len(F) - InStr(X + 1, F, Virgule))
  104.         Else
  105.             X = InStr(X + 1, F, Virgule)
  106.             I = 0
  107.         End If
  108.     Wend
  109.     '                                                                                                                                                                                                                                                   '
  110.     '                                                                                                                                                                                                                                                    '
  111.     'On Θvalue la formule contenue dans la condition                                                                                                                                                                                                      '
  112.     '                                                                                                                                                                                                                                                      '
  113.     '                                                                                                                                                                                                                                                       '
  114.     
  115.     Condition = CalculeFormule(Condition)
  116.     If Val(Condition) Then
  117.         CalculeCondition = CalculeFormule(Valeur1)
  118.     Else
  119.         If Condition = MessageErreur Then CalculeCondition = Condition: Exit Function
  120.         CalculeCondition = CalculeFormule(Valeur2)
  121.     End If
  122.     
  123. End Function
  124.  
  125. Function CalculeFormule (ByVal F As String) As String
  126.     Dim SFDebut As Integer
  127.     Dim SFFin As Integer
  128.                                 
  129.     Dim Nouv As Integer
  130.     Dim I As Integer
  131.     Dim J As Integer
  132.     Dim X1 As Integer
  133.     Dim X2 As Integer
  134.     Dim X As Integer
  135.     Dim Y As Integer
  136.  
  137.     Dim ValeurRetour As Variant
  138. '                                                                                                                                                                                                                                                                   '
  139. '                                                                                                                                                                                                                                                                    '
  140. 'Cette procΘdure permet d'Θvaluer la valeur d'une formule en dΘcomposant les sous formules                                                                                                                                                                                                            '
  141. '                                                                                                                                                                                                                                                                      '
  142. '                                                                                                                                                                                                                                                                       '
  143.     'On regarde si commence par un signe                                                                                                                                                                                                                                                            '
  144.     If Left$(F, 1) = "+" Or Left$(F, 1) = "=" Then F = Right$(F, Len(F) - 1)
  145.  
  146.     
  147.     '                                                                                                                                                                                                                                                                                       '
  148.     'Boucle de calcul des fonctions                                                                                                                                                                                                                                                   '
  149.     '                                                                                                                                                                                                                                                                                         '
  150.     For I = 1 To NbFonction
  151.         X = InStr(F, Fonction(I))
  152.         While X
  153.             'On controle que le premier caractΦre est bien une parenthΦse                                                                                                                                                                                                                                                   '
  154.             If Left$(Trim$(Right$(F, Len(F) - X + 1 - Len(Fonction(I)))), 1) <> "(" Then CalculeFormule = MessageErreur: Exit Function
  155.             'On recherche l'ensemble de la formule avec les parenthΦses                                                                                                                          '
  156.             Nouv = 0
  157.             SFDebut = InStr(X, F, POuv)
  158.             J = SFDebut
  159.             Do
  160.                 X1 = InStr(J + 1, F, POuv)
  161.                 X2 = InStr(J + 1, F, PFerm)
  162.                 If X1 < X2 And X1 <> 0 Then
  163.                     J = X1
  164.                     Nouv = Nouv + 1
  165.                 Else
  166.                     Nouv = Nouv - 1
  167.                     J = X2
  168.                     If X2 = 0 Then
  169.                         Beep
  170.                         MsgBox "Erreur de parenthΦses dans votre formule", 16, "ERREUR"
  171.                         Exit Function
  172.                     End If
  173.                 End If
  174.             Loop Until Nouv = -1
  175.             SFFin = J
  176.             'On effectue le calcule de la parenthΦse                                                                                            '
  177.             Select Case I
  178.  
  179.             Case 1
  180.                 'On doit Θvaluer directement le contenu de la prenthΦs eet lui appliquer une fonction                                                                       '
  181.                 ValeurRetour = CalculeFormule(Mid$(F, SFDebut + 1, SFFin - SFDebut - 1))
  182.                 ValeurRetour = Format(Int(Val(ValeurRetour)))
  183.             
  184.             Case 2
  185.                 ValeurRetour = CalculeFormule(Mid$(F, SFDebut + 1, SFFin - SFDebut - 1))
  186.                 ValeurRetour = Format(Abs(Val(ValeurRetour)))
  187.             
  188.             Case 3
  189.                 'On doit rechercher toute une rangΘe de valeur                                                                                                                                                              '
  190.                 'On extrait les numΘros de lignes                                                                                                                                                                            '
  191.                 ValeurRetour = UCase$(Mid$(F, SFDebut + 1, SFFin - SFDebut - 1))
  192.                 If Left$(ValeurRetour, 1) <> "L" Then CalculeFormule = MessageErreur: Exit Function
  193.                 ValeurRetour = Right$(ValeurRetour, Len(ValeurRetour) - 1)
  194.                 
  195.                 Y = InStr(ValeurRetour, ":")
  196.                 If Y = 0 Then CalculeFormule = MessageErreur: Exit Function
  197.                 X1 = Val(Left$(ValeurRetour, Y))
  198.                 If X1 < 1 Or X1 > 8 Then CalculeFormule = MessageErreur: Exit Function
  199.                 ValeurRetour = Right$(ValeurRetour, Len(ValeurRetour) - Y)
  200.  
  201.                 If Left$(ValeurRetour, 1) <> "L" Then CalculeFormule = MessageErreur: Exit Function
  202.                 ValeurRetour = Right$(ValeurRetour, Len(ValeurRetour) - 1)
  203.                 If Not IsNumeric(ValeurRetour) Then CalculeFormule = MessageErreur: Exit Function
  204.                 X2 = Val(ValeurRetour)
  205.  
  206.                 'On effectue la somme                                                                                                                                                                               '
  207.                 ValeurRetour = 0
  208.                 For J = X1 To X2
  209.                     ValeurRetour = ValeurRetour + Val(Form1.Datas(J))
  210.                 Next J
  211.             
  212.             Case 4
  213.                 'C'est la boucle conditionnelle                                                                                                                                                                                                                                                             '
  214.                 'On va recherche les valeurs et la condition                                                                                                                                                                                                                                                                                        '
  215.                 ValeurRetour = CalculeCondition(Mid$(F, SFDebut + 1, SFFin - SFDebut - 1))
  216.                 If ValeurRetour = MessageErreur Then CalculeFormule = MessageErreur: Exit Function
  217.  
  218.             Case Else
  219.  
  220.             End Select
  221.             'On modifie la formule F afin d'y intΘgrer le rΘsultat du calcul de la sous formule                                                                                                                                                                                                                                         '
  222.             F = Trim(Left$(F, X - 1) + ValeurRetour + Right$(F, Len(F) - SFFin))
  223.             X = InStr(F, Fonction(I))
  224.         Wend
  225.     Next I
  226.     
  227.     
  228.     
  229.     '                                                                                                                                                                                                                                                                                       '
  230.     'Boucle d'extraction des sous formules                                                                                                                                                                                                                                                   '
  231.     '                                                                                                                                                                                                                                                                                         '
  232.     While InStr(F, POuv) <> 0
  233.         'Il reste une parenthΦse correspondant α une sous formule                                                                                                                                                                                                                                   '
  234.         'On recherche la fin de cette parenthΦse                                                                                                                                                                                                                                                                                '
  235.         Nouv = 0
  236.         SFDebut = InStr(F, POuv)
  237.         I = SFDebut
  238.         Do
  239.             X1 = InStr(I + 1, F, POuv)
  240.             X2 = InStr(I + 1, F, PFerm)
  241.             If X1 < X2 And X1 <> 0 Then
  242.                 I = X1
  243.                 Nouv = Nouv + 1
  244.             Else
  245.                 Nouv = Nouv - 1
  246.                 I = X2
  247.                 If X2 = 0 Then
  248.                     Beep
  249.                     MsgBox "Erreur de parenthΦses dans votre formule", 16, "ERREUR"
  250.                     Exit Function
  251.                 End If
  252.             End If
  253.         Loop Until Nouv = -1
  254.         SFFin = I
  255.         'On modifie la formule F afin d'y intΘgrer le rΘsultat du calcul de la sous formule                                                                                                                                                                                                                                         '
  256.         F = Trim(Left$(F, SFDebut - 1) + CalculeFormule(Mid$(F, SFDebut + 1, SFFin - SFDebut - 1)) + Right$(F, Len(F) - SFFin))
  257.     Wend
  258.      
  259.     CalculeFormule = ValeurFormule(F)
  260.  
  261. End Function
  262.  
  263. Function Formule (ByVal F As String) As String
  264. '                                                                                                                                                                                                                                                               '
  265. '                                                                                                                                                                                                                                                                '
  266. 'Retourne la valeur d'une formule. C'est la fonction appelante principale.                                                                                                                                                                                                                                 '
  267. '                                                                                                                                                                                                                                                                  '
  268. '                                                                                                                                                                                                                                                                   '
  269.     'Initialisation                                                                                                                                                                                                                                                                                     '
  270.     F = UCase$(Trim(F))
  271.     If Operation(1) = "" Then InitOperation
  272.     If Not Transformation_Literal(F) Then Formule = MessageErreur: Exit Function
  273.     
  274.     Formule = CalculeFormule(F)
  275. End Function
  276.  
  277. Sub InitOperation ()
  278. '                                                                                                                                                                                                                                                                           '
  279. '                                                                                                                                                                                                                                                                            '
  280. 'Initialise les opΘrations disponibles                                                                                                                                                                                                                                        '
  281. '                                                                                                                                                                                                                                                                              '
  282. '                                                                                                                                                                                                                                                                               '
  283.     Operation(1) = "^"
  284.     Operation(2) = "*"
  285.     Operation(3) = "/"
  286.     Operation(4) = "MOD"
  287.     Operation(5) = "+"
  288.     Operation(6) = "-"
  289.     Operation(7) = ">="
  290.     Operation(8) = "<="
  291.     Operation(9) = "=>"
  292.     Operation(10) = "=<"
  293.     Operation(11) = "<>"
  294.     Operation(12) = ">"
  295.     Operation(13) = "<"
  296.     Operation(14) = "="
  297.     Operation(15) = "#"
  298.     Operation(16) = "NOT"
  299.     Operation(17) = "AND"
  300.     Operation(18) = "OR"
  301.     Operation(19) = "&"
  302.  
  303.     Fonction(1) = "INT"
  304.     Fonction(2) = "ABS"
  305.     Fonction(3) = "SUM"
  306.     Fonction(4) = "IF"
  307.  
  308.     NbIntitule = UBound(Intitule)
  309.  
  310. End Sub
  311.  
  312. Sub MoinsParMoins (F As String)
  313. '                                                                                                                                                                           '
  314. '                                                                                                                                                                            '
  315. 'Cette procΘdure permet de remttre les signes correctement                                                                                                                    '
  316. '                                                                                                                                                                              '
  317. '                                                                                                                                                                               '
  318.     While InStr(F, "--") <> 0
  319.         F = Left$(F, InStr(F, "--") - 1) + "+" + Right$(F, Len(F) - InStr(F, "--") - 1)
  320.     Wend
  321.     While InStr(F, "++") <> 0
  322.         F = Left$(F, InStr(F, "++") - 1) + "+" + Right$(F, Len(F) - InStr(F, "++") - 1)
  323.     Wend
  324.     While InStr(F, "-+") <> 0
  325.         F = Left$(F, InStr(F, "-+") - 1) + "-" + Right$(F, Len(F) - InStr(F, "-+") - 1)
  326.     Wend
  327.     While InStr(F, "+-") <> 0
  328.         F = Left$(F, InStr(F, "+-") - 1) + "-" + Right$(F, Len(F) - InStr(F, "+-") - 1)
  329.     Wend
  330. End Sub
  331.  
  332. Sub Operande_Anterieur (X As Integer, F As String, V As Variant, SFDebut As Integer)
  333.     Call Operande_Anterieur_Comparaison(X, F, V, SFDebut)
  334.     Call ValeurOperande(V)
  335. End Sub
  336.  
  337. Sub Operande_Anterieur_Comparaison (X As Integer, F As String, V As Variant, SFDebut As Integer)
  338.     Dim J As Integer
  339.     Dim Y As Integer
  340. '                                                                                                                                                                   '
  341. '                                                                                                                                                                    '
  342. 'Cette procΘdure permet de trouver l'opΘrande antΘrieur                                                                                                               '
  343. '                                                                                                                                                                      '
  344. '                                                                                                                                                                       '
  345.     SFDebut = 0
  346.     Erase P
  347.     For J = 1 To NbOperation
  348.         Y = InStr(P(J) + 1, F, Operation(J))
  349.         Do
  350.             P(J) = Y
  351.             Y = InStr(P(J) + 1, F, Operation(J))
  352.         Loop Until (Y = 0 Or Y >= X)
  353.         If P(J) <> 0 And P(J) > SFDebut And P(J) < X Then SFDebut = P(J) - 1 + Len(Operation(J))
  354.         If J = 6 And P(J) = 1 Then SFDebut = 0
  355.     Next J
  356.     
  357.     V = Mid$(F, SFDebut + 1, X - SFDebut - 1)
  358.  
  359. End Sub
  360.  
  361. Sub Operande_Posterieur (X As Integer, F As String, V As Variant, SFFin As Integer)
  362.     Call Operande_Posterieur_Comparaison(X, F, V, SFFin)
  363.     Call ValeurOperande(V)
  364. End Sub
  365.  
  366. Sub Operande_Posterieur_Comparaison (X As Integer, F As String, V As Variant, SFFin As Integer)
  367.     Dim J As Integer
  368.     Dim Y As Integer
  369. '                                                                                                                                                                   '
  370. '                                                                                                                                                                    '
  371. 'Cette procΘdure permet de trouver l'opΘrande antΘrieur                                                                                                               '
  372. '                                                                                                                                                                      '
  373. '                                                                                                                                                                       '
  374.     F = Trim(F)
  375.     SFFin = Len(F) + 1
  376.     For J = 1 To NbOperation
  377.         Y = InStr(X + 1, F, Operation(J))
  378.         If Y <> 0 And Y < SFFin Then
  379.             If J = 6 Or J = 5 Then
  380.                 If Trim$(Mid$(F, X + 1, Y - X - 1)) <> "" Then
  381.                     SFFin = Y
  382.                 Else
  383.                     Y = InStr(Y + 1, F, Operation(J))
  384.                     If Y <> 0 And Y < SFFin Then SFFin = Y
  385.                 End If
  386.             Else
  387.                 SFFin = Y
  388.             End If
  389.         End If
  390.     Next J
  391.  
  392.     V = Trim$(Mid$(F, X + 1, SFFin - X - 1))
  393. End Sub
  394.  
  395. Function Signe (X As Integer, F As String) As Integer
  396.     Dim J As Integer
  397.     Dim Y As Integer
  398.     Dim V As Variant
  399.     Dim SFDebut As Integer
  400. '                                                                                                                                                                                                                                   '
  401. '                                                                                                                                                                                                                                    '
  402. 'Cette procΘdure permet de dΘterminer si c'est un signe qu'on a trouvΘ                                                                                                                                                                '
  403. '                                                                                                                                                                                                                                      '
  404. '                                                                                                                                                                                                                                       '
  405.     If X = 0 Then Signe = False: Exit Function
  406.     SFDebut = 0
  407.     Erase P
  408.     For J = 1 To NbOperation
  409.         Y = InStr(P(J) + 1, F, Operation(J))
  410.         Do
  411.             P(J) = Y
  412.             Y = InStr(P(J) + 1, F, Operation(J))
  413.         Loop Until (Y = 0 Or Y >= X)
  414.         If P(J) <> 0 And P(J) > SFDebut And P(J) < X Then SFDebut = P(J) - 1 + Len(Operation(J))
  415.         If J = 6 And P(J) = 1 Then SFDebut = 0
  416.     Next J
  417.     
  418.     V = Mid$(F, SFDebut + 1, X - SFDebut - 1)
  419.     If Trim$(V) = "" Then Signe = True:  Else Signe = False
  420. End Function
  421.  
  422. Function Transformation_Literal (F As String) As Integer
  423.     Dim SFDebut As Integer
  424.     Dim SFFin As Integer
  425.     Dim N As Integer
  426. '                                                                                                                                                                                                                                                               '
  427. '                                                                                                                                                                                                                                                                '
  428. 'Cette procΘdure permet de remplacer les litΘraux dans F                                                                                                                                                                                                          '
  429. '                                                                                                                                                                                                                                                                  '
  430. '                                                                                                                                                                                                                                                                   '
  431.     ReDim Literal(0)
  432.  
  433.     SFDebut = InStr(F, Guillement)
  434.     While SFDebut
  435.         SFFin = InStr(SFDebut + 1, F, Guillement)
  436.         If SFFin = 0 Then Transformation_Literal = False: Exit Function
  437.         'On rajoute l'ΘlΘment                                                                                                                                                                                   '
  438.         N = N + 1
  439.         ReDim Preserve Literal(N)
  440.         Literal(N) = Mid$(F, SFDebut + 1, SFFin - SFDebut - 1)
  441.         F = Left$(F, SFDebut - 1) + "@" + Format(N) + Right$(F, Len(F) - SFFin)
  442.         SFDebut = InStr(F, Guillement)
  443.     Wend
  444.     Transformation_Literal = True
  445. End Function
  446.  
  447. Function ValeurFormule (S As String) As String
  448.     Dim F As String
  449.  
  450.     Dim I As Integer
  451.     Dim J As Integer
  452.     
  453.     Dim X As Integer
  454.     Dim X1 As Integer
  455.     Dim X2 As Integer
  456.     Dim NumOperation As Integer
  457.     Dim Y As Integer
  458.     Dim SFDebut As Integer
  459.     Dim SFFin As Integer
  460.     
  461.     Dim Valeur1 As Variant
  462.     Dim Valeur2 As Variant
  463. '                                                                                                                                                                                                                                                                                                   '
  464. '                                                                                                                                                                                                                                                                                                    '
  465. 'Cette procΘdure calcule la valeur de la formule contenue dans S                                                                                                                                                                                                                                      '
  466. '                                                                                                                                                                                                                                                                                                      '
  467. '                                                                                                                                                                                                                                                                                                       '
  468.     F = Trim(S)
  469.     Call MoinsParMoins(F)
  470.     
  471.     '                                                                                                                                                                                                                                                                                       '
  472.     'Boucle de calcul avec l'opΘrande ^                                                                                                                                                                                                                                                    '
  473.     '                                                                                                                                                                                                                                                                                         '
  474.     X = InStr(F, Operation(1))
  475.     
  476.     While X
  477.         'On recherche les opΘrandes                                                                                                                          '
  478.         Call Operande_Anterieur(X, F, Valeur1, SFDebut)
  479.         Call Operande_Posterieur(X, F, Valeur2, SFFin)
  480.         If Valeur1 = MessageErreur Or Valeur2 = MessageErreur Then ValeurFormule = MessageErreur: Exit Function
  481.         
  482.         'On effectue l'opΘration                                                                                                                            '
  483.         Valeur1 = Valeur1 ^ Valeur2
  484.         Valeur1 = Trim(Format(Valeur1))
  485.         
  486.         'On remet α jour la formule                                                                                                                                                                         '
  487.         F = Left$(F, SFDebut) + Valeur1 + Right$(F, Len(F) - SFFin + 1)
  488.         
  489.         'On reboucle                                                                                                                                        '
  490.         X = InStr(F, Operation(1))
  491.     Wend
  492.     Call MoinsParMoins(F)
  493.     
  494.  
  495.     '                                                                                                                                                                                                                                                                                       '
  496.     'Boucle de calcul avec les opΘrandes *  /                                                                                                                                                                                                                                                   '
  497.     '                                                                                                                                                                                                                                                                                         '
  498.     X1 = InStr(F, Operation(2))
  499.     X2 = InStr(F, Operation(3))
  500.     While (X1 Or X2)
  501.         If ((X1 > X2 And X2 <> 0) Or X1 = 0) Then X = X2:  Else X = X1
  502.         
  503.         'On recherche les opΘrandes                                                                                                                          '
  504.         Call Operande_Anterieur(X, F, Valeur1, SFDebut)
  505.         Call Operande_Posterieur(X, F, Valeur2, SFFin)
  506.         If Valeur1 = MessageErreur Or Valeur2 = MessageErreur Then ValeurFormule = MessageErreur: Exit Function
  507.         
  508.         'On effectue l'opΘration                                                                                                                            '
  509.         If X = X1 Then
  510.             Valeur1 = Valeur1 * Valeur2
  511.         Else
  512.             If Valeur2 Then
  513.                 Valeur1 = Valeur1 / Valeur2
  514.             Else
  515.                 ValeurFormule = MessageErreur
  516.                 Exit Function
  517.             End If
  518.         End If
  519.         Valeur1 = Trim(Format(Valeur1))
  520.         
  521.         'On remet α jour la formule                                                                                                                                                                         '
  522.         F = Left$(F, SFDebut) + Valeur1 + Right$(F, Len(F) - SFFin + 1)
  523.         
  524.         'On reboucle                                                                                                                                        '
  525.         X1 = InStr(F, Operation(2))
  526.         X2 = InStr(F, Operation(3))
  527.     Wend
  528.     Call MoinsParMoins(F)
  529.     
  530.     '                                                                                                                                                                                                                                                                                       '
  531.     'Boucle de calcul avec l'opΘrande MOD                                                                                                                                                                                                                                                    '
  532.     '                                                                                                                                                                                                                                                                                         '
  533.     X = InStr(F, Operation(4))
  534.     
  535.     While X
  536.         'On recherche les opΘrandes                                                                                                                          '
  537.         Call Operande_Anterieur(X, F, Valeur1, SFDebut)
  538.         Call Operande_Posterieur(X, F, Valeur2, SFFin)
  539.         If Valeur1 = MessageErreur Or Valeur2 = MessageErreur Then ValeurFormule = MessageErreur: Exit Function
  540.         
  541.         'On effectue l'opΘration                                                                                                                            '
  542.         Valeur1 = Valeur1 Mod Valeur2
  543.         Valeur1 = Trim(Format(Valeur1))
  544.         
  545.         'On remet α jour la formule                                                                                                                                                                         '
  546.         F = Left$(F, SFDebut) + Valeur1 + Right$(F, Len(F) - SFFin + 1)
  547.         
  548.         'On reboucle                                                                                                                                        '
  549.         X = InStr(F, Operation(4))
  550.     Wend
  551.     Call MoinsParMoins(F)
  552.  
  553.     '                                                                                                                                                                                                                                                                                       '
  554.     'Boucle de calcul avec les opΘrandes +  -                                                                                                                                                                                                                                                   '
  555.     '                                                                                                                                                                                                                                                                                         '
  556.     Do
  557.         X = 0
  558.         'On vΘrifie si ce n'est pas un signe qu'on a trouvΘ                                                                                                     '
  559.         Do
  560.             X1 = InStr(X + 1, F, Operation(5))
  561.             X2 = InStr(X + 1, F, Operation(6))
  562.             If X2 = 1 Then X2 = InStr(2, F, Operation(6))
  563.             If ((X1 > X2 And X2 <> 0) Or X1 = 0) Then X = X2:  Else X = X1
  564.         Loop Until (Not Signe(X, F)) Or (X = 0)
  565.             
  566.         If X = 0 Then Exit Do
  567.         'On recherche les opΘrandes                                                                                                                          '
  568.         Call Operande_Anterieur(X, F, Valeur1, SFDebut)
  569.         Call Operande_Posterieur(X, F, Valeur2, SFFin)
  570.         
  571.         If Valeur1 = MessageErreur Or Valeur2 = MessageErreur Then ValeurFormule = MessageErreur: Exit Function
  572.         
  573.         'On effectue l'opΘration                                                                                                                            '
  574.         If X = X1 Then Valeur1 = Valeur1 + Valeur2 Else Valeur1 = Valeur1 - Valeur2
  575.         Valeur1 = Trim(Format(Valeur1))
  576.         
  577.         'On remet α jour la formule                                                                                                                                                                         '
  578.         F = Left$(F, SFDebut) + Valeur1 + Right$(F, Len(F) - SFFin + 1)
  579.     Loop
  580.     Call MoinsParMoins(F)
  581.  
  582.     '                                                                                                                                                               '
  583.     'Calcule de la formule en ligne de la gauche vers la droite pour les opΘration de comparaison                                                                                                                                 '
  584.     '                                                                                                                                                                 '
  585.     F = Trim(F)
  586.     Do
  587.         X = Len(F) + 1
  588.         
  589.         For I = 7 To 15
  590.             X1 = InStr(F, Operation(I))
  591.             If X1 <> 0 And X1 < X Then NumOperation = I: X = X1
  592.         Next I
  593.  
  594.         If X = Len(F) + 1 Then Exit Do
  595.         
  596.         'Recherche des l'opΘrandes Gauche                                                                                                                                     '
  597.         Call Operande_Anterieur_Comparaison(X, F, Valeur1, SFDebut)
  598.         Call Operande_Posterieur_Comparaison(X + Len(Operation(NumOperation)) - 1, F, Valeur2, SFFin)
  599.         
  600.         Call ValeurOperande(Valeur1)
  601.         Call ValeurOperande(Valeur2)
  602.         
  603.         If Valeur1 = MessageErreur Or Valeur2 = MessageErreur Then ValeurFormule = MessageErreur: Exit Function
  604.         If (VarType(Valeur1) <> 8 Or VarType(Valeur2) <> 8) And (VarType(Valeur1) = 8 Or VarType(Valeur2) = 8) Then ValeurFormule = MessageErreur: Exit Function
  605.         
  606.         'On effectue l'opΘration                                                                                                                            '
  607.         Select Case NumOperation
  608.  
  609.         Case 7: Valeur1 = (Valeur1 >= Valeur2)
  610.         Case 8: Valeur1 = (Valeur1 <= Valeur2)
  611.         Case 9: Valeur1 = (Valeur1 >= Valeur2)
  612.         Case 10: Valeur1 = (Valeur1 <= Valeur2)
  613.         Case 11: Valeur1 = (Valeur1 <> Valeur2)
  614.         Case 12: Valeur1 = (Valeur1 > Valeur2)
  615.         Case 13: Valeur1 = (Valeur1 < Valeur2)
  616.         Case 14: Valeur1 = (Valeur1 = Valeur2)
  617.  
  618.         Case 15
  619.             If VarType(Valeur1) <> 8 Then ValeurFormule = MessageErreur: Exit Function
  620.             If InStr(Valeur1, Valeur2) Then Valeur1 = True:  Else Valeur1 = False
  621.  
  622.         Case Else
  623.  
  624.         End Select
  625.  
  626.         Valeur1 = Trim(Format(Valeur1))
  627.         
  628.         'On remet α jour la formule                                                                                                                                                                         '
  629.         F = Left$(F, SFDebut) + Valeur1 + Right$(F, Len(F) - SFFin + 1)
  630.         Call MoinsParMoins(F)
  631.     Loop
  632.     
  633.     
  634.     '                                                                                                                                                                                                                                                                                       '
  635.     'Boucle de calcul avec l'opΘrande NOT                                                                                                                                                                                                                                                    '
  636.     '                                                                                                                                                                                                                                                                                         '
  637.     X = InStr(F, Operation(16))
  638.     While X
  639.         'On recherche les opΘrandes                                                                                                                          '
  640.         X = X + 2
  641.         Call Operande_Posterieur(X, F, Valeur2, SFFin)
  642.         If Valeur2 = MessageErreur Then ValeurFormule = MessageErreur: Exit Function
  643.         
  644.         'On effectue l'opΘration                                                                                                                            '
  645.         Valeur1 = Not (Val(Valeur2))
  646.         Valeur1 = Trim(Format(Valeur1))
  647.         
  648.         'On remet α jour la formule                                                                                                                                                                         '
  649.         F = Left$(F, X - 3) + Valeur1 + Right$(F, Len(F) - SFFin + 1)
  650.         Call MoinsParMoins(F)
  651.         
  652.         'On reboucle                                                                                                                                        '
  653.         X = InStr(F, Operation(16))
  654.     Wend
  655.     
  656.     '                                                                                                                                                                                                                                                                                       '
  657.     'Boucle de calcul avec l'opΘrande AND                                                                                                                                                                                                                                                    '
  658.     '                                                                                                                                                                                                                                                                                         '
  659.     X = InStr(F, Operation(17))
  660.     
  661.     While X
  662.         'On recherche les opΘrandes                                                                                                                          '
  663.         Call Operande_Anterieur(X, F, Valeur1, SFDebut)
  664.         X = X + 2
  665.         Call Operande_Posterieur(X, F, Valeur2, SFFin)
  666.         If Valeur1 = MessageErreur Or Valeur2 = MessageErreur Then ValeurFormule = MessageErreur: Exit Function
  667.         
  668.         'On effectue l'opΘration                                                                                                                            '
  669.         Valeur1 = Valeur1 And Valeur2
  670.         Valeur1 = Trim(Format(Valeur1))
  671.         
  672.         'On remet α jour la formule                                                                                                                                                                         '
  673.         F = Left$(F, SFDebut) + Valeur1 + Right$(F, Len(F) - SFFin + 1)
  674.         Call MoinsParMoins(F)
  675.         
  676.         'On reboucle                                                                                                                                        '
  677.         X = InStr(F, Operation(17))
  678.     Wend
  679.     
  680.  
  681.     '                                                                                                                                                                                                                                                                                       '
  682.     'Boucle de calcul avec l'opΘrande OR                                                                                                                                                                                                                                                    '
  683.     '                                                                                                                                                                                                                                                                                         '
  684.     X = InStr(F, Operation(18))
  685.     
  686.     While X
  687.         'On recherche les opΘrandes                                                                                                                          '
  688.         Call Operande_Anterieur(X, F, Valeur1, SFDebut)
  689.         X = X + 1
  690.         Call Operande_Posterieur(X, F, Valeur2, SFFin)
  691.         If Valeur1 = MessageErreur Or Valeur2 = MessageErreur Then ValeurFormule = MessageErreur: Exit Function
  692.         
  693.         'On effectue l'opΘration                                                                                                                            '
  694.         Valeur1 = Valeur1 Or Valeur2
  695.         Valeur1 = Trim(Format(Valeur1))
  696.         
  697.         'On remet α jour la formule                                                                                                                                                                         '
  698.         F = Left$(F, SFDebut) + Valeur1 + Right$(F, Len(F) - SFFin + 1)
  699.         Call MoinsParMoins(F)
  700.         
  701.         'On reboucle                                                                                                                                        '
  702.         X = InStr(F, Operation(18))
  703.     Wend
  704.  
  705.     '                                                                                                                                                                                                                                                                                       '
  706.     'Boucle de calcul avec l'opΘrande &                                                                                                                                                                                                                                                    '
  707.     '                                                                                                                                                                                                                                                                                         '
  708.     X = InStr(F, Operation(19))
  709.     
  710.     While X
  711.         'On recherche les opΘrandes                                                                                                                          '
  712.         Call Operande_Anterieur_Comparaison(X, F, Valeur1, SFDebut)
  713.         Call Operande_Posterieur_Comparaison(X, F, Valeur2, SFFin)
  714.         
  715.         Call ValeurOperande(Valeur1)
  716.         Call ValeurOperande(Valeur2)
  717.  
  718.         If VarType(Valeur1) <> 8 And VarType(Valeur2) <> 8 Then Valeur1 = MessageErreur
  719.         If Valeur1 = MessageErreur Or Valeur2 = MessageErreur Then ValeurFormule = MessageErreur: Exit Function
  720.         
  721.         'On effectue l'opΘration                                                                                                                            '
  722.         Valeur1 = Valeur1 & Valeur2
  723.         ReDim Preserve Literal(UBound(Literal) + 1)
  724.         Literal(UBound(Literal)) = Valeur1
  725.         Valeur1 = "@" + Format(UBound(Literal))
  726.         Valeur1 = Trim(Format(Valeur1))
  727.         
  728.         'On remet α jour la formule                                                                                                                                                                         '
  729.         F = Left$(F, SFDebut) + Valeur1 + Right$(F, Len(F) - SFFin + 1)
  730.         Call MoinsParMoins(F)
  731.         
  732.         'On reboucle                                                                                                                                        '
  733.         X = InStr(F, Operation(19))
  734.     Wend
  735.  
  736.  
  737.     '                                                                                                                                                                                                                               '
  738.     'On n'a plus d'opΘration, on renvoie le rΘsultat                                                                                                                                                                                                         '
  739.     '                                                                                                                                                                                                                                 '
  740.     Valeur1 = F
  741.     Call ValeurOperande(Valeur1)
  742.     
  743.     ValeurFormule = Format(Valeur1)
  744. End Function
  745.  
  746. Sub ValeurOperande (V As Variant)
  747.     Dim Signe As Integer
  748.     Dim L As Long
  749.     Dim I As Integer
  750. '                                                                                                                                                                                                                                                                       '
  751. '                                                                                                                                                                                                                                                                        '
  752. 'Cette formule Θvalue et controle le montant de l'opΘrande                                                                                                                                                                                                                            '
  753. '                                                                                                                                                                                                                                                                          '
  754. '                                                                                                                                                                                                                                                                           '
  755.     V = Trim(V)
  756.     
  757.     'On effectue les tests                                                                                                                                                                                          '
  758.     If Len(V) = 0 Then V = MessageErreur: Exit Sub
  759.     
  760.     'Est ce un numΘrique?                                                                                                           '
  761.     If IsNumeric(V) Then V = Val(V):  Exit Sub
  762.     
  763.     'Est ce un literral?                                                                                                                                '
  764.     If Left$(V, 1) = "@" Then
  765.         If Len(V) > 1 Then
  766.             L = Val(Right$(V, Len(V) - 1))
  767.             If L > UBound(Literal) Or L <= 0 Then V = MessageErreur: Exit Sub
  768.             V = Literal(L)
  769.             'Est ce une date                                                                                                            '
  770.             If IsDate(V) Then L = DateValue(V): V = L
  771.             Exit Sub
  772.         Else
  773.             V = MessageErreur
  774.             Exit Sub
  775.         End If
  776.     End If
  777.  
  778.     'Est ce une rΘfΘrence de datas?                                                                                                                     '
  779.     'Ces lignes sont α adapter au cas de votre programme                                                                                                 '
  780.     If Left$(V, 1) = "-" Then Signe = -1: V = Right$(V, Len(V) - 1): Else Signe = 1
  781.     
  782.     If Len(V) = 0 Then V = MessageErreur: Exit Sub
  783.     
  784.     For I = 1 To NbIntitule
  785.         If V = Intitule(I) Then
  786.             'C'est une rΘfΘrence de ligne on contr⌠le sa validitΘ                                                                                                                                                                                  '
  787.             V = UCase$(Form1.Datas(I - 1))
  788.             If IsNumeric(V) Then V = Signe * Val(V): Exit Sub
  789.             If Signe = -1 Then V = MessageErreur: Exit Sub
  790.             If IsDate(V) Then L = DateValue(V): V = L
  791.             Exit Sub
  792.         End If
  793.     Next I
  794.     V = MessageErreur
  795. End Sub
  796.  
  797.