Там нет ничего плохого с синтаксисом и ваш код должен работать нормально.
Проблема с использованием функции рабочего листа, например Match
, Vlookup
и другими функциями поиска, заключается в том, что если поиск значения не найден, он вызывает ошибку.
В вашем случае вы пытаетесь выполнить поиск нескольких значений только в одной ячейке.
Итак, давайте скажем, что ваш lastrow
- 9. Вы код будет от Cell(2,1)
до Cell(9,1)
, если он находится в пределах Range("A" & lastrow)
или Range("A9")
.
Если значения из Cell(2,1)
через Cell(9,1)
это совпадает со значением в Range("A9")
, вы не получите сообщение об ошибке.
Теперь, если вы используете Range("A1:A" & lastrow)
, это, безусловно, будет работать, потому что вы пытаетесь сопоставить каждый элемент этого диапазона с самим собой и, безусловно, будет найдено совпадение.
WorksheetFunction.Match(Cells(2,1), Range("A1:A9")) 'will return 2
WorksheetFunction.Match(Cells(3,1), Range("A1:A9")) 'will return 3
'
'
'And so on if all elements are unique
Это не имеет значения, если вы используете Range("A9")
или Range("A1:A9")
.
Важно то, что вы обрабатываете ошибку в случае, если вы не нашли соответствия.
Один из способов заключается в использовании On Error Resume Next
и On Error Goto 0
вроде этого:
Sub ject()
Dim num As Variant
Dim i As Long, lastrow As Long: lastrow = 9
For i = 2 To lastrow
On Error Resume Next
num = WorksheetFunction.Match(Cells(i, 1), Range("A" & lastrow), 0)
If Err.Number <> 0 Then num = "Not Found"
On Error GoTo 0
Debug.Print num
Next
End Sub
Другой способ заключается в использовании Application.Match
над WorksheetFunction.Match
так:
Sub ject()
Dim num As Variant
Dim i As Long, lastrow As Long: lastrow = 9
For i = 2 To lastrow
num = Application.Match(Cells(i, 1), Range("A" & lastrow), 0)
Debug.Print num
'If Not IsError(num) Then Debug.Print num Else Debug.Print "Not Found"
Next
End Sub
Application.Match
работает точно так же, но не без ошибок когда он возвращается #N/A
. Поэтому вы можете присвоить его значение в переменной Variant
и использовать его позже в коде без каких-либо проблем. Еще лучше, используйте тест IsError
, чтобы проверить, не найдено ли значение, как показано выше в комментариях.
В обоих случаях выше, я использовал переменную Variant
типа num
.
Основная причина заключается в том, что он обрабатывает любое другое значение, если в случае, если совпадение не найдено.
Что касается синтаксиса Range, не путайте его, это довольно просто.
См. Ниже примеры.
Single Cell - Все относятся к A1
Cells(1,1) ' Using Cell property where you indicate row and column
Cells(1) ' Using cell property but using just the cell index
Range("A1") ' Omits the optional [Cell2] argument
Не смущайтесь с использованием индекса клеток. Это похоже на то, что вы нумеруете все ячейки слева направо, сверху вниз.
Cells(16385) ' refer to A2
Диапазон прилежащей клетки - все они относятся к A1: A10
Range("A1:A10") ' Classic
Range("A1", "A10") ' or below
Range(Cells(1, 1), Cells(10, 1))
Выше использует тот же синтаксис Range(Cell1,[Cell2])
, в котором первый один, опускает optional
аргумент [Cell2]
. И из-за того, ниже также работает:
Range("A1:A5","A6:A10")
Range("A1", "A8:A10")
Range("A1:A2", "A10")
несмежных ячеек - Все относятся к A1, A3, A5, A7, A9
Range("A1,A3,A5,A7,A9") ' Classic
Вы указываете начальную и конечные ячейки для диапазона - «A1: A» - это не то, что вы используете, но «A1: A3» для выражения диапазона - диапазон в одной ячейке может быть просто «A1: A1» и т. д. –
Хорошо, это имеет смысл для второй строки, но синтаксис для первого кажется странным. – equalizer
Я пошел дальше и отправил ответ, который попытался объяснить это чуть подробнее. Надеюсь, это поможет :) –