Private Function Validate(ByVal sEquation As String, _
ByRef sError As String, _
Optional ByVal IsTopLevel As Boolean = True) As Boolean
Const sComparison As String = " < > = || && & " ' Add Valid Comparison operators here
Const sOperators As String = " + - * / ^ " ' Add valid Calculation operators here
Const sIndicator As String = "?" ' A character which doesn't clash with anything else
Const sAlgebra As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const sInteger As String = "0123456789."
Dim N As Integer, lPos As Integer
Dim arrComp() As String, sChar As String
Dim bValue As Boolean
' Check the equation isn't ""
If LenB(Trim$(sEquation)) = 0 Then
If Not bTopLevel Then sError = "Empty Paretheses"
Exit Function
End If
'Check For Brackets
Do While InStr(sEquation, "(") Or InStr(sEquation, ")")
For N = 1 To Len(sEquation)
sChar = Mid$(sEquation, N, 1)
If sChar = "(" Then
lPos = N
ElseIf sChar = ")" Then
If lPos Then
' Bracket Pair Found - Validate it
If Not Validate(Mid$(sEquation, lPos + 1, N - lPos - 1), sError, False) Then Exit Function
sEquation = Left$(sEquation, lPos - 1) & sIndicator & Mid$(sEquation, N + 1)
lPos = 0
Exit For
Else
sError = "Missing Parentheses"
Exit Function
End If
End If
Next N
If lPos Then
sError = "Missing Parentheses"
Exit Function
End If
Loop
' Check Simple Equation Conditions
' Must go value, operator, value, operator,..., value.
For N = 1 To Len(sEquation)
If bValue Then
' This must be an comparison or calculation operator
sChar = Mid$(sEquation, N, 2)
If Left$(sChar, 1) = " " Then
' Do Nothing
ElseIf InStr(sComparison, " " & sChar & " ") Or InStr(sOperators, " " & sChar & " ") Then
bValue = Not bValue
N = N + 1
ElseIf InStr(sComparison, " " & Left$(sChar, 1) & " ") Or InStr(sOperators, " " & Left$(sChar, 1) & " ") Then
bValue = Not bValue
Else
Exit For
End If
Else
' This must be a value
sChar = Mid$(sEquation, N, 1)
If sChar = " " Then
' Do Nothing
ElseIf InStr(sAlgebra, UCase$(sChar)) Then
Do While InStr(sAlgebra, UCase$(Mid$(sEquation, N + 1, 1)))
N = N + 1
If LenB(Mid$(sEquation, N + 1, 1)) = 0 Then Exit Do
Loop
bValue = Not bValue
ElseIf InStr(sInteger, sChar) Then
Do While InStr(sInteger, UCase$(Mid$(sEquation, N + 1, 1)))
N = N + 1
If LenB(Mid$(sEquation, N + 1, 1)) = 0 Then Exit Do
Loop
bValue = Not bValue
ElseIf sChar = sIndicator Then
bValue = Not bValue
Else
Exit For
End If
End If
Next N
If Not N > Len(sEquation) Or Not bValue Then
sError = "Missing or Invalid " & IIf(bValue, "Operator", "Value")
Exit Function
End If
' Check whether main equation is a comparison
If IsTopLevel Then
arrComp = Split(sComparison, " ")
For N = 1 To UBound(arrComp) - 1
If InStr(sEquation, arrComp(N)) Then Exit For
Next N
If N > UBound(arrComp) - 1 Then
sError = "No Comparison Operator in Top-Level Equation"
Exit Function
End If
End If
Validate = True
End Function