Permet de calculer une équation du type :
2*(V4*4²+(2*2))/8
Source / Exemple :
Function Calcule(TheCalcul As String)
Dim NewCalcul As String, ThePos As Long, Parenthese As String, CParenthese As String, NegPos As Long, NextPar As Long
NewCalcul = Replace(TheCalcul, " ", "")
NewCalcul = Replace(NewCalcul, ",", ".")
NewCalcul = "0+" & NewCalcul & "+0"
NewCalcul = UCase(NewCalcul)
While InStrRev(1, NewCalcul, "(") <> Len(NewCalcul) 'Calcule les parenthèses
ThePos = Len(NewCalcul) - InStrRev(1, NewCalcul, "(")
NextPar = InStr(ThePos, NewCalcul, ")")
Parenthese = Mid(NewCalcul, ThePos, NextPar - ThePos + 1)
CParenthese = Calcule(Mid(Parenthese, 2, Len(Parenthese) - 2))
NewCalcul = Mid(NewCalcul, 1, ThePos - 1) & CParenthese & Mid(NewCalcul, ThePos + Len(Parenthese), Len(NewCalcul) - (ThePos + Len(Parenthese)) + 1)
Wend
NewCalcul = Replace(NewCalcul, ",", ".")
While InStr(1, NewCalcul, "²") <> 0 'Calcule les carrés
ThePos = InStr(1, NewCalcul, "²")
NewCalcul = Mid(NewCalcul, 1, Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) & Val(Mid(NewCalcul, 1 + Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul), ThePos - (Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) - 1)) ^ 2 & Mid(NewCalcul, ThePos + (GetSeparatorRev(ThePos + 1, NewCalcul) - ThePos))
Wend
NewCalcul = Replace(NewCalcul, ",", ".")
While InStr(1, NewCalcul, "V") <> 0 'Calcule les racines carrés
ThePos = InStr(1, NewCalcul, "V")
NewCalcul = Mid(NewCalcul, 1, Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) & Sqr(Val(Mid(NewCalcul, ThePos + 1, GetSeparatorRev(ThePos + 1, NewCalcul) - ThePos - 1))) & Mid(NewCalcul, ThePos + (GetSeparatorRev(ThePos + 1, NewCalcul) - ThePos))
Wend
NewCalcul = Replace(NewCalcul, ",", ".")
If InStr(1, NewCalcul, "*") < InStr(1, NewCalcul, "/") Then 'Calcule les multiplications et les divisions
While InStr(1, NewCalcul, "*") <> 0
ThePos = InStr(1, NewCalcul, "*")
NewCalcul = Mid(NewCalcul, 1, Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) & (Val(Mid(NewCalcul, 1 + Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul), ThePos - (Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) - 1)) * Val(Mid(NewCalcul, ThePos + 1, GetSeparatorSP(ThePos + 1, NewCalcul) - ThePos - 1))) & Mid(NewCalcul, ThePos + (GetSeparatorSP(ThePos + 1, NewCalcul) - ThePos))
Wend
NewCalcul = Replace(NewCalcul, ",", ".")
While InStr(1, NewCalcul, "/") <> 0
ThePos = InStr(1, NewCalcul, "/")
NewCalcul = Mid(NewCalcul, 1, Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) & (Val(Mid(NewCalcul, 1 + Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul), ThePos - (Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) - 1)) / Val(Mid(NewCalcul, ThePos + 1, GetSeparatorSP(ThePos + 1, NewCalcul) - ThePos - 1))) & Mid(NewCalcul, ThePos + (GetSeparatorSP(ThePos + 1, NewCalcul) - ThePos))
Wend
Else
While InStr(1, NewCalcul, "/") <> 0
ThePos = InStr(1, NewCalcul, "/")
NewCalcul = Mid(NewCalcul, 1, Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) & (Val(Mid(NewCalcul, 1 + Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul), ThePos - (Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) - 1)) / Val(Mid(NewCalcul, ThePos + 1, GetSeparatorSP(ThePos + 1, NewCalcul) - ThePos - 1))) & Mid(NewCalcul, ThePos + (GetSeparatorSP(ThePos + 1, NewCalcul) - ThePos))
Wend
NewCalcul = Replace(NewCalcul, ",", ".")
While InStr(1, NewCalcul, "*") <> 0
ThePos = InStr(1, NewCalcul, "*")
NewCalcul = Mid(NewCalcul, 1, Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) & (Val(Mid(NewCalcul, 1 + Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul), ThePos - (Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) - 1)) * Val(Mid(NewCalcul, ThePos + 1, GetSeparatorSP(ThePos + 1, NewCalcul) - ThePos - 1))) & Mid(NewCalcul, ThePos + (GetSeparatorSP(ThePos + 1, NewCalcul) - ThePos))
Wend
End If
NewCalcul = Replace(NewCalcul, ",", ".")
Calcule = Addition(NewCalcul) 'Additionne le tout
End Function
Function InStrRev(Start As Long, String1 As String, String2 As String)
InStrRev = Len(String1)
For i = 1 To Len(String1) - Start
If Mid(String1, Len(String1) - Start - i + 1, Len(String2)) = String2 Then InStrRev = Start + i - 1: Exit Function
Next i
End Function
Function GetSeparatorRev(Start As Long, TheString As String)
Dim VAdd As Long, VDiv As Long, VMul As Long, VRac As Long, VSou As Long
VAdd = InStr(Start, TheString, "+")
VDiv = InStr(Start, TheString, "/")
VMul = InStr(Start, TheString, "*")
VRac = InStr(Start, TheString, "V")
VSou = InStr(Start, TheString, "-")
If VAdd = 0 Then
VAdd = Len(TheString) + 1
End If
If VDiv = 0 Then
VDiv = Len(TheString) + 1
End If
If VMul = 0 Then
VMul = Len(TheString) + 1
End If
If VRac = 0 Then
VRac = Len(TheString) + 1
End If
If VSou = 0 Then
VSou = Len(TheString) + 1
End If
If VAdd < VDiv And VAdd < VMul And VAdd < VRac And VAdd < VSou Then
GetSeparatorRev = VAdd
ElseIf VDiv < VAdd And VDiv < VMul And VDiv < VRac And VDiv < VSou Then
GetSeparatorRev = VDiv
ElseIf VRac < VAdd And VRac < VMul And VRac < VDiv And VRac < VSou Then
GetSeparatorRev = VRac
ElseIf VSou < VAdd And VSou < VMul And VSou < VDiv And VSou < VRac Then
GetSeparatorRev = VSou
Else
GetSeparatorRev = VMul
End If
End Function
Function GetSeparatorSP(Start As Long, TheString As String)
Dim VAdd As Long, VDiv As Long, VMul As Long, VRac As Long, VSou As Long
VAdd = InStr(Start, TheString, "+")
VDiv = InStr(Start, TheString, "/")
VMul = InStr(Start, TheString, "*")
VRac = InStr(Start, TheString, "V")
VSou = InStr(Start, TheString, "-")
If VAdd = 0 Then
VAdd = Len(TheString) + 1
End If
If VDiv = 0 Then
VDiv = Len(TheString) + 1
End If
If VMul = 0 Then
VMul = Len(TheString) + 1
End If
If VRac = 0 Then
VRac = Len(TheString) + 1
End If
If VSou - Start = 0 Or VSou = 0 Then
VSou = Len(TheString) + 1
End If
If VAdd < VDiv And VAdd < VMul And VAdd < VRac And VAdd < VSou Then
GetSeparatorSP = VAdd
ElseIf VDiv < VAdd And VDiv < VMul And VDiv < VRac And VDiv < VSou Then
GetSeparatorSP = VDiv
ElseIf VRac < VAdd And VRac < VMul And VRac < VDiv And VRac < VSou Then
GetSeparatorSP = VRac
ElseIf VSou < VAdd And VSou < VMul And VSou < VDiv And VSou < VRac Then
GetSeparatorSP = VSou
Else
GetSeparatorSP = VMul
End If
End Function
Function GetSeparator(Start As Long, TheString As String)
Dim VAdd As Long, VDiv As Long, VMul As Long, VRac As Long, VSou As Long
VAdd = InStrRev(Start, TheString, "+")
VDiv = InStrRev(Start, TheString, "/")
VMul = InStrRev(Start, TheString, "*")
VRac = InStrRev(Start, TheString, "V")
VSou = InStrRev(Start, TheString, "-")
If VAdd = 0 Then
VAdd = Len(TheString) + 1
End If
If VDiv = 0 Then
VDiv = Len(TheString) + 1
End If
If VMul = 0 Then
VMul = Len(TheString) + 1
End If
If VRac = 0 Then
VRac = Len(TheString) + 1
End If
If VSou = 0 Then
VSou = Len(TheString) + 1
End If
If VAdd < VDiv And VAdd < VMul And VAdd < VRac And VAdd < VSou Then
GetSeparator = VAdd
ElseIf VDiv < VAdd And VDiv < VMul And VDiv < VRac And VDiv < VSou Then
GetSeparator = VDiv
ElseIf VRac < VAdd And VRac < VMul And VRac < VDiv And VRac < VSou Then
GetSeparator = VRac
ElseIf VSou < VAdd And VSou < VMul And VSou < VDiv And VSou < VRac Then
GetSeparator = VSou
Else
GetSeparator = VMul
End If
End Function
Public Function Replace(ByVal laChaine As String, ByVal old_car As String, ByVal new_car As String) As String
Dim ncar As Integer, lng As Integer, result As String, txt As String
lng = Len(old_car)
txt = laChaine
If lng <= 0 Then
Replace = txt
Exit Function
End If
On Error GoTo ErrChangeCaractre
If lng <= 0 Or Len(Trim(txt)) <= 0 Then
Replace = txt
Exit Function
End If
result = vbNullString
ncar = InStr(txt, old_car)
Do While ncar
If Len(result) > 0 Then
If lng > 1 Then
If ncar = 1 Then
result = result & new_car
Else
result = result & Left(txt, ncar - 1) & new_car
End If
Else
result = result & Left(txt, ncar - 1) & new_car
End If
Else
result = Left(txt, ncar - 1) & new_car
End If
If lng > 1 Then
txt = Right(txt, Len(txt) - ncar - (lng - 1))
Else
txt = Right(txt, Len(txt) - ncar)
End If
ncar = InStr(txt, old_car)
Loop
If Len(txt) > 0 Then result = result & txt
Replace = result
Exit Function
ErrChangeCaractre:
Replace = result
End Function
Function Addition(TheCalcule As String)
Dim NextC, i As Long
NextC = Val(Mid(TheCalcule, 1, GetSeparatorRev(1, TheCalcule)))
TheCalcule = Replace(TheCalcule, "+-", "-")
TheCalcule = Replace(TheCalcule, "--", "+")
TheCalcule = Replace(TheCalcule, "++", "+")
For i = 1 To Len(TheCalcule)
If Mid(TheCalcule, i, 1) = "+" Then
NextC = NextC + Val(Mid(TheCalcule, i + 1, Len(TheCalcule) - GetSeparatorRev(i, TheCalcule)))
ElseIf Mid(TheCalcule, i, 1) = "-" Then
NextC = NextC - Val(Mid(TheCalcule, i + 1, Len(TheCalcule) - GetSeparatorRev(i, TheCalcule)))
End If
Next i
Addition = NextC
End Function
Conclusion :
Exemple :
Calcule("2*(V16)") 'renvoie 8
V --> Racine Carré
² --> Carré
/ --> Diviser
+ --> Additioner
- --> Soustraire
( --> Parenthèse
Mettez vos commentaire (il contient surement quelque bug, merci de me prevenir)...
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.