====== Microsoft Excel - Macros - Search - Search Binary ======
' Binary Search of array.
' Tries to find vCrit within oArrWithCrit.
' If found then return corresponding oArrWithValues otherwise vDefault.
' Note that due to way that binary search works this may not report on the very 1st instance of that vCrit if this
' was done sequentially. It will simply report on the 1st instance found and there may be various oArrWithValues
' data against the same vCrit.
Function ArrayFind(oArrWithCrit As Variant, vCrit As Variant, oArrWithValues As Variant, vDefault As Variant)
Dim low As Long
low = LBound(oArrWithCrit)
Dim high As Long
high = UBound(oArrWithCrit)
Dim i As Long
Dim result As Boolean
ArrayFind = vDefault
Do While low <= high
i = (low + high) / 2
If vCrit = oArrWithCrit(i, 1) Then
ArrayFind = oArrWithValues(i, 1)
Exit Do
ElseIf vCrit < oArrWithCrit(i, 1) Then
high = (i - 1)
Else
low = (i + 1)
End If
Loop
End Function
and
' Tries to find vCrit within oArrWithCrit.
' If found then returns vFoundValue otherwise vNotFoundValue.
' Note that due to way that binary search works this may not report on the very 1st instance of that vCrit if this
' was done sequentially. It will simply report on the 1st instance found and there may be various oArrWithValues
' data against the same vCrit.
Function ArrayFindEx(oArrWithCrit As Variant, vCrit As Variant, vFoundValue As Variant, vNotFoundValue As Variant)
Dim low As Long
low = LBound(oArrWithCrit)
Dim high As Long
high = UBound(oArrWithCrit)
Dim i As Long
Dim result As Boolean
ArrayFindEx = vNotFoundValue
Do While low <= high
i = (low + high) / 2
If vCrit = oArrWithCrit(i, 1) Then
ArrayFindEx = vFoundValue
Exit Do
ElseIf vCrit < oArrWithCrit(i, 1) Then
high = (i - 1)
Else
low = (i + 1)
End If
Loop
End Function