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
Updated to show using Match (with .Index) to find a value in a dimension of a two-dimensional array:
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: it’s worth illustrating here what @ARich pointed out in the comments – that using Index()
to slice an array has horrible performance if you’re doing it in a loop.
In testing (code below) the Index() approach is almost 2000-fold slower than using a nested loop.
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
Здравствуйте. Во вложении пример массива (D2:H2) |
|
Пытливый Пользователь Сообщений: 4652 |
#2 25.04.2016 11:23:50 Добрый день.
Кому решение нужно – тот пример и рисует. |
||
Sanja Пользователь Сообщений: 14849 |
#3 25.04.2016 11:26:47 Без массивов и прочих словарей
Прикрепленные файлы
Согласие есть продукт при полном непротивлении сторон. |
||
Пытливый, спасибо. На дальнейших примерах все корректно сработало. |
|
Sanja Пользователь Сообщений: 14849 |
#5 25.04.2016 12:47:28
Согласие есть продукт при полном непротивлении сторон. |
||
Михаил С. Пользователь Сообщений: 10514 |
#6 25.04.2016 13:14:15 VBA обязательно? |
Определение порядкового номера элемента в колекции |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Ксения
Знаток
(259),
закрыт
12 лет назад
Alexander Alenitsyn
Высший разум
(754460)
12 лет назад
В любом языке программирования записывается цикл по индексу
элемента, на каждом шаге цикла проверяется равенство элемента
числу 4, и если получается совпадение (т. е. равенство А (к) =4 имеет
значение “истина”), то запоминается этот номер (т. е. р=к) и сразу делается
выход из цикла.
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
Обновлено, чтобы показать, используя Match (с .Index), чтобы найти значение в измерении двумерного массива:
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: стоит ли здесь упомянуть то, что @ARich указал в комментариях – использование Index()
для среза массива имеет ужасную производительность, если вы делаете это в цикле.
При тестировании (код ниже) подход Index() почти в 2000 раз медленнее, чем использование вложенного цикла.
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