Dim pos, arr, val
arr=Array(1,2,4,5)
val = 4
pos=Application.Match(val, arr, False)
if not iserror(pos) then
Msgbox val & " is at position " & pos
else
Msgbox val & " not found!"
end if
actualiza para mostrar el uso del partido (con .index) para encontrar un valor en una dimensión de una matriz de dos dimensiones:
Dim arr(1 To 10, 1 To 2)
Dim x
For x = 1 To 10
arr(x, 1) = x
arr(x, 2) = 11 - x
Next x
Debug.Print Application.Match(3, Application.Index(arr, 0, 1), 0)
Debug.Print Application.Match(3, Application.Index(arr, 0, 2), 0)
EDIT: vale la pena que ilustra aquí lo @ARich señalado en los comentarios, que usar Index()
para cortar una matriz tiene un rendimiento horrible si lo haces en un bucle.
En las pruebas (código a continuación), el enfoque de índice() es casi 2000 veces más lento que el uso de un bucle anidado.
Sub PerfTest()
Const VAL_TO_FIND As String = "R1800:C8"
Dim a(1 To 2000, 1 To 10)
Dim r As Long, c As Long, t
For r = 1 To 2000
For c = 1 To 10
a(r, c) = "R" & r & ":C" & c
Next c
Next r
t = Timer
Debug.Print FindLoop(a, VAL_TO_FIND), Timer - t
' >> 0.00781 sec
t = Timer
Debug.Print FindIndex(a, VAL_TO_FIND), Timer - t
' >> 14.18 sec
End Sub
Function FindLoop(arr, val) As Boolean
Dim r As Long, c As Long
For r = 1 To UBound(arr, 1)
For c = 1 To UBound(arr, 2)
If arr(r, c) = val Then
FindLoop = True
Exit Function
End If
Next c
Next r
End Function
Function FindIndex(arr, val)
Dim r As Long
For r = 1 To UBound(arr, 1)
If Not IsError(Application.Match(val, Application.Index(arr, r, 0), 0)) Then
FindIndex = True
Exit Function
End If
Next r
End Function
y funciona! +1 ¡Realmente no sabía que se podía usar ese método Match match en una matriz VBA! –
Muchas de las funciones de la hoja de cálculo de Excel tienen un formulario similar disponible a través de Application.WorksheetFunction.[FunctionName] Tenga en cuenta que si suelta la parte de la función WorksheetFunction (como en mi ejemplo), entonces el valor de retorno de la función se puede probar con IsError(). Si incluye la parte Funcional de Hoja de Trabajo entonces (por ej.) Donde Match() no encuentra una coincidencia arrojará un error que necesitará capturar usando un manejador de error. –
¡Aseado! ¿La coincidencia también funciona en matrices multidimensionales? – aevanko