Я добавил переменную, в которой хранится начальный номер строки, с которой начинается диапазон.
Также обратите внимание, что индекс i вашего массива связан с положением внутри диапазона.Когда вы делаете arr = .Range("A1:A10")
, вы создаете BIDIMENSIONAL массив из 10 ячеек (10x1).Индекс 1 будет ячейкой (1,1), индекс 2 будет ячейкой (2,1) и т. Д.
Таким образом, хитрость здесь заключается в том, чтобы сохранить номер строки, с которой начинается диапазон, а затем суммироватьindex.
Sub test()
Dim i As Long, arr As Variant
Dim rng As Range
Dim InitialRow As Long
With ThisWorkbook.Worksheets("Sheet1")
Set rng = .Range("A1:A10")
arr = rng.Value
InitialRow = Range(Left(rng.Address(False, False), Application.WorksheetFunction.Search(":", rng.Address(False, False)) - 1)).Row
For i = LBound(arr) To UBound(arr)
If arr(i, 1) = 4 Then
'Get the row that the array value apperas in Column A. The answer should be row number 8
Debug.Print InitialRow + i - 1 'this is the row number that matches the value
End If
Next i
Erase arr
End With
End Sub
Если я проверю это со значениями в `Range (" A1: A10 "), я получу в результате 8.

Но если я изменю положение значений, я получу другой результат с тем же кодом, потому что код хранит начальную строку диапазона.

Если ваш диапазон никогда не изменится, ни когда-либо начальная позиция, просто с индексом будет работать.Но если диапазон не должен начинаться всегда в одной и той же строке, вам нужно знать начальную строку и суммировать ее с индексом.
Надеюсь, этот код поможет вам и адаптируется к вашим потребностям.