2015-05-22 29 views
1

Я не понимаю синтаксиса для диапазона.Синтаксис диапазона VBA EXCEL

Почему эта работа:

For i = 1 To 10 
    Range("A" & i & ":D" & i).Copy 
Next 

Но это не работает:

For i = 2 To lastRow 
    num = WorksheetFunction.Match(Cells(i, 1), Range("A" & lastRow), 0) 
Next  

Почему мне нужно использовать

For i = 2 To lastRow 
    'num = WorksheetFunction.Match(Cells(i, 1), Range("A1:A" & lastRow), 0) 
Next 

Что A1: средний? Почему я не могу использовать

Range("A" & lastRow), 0 
+0

Вы указываете начальную и конечные ячейки для диапазона - «A1: A» - это не то, что вы используете, но «A1: A3» для выражения диапазона - диапазон в одной ячейке может быть просто «A1: A1» и т. д. –

+0

Хорошо, это имеет смысл для второй строки, но синтаксис для первого кажется странным. – equalizer

+0

Я пошел дальше и отправил ответ, который попытался объяснить это чуть подробнее. Надеюсь, это поможет :) –

ответ

2

Там нет ничего плохого с синтаксисом и ваш код должен работать нормально.
Проблема с использованием функции рабочего листа, например 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, не путайте его, это довольно просто.
См. Ниже примеры.

  1. 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 
    

    Не смущайтесь с использованием индекса клеток. Это похоже на то, что вы нумеруете все ячейки слева направо, сверху вниз. enter image description here

    Cells(16385) ' refer to A2 
    
  2. Диапазон прилежащей клетки - все они относятся к 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") 
    
  3. несмежных ячеек - Все относятся к A1, A3, A5, A7, A9

    Range("A1,A3,A5,A7,A9") ' Classic 
    
+0

Я, очевидно, исправил. Я не понимал, что мой Excel VBA был настолько ржавым. Ответ обжалуется. –

+1

Спасибо! Диапазон («A1», «A» и lastRow), 0) работает, чтобы смотреть в диапазоне (от A1 до A9) с lastrow = 9. MUCH читать легче, чем Range («A1: A» и lastRow), 0) – equalizer

+0

L42, очень тщательный ответ, гораздо больше, чем я ожидал. Надеюсь, это поможет другим. – equalizer

1

Без каких-либо конкретных деталей о ошибке, я полагаю, что матч не возвращает значение, которое вы ожидаете, а скорее # N/A ошибка. Match имеет синтаксис

= матч (искомое_значение, lookup_range, тип_сопоставление)

lookup_range, как правило, состоит из ряда нескольких клеток, либо столбец с несколькими рядами или строку с несколькими столбцами.

В вашей формуле у вас есть только одна ячейка в lookup_range. Скажем Lastrow 10. Первые три трассы петли производит формулу

=Match(A2,A10,0) 
=Match(A3,A10,0) 
=Match(A4,A10,0) 

Это действует формула, но в большинстве случаев результат будет не матч, но ошибка. Принимая во внимание, что вы, вероятно, хотите,

=Match(A2,A1:A10,0) 

снова Глядя на ваш код, сшить вместе и найти, почему вы должны A1:A как строковая константа в формуле:

For i = 2 To lastRow 
    num = WorksheetFunction.Match(Cells(i, 1), Range("A1:A" & lastRow), 0) 
Next 
+0

num = WorksheetFunction.Match (Ячейки (i, 1), Диапазон («A» и lastRow), 0) дает ошибку времени выполнения 1004. Невозможно получить свойство соответствия класса функций Worksheet. Вы правы, что я искал A1: A10, просто не понял синтаксис – equalizer

Смежные вопросы