Option Explicit
Function SearchIn2DArray_Post1(vArr As Variant, strCrit As String)
Dim i As Long
Dim j As Long
SearchIn2DArray_Post1 = -1
For i = LBound(vArr, 1) To UBound(vArr, 1)
For j = LBound(vArr, 2) To UBound(vArr, 2)
If vArr(i, j) = strCrit Then
SearchIn2DArray_Post1 = i: GoTo Skipper
End If
Next j
Next i
Skipper:
End Function
Function SearchIn2DArray_Post2(vArr As Variant, strCrit As String)
Dim i As Long
Dim j As Long
Dim x As Variant
SearchIn2DArray_Post2 = -1
'For i = LBound(vArr, 1) To UBound(vArr, 1)
For j = LBound(vArr, 2) To UBound(vArr, 2)
x = Application.Match(strCrit, Application.Index(vArr, 0, j), 0)
If Not IsError(x) Then SearchIn2DArray_Post2 = x: GoTo Skipper
'If vArr(i, j) = strCrit Then
'SearchIn2DArray = i: GoTo Skipper
'End If
Next j
'Next i
Skipper:
End Function
Sub Check()
Const NumberOfRow = 100
Dim a(1 To NumberOfRow, 1 To 10), b(1 To 20), d As Double, i As Long, j As Long, p As Long, s As String, x
'--- Generate array data a, which will be used by two methods ---
For i = 1 To UBound(a, 1)
For j = 1 To UBound(a, 2)
a(i, j) = "Item " & i & " , " & j
Next j
DoEvents
Next i
'---------------------------------------------------------------------------------
'--- Generate array "item to be searched" b, which will be used by two methods ---
p = 0
For i = UBound(a, 1) - 1 To UBound(a, 1)
For j = 1 To UBound(a, 2)
p = p + 1
b(p) = a(i, j)
Next j
Next i
'---------------------------------------------------------------------------------
'--- Benchmark using method 1 ---
d = Timer
For i = 1 To UBound(b)
x = SearchIn2DArray_Post1(a, CStr(b(i)))
Next i
Debug.Print "Using method 1, run in : " & Format$(Timer - d, "0.00000") & " seconds"
Debug.Print "Return value of the last item checked = " & x 'Check the last item
'--------------------------------
'--- Benchmark using method 2 ---
d = Timer
For i = 1 To UBound(b)
x = SearchIn2DArray_Post2(a, CStr(b(i)))
Next i
Debug.Print "Using method 2, run in : " & Format$(Timer - d, "0.00000") & " seconds"
Debug.Print "Return value of the last item checked = " & x 'Check the last item
'--------------------------------
End Sub
Well well ... 
Here I have set up the test code for both of your UDF (using For..Loop and Application.Match)
Just run the code, and examine the result (I still don't understand why everybody is so afraid of looping) 
You can also change number of rows by changing the line with red color, for example from 100 to 10000
As for collection, no, collection won't make the UDF faster if it is used in your SearchIn2DArray() UDF, since this UDF is called as any time as number of items on Sheet1!A:A. In fact, it will be slower, since array operation (a simple variable) is much faster than collection (an object).
Bookmarks