I'm back after my first answer failed miserably.
Answer Number 2
You have no idea how excited I am about this. Years after learning about the Xor
operator and I finally get to use it!!
VBA - Logical Operators: Xor Operator
Called Logical Exclusion. It is the combination of NOT and OR Operator. If one, and only one, of the expressions evaluates to be True, the result is True.
The Xor
seems like a great fit because both the parameters need to be tested for nulls and the values can not equal one another.
My Version
Public Function NotEquals(LeftValue As Variant, RightValue As Variant) As Boolean
If IsNull(LeftValue) Xor IsNull(RightValue) Then
NotEquals = True
ElseIf LeftValue <> RightValue Then
NotEquals = True
End If
End Function
Results
Crude Tests
Option Explicit
Public Const Repetitions = 10000000
Public Function IsDistinct(LeftValue As Variant, RightValue As Variant) As Boolean
If IsNull(LeftValue) Then
If IsNull(RightValue) Then
IsDistinct = False
Else
IsDistinct = True
End If
Else
If IsNull(RightValue) Then
IsDistinct = True
Else
IsDistinct = Not (LeftValue = RightValue)
End If
End If
End Function
Public Function NotEquals(LeftValue As Variant, RightValue As Variant) As Boolean
If IsNull(LeftValue) Xor IsNull(RightValue) Then
NotEquals = True
ElseIf LeftValue <> RightValue Then
NotEquals = True
End If
End Function
Sub CompareResults()
Dim SumOfTime As Double
Debug.Print "Number of Repetitions: "; FormatNumber(Repetitions, 0)
Debug.Print
Debug.Print "IsDistinct Test"
Debug.Print "Left"; Tab(8); "Right"; Tab(16); "Time"; Tab(24); "Result"
SumOfTime = TestIsDistinct(1, 1)
SumOfTime = SumOfTime + TestIsDistinct(1, 0)
SumOfTime = SumOfTime + TestIsDistinct(Null, 1)
SumOfTime = SumOfTime + TestIsDistinct(0, Null)
SumOfTime = SumOfTime + TestIsDistinct(Null, Null)
Debug.Print "Total Time for All IsDistinct Test: "; SumOfTime
Debug.Print
Debug.Print "NotEquals Test"
Debug.Print "Left"; Tab(8); "Right"; Tab(16); "Time"; Tab(24); "Result"
SumOfTime = TestNotEquals(1, 1)
SumOfTime = SumOfTime + TestNotEquals(1, 0)
SumOfTime = SumOfTime + TestNotEquals(Null, 1)
SumOfTime = SumOfTime + TestNotEquals(0, Null)
SumOfTime = SumOfTime + TestNotEquals(Null, Null)
Debug.Print "Total Time for All NotEquals Test: "; SumOfTime
End Sub
Function TestIsDistinct(LeftValue As Variant, RightValue As Variant) As Double
Dim t As Double
t = Timer
Dim Result As Boolean
Dim n As Long
For n = 1 To Repetitions
Result = IsDistinct(LeftValue, RightValue)
Next
Dim SumOfTime As Double
SumOfTime = Round(Timer - t, 4)
Debug.Print LeftValue; Tab(8); RightValue; Tab(16); SumOfTime; Tab(24); Result
TestIsDistinct = SumOfTime
End Function
Function TestNotEquals(LeftValue As Variant, RightValue As Variant) As Double
Dim t As Double
t = Timer
Dim Result As Boolean
Dim n As Long
For n = 1 To Repetitions
Result = NotEquals(LeftValue, RightValue)
Next
Dim SumOfTime As Double
SumOfTime = Round(Timer - t, 4)
Debug.Print LeftValue; Tab(8); RightValue; Tab(16); SumOfTime; Tab(24); Result
TestNotEquals = SumOfTime
End Function