Pour calculer des équation du type "6V(9*9)+45(2+7²)" ...
Source / Exemple :
PPublic Function Calcule(TheCalcul As String) As Double
Dim NewCalcul As String, ThePos As Long, Parenthese As String, CParenthese As String, NegPos As Long, Pi As Double, i As Long, NextC As Double, AjoutSp As String
NewCalcul = ("0+" & TheCalcul & "+0"): NewCalcul = UCase(NewCalcul): NewCalcul = Replace(NewCalcul, " ", "") 'Initialise le calcule
NewCalcul = Replace(NewCalcul, ",", "."): NewCalcul = Replace(NewCalcul, "PI(", "PI*("): NewCalcul = Replace(NewCalcul, ")PI", ")*PI"): NewCalcul = Replace(NewCalcul, ")(", ")*(")
NewCalcul = Replace(NewCalcul, ")V", ")*V"): NewCalcul = Replace(NewCalcul, "PIV", "PI*V"): Pi = 4 * Atn(1)
For i = 0 To 9
NewCalcul = Replace(NewCalcul, i & "(", i & "*("): NewCalcul = Replace(NewCalcul, i & "V", i & "*V"): NewCalcul = Replace(NewCalcul, i & "PI", i & "*PI")
Next i
NewCalcul = Replace(NewCalcul, "PI", Pi): NewCalcul = Replace(NewCalcul, ",", ".") 'Remplace les virgules par des points pour la validité de la fonction "Val"
While InStrRev(1, NewCalcul, "(") <> Len(NewCalcul) 'Calcule les parenthèses
ThePos = Len(NewCalcul) - InStrRev(1, NewCalcul, "(") 'Renvoie la position de départ de la parenthèse
Parenthese = Mid(NewCalcul, ThePos, InStr(ThePos, NewCalcul, ")") - ThePos + 1) 'Renvoie l'ensemble de la parenthèse
CParenthese = Calcule(Mid(Parenthese, 2, Len(Parenthese) - 2)) 'Calcule l'intérieur de la parenthèse
NewCalcul = Mid(NewCalcul, 1, ThePos - 1) & CParenthese & Mid(NewCalcul, ThePos + Len(Parenthese), Len(NewCalcul) - (ThePos + Len(Parenthese)) + 1) 'Rassemble les morceaux du calcul
NewCalcul = Replace(NewCalcul, ",", ".") 'Remplace les virgules par des points pour la validité de la fonction "Val"
Wend
While InStr(1, NewCalcul, "²") <> 0 'Calcule les carrés
ThePos = InStr(1, NewCalcul, "²") 'Renvoie la position du "carré"
If Mid(NewCalcul, Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul) - 2, 3) = "0+-" Then AjoutSp = "-"
NewCalcul = Mid(NewCalcul, 1, Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) & AjoutSp & ValSp(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 + (GetSeparator(ThePos + 1, NewCalcul, 2) - ThePos)) 'Calcul le carré et rassemble les morceaux du calcule
NewCalcul = Replace(NewCalcul, ",", ".") 'Remplace les virgules par des points pour la validité de la fonction "Val"
Wend
While InStr(1, NewCalcul, "°") <> 0 'Calcule les exposants
ThePos = InStr(1, NewCalcul, "°") 'Renvoie la position de l'exposant
NewCalcul = Mid(NewCalcul, 1, Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) & (ValSp(Val(Mid(NewCalcul, 1 + Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul), ThePos - (Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) - 1))) ^ ValSp(Val(Mid(NewCalcul, ThePos + 1, GetSeparator(ThePos + 1, NewCalcul, 3) - ThePos - 1)))) & Mid(NewCalcul, ThePos + (GetSeparator(ThePos + 1, NewCalcul, 3) - ThePos)) 'Calcul l'exposant et rassemble les morceaux du calcule
NewCalcul = Replace(NewCalcul, ",", ".") 'Remplace les virgules par des points pour la validité de la fonction "Val"
Wend
While InStr(1, NewCalcul, "V") <> 0 'Calcule les racines carrés
ThePos = InStr(1, NewCalcul, "V") 'Renvoie la position de la racine carré
NewCalcul = Mid(NewCalcul, 1, Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) & Sqr(ValSp(Val(Mid(NewCalcul, ThePos + 1, GetSeparator(ThePos + 1, NewCalcul, 2) - ThePos - 1)))) & Mid(NewCalcul, ThePos + (GetSeparator(ThePos + 1, NewCalcul, 2) - ThePos)) 'Calcul la racine carré et rassemble les morceaux du calcule
NewCalcul = Replace(NewCalcul, ",", ".") 'Remplace les virgules par des points pour la validité de la fonction "Val"
Wend
While InStr(1, NewCalcul, "/") <> 0 'Calcule les divisions
ThePos = InStr(1, NewCalcul, "/") 'Renvoie la position de la division
NewCalcul = Mid(NewCalcul, 1, Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) & (ValSp(Val(Mid(NewCalcul, 1 + Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul), ThePos - (Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) - 1))) / ValSp(Val(Mid(NewCalcul, ThePos + 1, GetSeparator(ThePos + 1, NewCalcul, 3) - ThePos - 1)))) & Mid(NewCalcul, ThePos + (GetSeparator(ThePos + 1, NewCalcul, 3) - ThePos)) 'Calcul la division et rassemble les morceaux du calcule
NewCalcul = Replace(NewCalcul, ",", ".") 'Remplace les virgules par des points pour la validité de la fonction "Val"
Wend
While InStr(1, NewCalcul, "*") <> 0 'Calcule les multiplications
ThePos = InStr(1, NewCalcul, "*") 'Renvoie la position de la multiplication
NewCalcul = Mid(NewCalcul, 1, Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) & (ValSp(Val(Mid(NewCalcul, 1 + Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul), ThePos - (Len(NewCalcul) - GetSeparator(Len(NewCalcul) - ThePos + 1, NewCalcul)) - 1))) * ValSp(Val(Mid(NewCalcul, ThePos + 1, GetSeparator(ThePos + 1, NewCalcul, 3) - ThePos - 1)))) & Mid(NewCalcul, ThePos + (GetSeparator(ThePos + 1, NewCalcul, 3) - ThePos)) 'Calcul la multiplication et rassemble les morceaux du calcule
NewCalcul = Replace(NewCalcul, ",", ".") 'Remplace les virgules par des points pour la validité de la fonction "Val"
Wend
NextC = ValSp(Val(Mid(NewCalcul, 1, GetSeparator(1, NewCalcul, 2)))): NewCalcul = Replace(NewCalcul, "+-", "-"): NewCalcul = Replace(NewCalcul, "--", "+"): NewCalcul = Replace(NewCalcul, "++", "+") 'Additionne le tout
For i = 1 To Len(NewCalcul)
If Mid(NewCalcul, i, 1) = "+" Then 'Pour les additions
NextC = NextC + ValSp(Val(Mid(NewCalcul, i + 1, Len(NewCalcul) - GetSeparator(i, NewCalcul, 2))))
ElseIf Mid(NewCalcul, i, 1) = "-" Then 'Pour les soustractions
NextC = NextC - ValSp(Val(Mid(NewCalcul, i + 1, Len(NewCalcul) - GetSeparator(i, NewCalcul, 2))))
End If
Next i
NewCalcul = NextC
Calcule = ValSp(Val(Replace(NewCalcul, ",", ".")))
End Function
Public Function GetSeparator(Start As Long, TheString As String, Optional Mode = 1) As Long 'Trouve les séparateurs de droite ou de gauche
Dim VAdd As Long, VDiv As Long, VMul As Long, VRac As Long, VSou As Long
On Error Resume Next
If Mode = 1 Then
VAdd = InStrRev(Start, TheString, "+")
VDiv = InStrRev(Start, TheString, "/")
VMul = InStrRev(Start, TheString, "*")
VRac = InStrRev(Start, TheString, "V")
VSou = InStrRev(Start, TheString, "-")
ElseIf Mode > 1 Then
VAdd = InStr(Start, TheString, "+")
VDiv = InStr(Start, TheString, "/")
VMul = InStr(Start, TheString, "*")
VRac = InStr(Start, TheString, "V")
VSou = InStr(Start, TheString, "-")
End If
If VAdd = 0 Then VAdd = Len(TheString) + 1
If VDiv = 0 Then VDiv = Len(TheString) + 1
If VMul = 0 Then VMul = Len(TheString) + 1
If VRac = 0 Then VRac = Len(TheString) + 1
If Mode = 3 Then
If VSou - Start = 0 Or VSou = 0 Then VSou = Len(TheString) + 1
Else
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
Private Function InStrRev(Start As Long, String1 As String, String2 As String) As Long 'La fonction InStr, mais de droite à gauche
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 ValSp(Nombre As String)
ValSp = Format(Nombre, "0.0000000000000000000000000000000")
End Function
Private Function Replace(ByVal TheString As String, ByVal StringSearch As String, ByVal NewString As String) As String 'Remplace les caractères d'une chaine par une autre
Dim RstString As String
Replace = TheString
If Len(StringSearch) <> 0 Or Len(TheString) <> 0 Then
While InStr(TheString, StringSearch)
If Len(RstString) > 0 Then
If Len(StringSearch) > 1 Then
If InStr(TheString, StringSearch) = 1 Then RstString = RstString & NewString Else RstString = RstString & Left(TheString, (InStr(TheString, StringSearch)) - 1) & NewString
Else
RstString = RstString & Left(TheString, (InStr(TheString, StringSearch)) - 1) & NewString
End If
Else
RstString = Left(TheString, (InStr(TheString, StringSearch)) - 1) & NewString
End If
If Len(StringSearch) > 1 Then TheString = Right(TheString, Len(TheString) - (InStr(TheString, StringSearch)) - (Len(StringSearch) - 1)) Else TheString = Right(TheString, Len(TheString) - (InStr(TheString, StringSearch)))
Wend
If Len(TheString) > 0 Then RstString = RstString & TheString
Replace = RstString
End If
End Function
Conclusion :
N'hésitez pas pour les commentaires ...
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.