It seems like such a simple task; check a variable for whether it contains a true value or a false value.
No problem, right? Well, if you’re dealing with numbers, maybe, but when input comes from config files or databases, the truth <ahem> may not be so obviously out there.
As part of my code garage, I thought I’d post two functions I’ve used for ages to do just that; convert a variable, virtually any variable, to a boolean result.
They are especially useful in configuration handling, where you might want to support multiple values that might mean “true” or “false”, like on/off, yes/no, etc. I’ve also found that they can make code clearer by specifying the “assumed” default value if the variable can’t be concretely identified one way or another (is “Bob Thomas” true or false?).
Public Function IsTrue(VarToTest As Variant, Optional ByVal Default As Boolean = True) As Boolean '---- Resolve an input variable to a boolean ' but convert common "true"/"false" phrases as well ' Also, this allows for an easy way to indicate a ' "default" value in cases of an undetermined (ie blank) ' value Dim t$ Dim s Select Case VarType(VarToTest) Case vbArray Err.Raise 5, "IsTrue", "Can't test an array for true" Case vbObject IsTrue = ObjPtr(VarToTest) <> 0 Case vbString If Len(VarToTest) = 0 Then '---- is true assumes blanks are true IsTrue = Default Else On Error Resume Next '---- strip to first space t$ = Trim$(Left$(VarToTest, 15)) s = InStr(t$, " ") If s > 0 Then t$ = Left$(t$, s - 1) '---- clean out any tabs t$ = Replace(t$, Chr$(9), vbNullString) '---- accept some synonyms (any other good ones?) If InStr(1, t$, "YES", vbTextCompare) = 1 Then IsTrue = True ElseIf InStr(1, t$, "NO", vbTextCompare) = 1 Then IsTrue = False ElseIf InStr(1, t$, "ON", vbTextCompare) = 1 Then IsTrue = True ElseIf InStr(1, t$, "OFF", vbTextCompare) = 1 Then IsTrue = False ElseIf InStr(1, t$, "TRUE", vbTextCompare) = 1 Then IsTrue = True ElseIf InStr(1, t$, "FALSE", vbTextCompare) = 1 Then IsTrue = False Else IsTrue = CBool(VarToTest) If Err Then IsTrue = Val(VarToTest) <> 0 End If On Error GoTo 0 End If End If Case Else If IsEmpty(VarToTest) Then IsTrue = Default Else On Error Resume Next IsTrue = CBool(VarToTest) If Err Then IsTrue = Default End If On Error GoTo 0 End If End Select End Function Public Function IsFalse(VarToTest As Variant, Optional ByVal Default As Boolean = False) As Boolean '---- basically, the inverse of IsTrue above ' mainly for convenience IsFalse = Not IsTrue(VarToTest, Default) End Function
Hey, CBOOL is undoubtedly faster, but:
If IsFalse(SettingValue) Then '---- handle the negative condition here End If
just seems so much clearer.
The optional Default argument allow you to specify what value to return if the value to test can’t be resolved satisfactorily one way or the other. Practically, this allows you to easily specify whether a blank value or a “non-boolean” value should translate to true or false. This is especially important when you’re reading config options from a file or the registry where the option may not exist at all.
It allows to do something like so:
If IsTrue(SettingValue, False) Then '---- handle positive conditions here, but if the SettingValue is blank, we default to False End If
Simple, but handy.
2 Comments
I *still* think you can test an array for Truthiness.
Interate through each element and keep track of its calculated True/False value. Calculate an average. For the whole array, >.49 = True.
Kind of like the "crisping" procedure in fuzzy math.
Hmm, never heard of "crisping" in fuzzy math, but after a few googles, now I know what that means. Interesting.
How often I could use it in my projects, I’m not sure…