2016-05-29 3 views
0

Я пытаюсь реализовать макрос, который будет копировать результаты из другого листа на основе значений ячеек на активном листе. т.е. цикл по каждому элементу в GWworkStations() « и найти соответствие в столбце В„„Col Список““ листа, а затем скопировать соответствующие значения в» C: Е» к массиву MathedEntries «, поэтому я могу скопировать их обратно на активный лист. Однако приведенный ниже код возвращается пустым для «matchedRow», вместо того, чтобы сообщать номер строки. Может кто-нибудь помочь, пожалуйста? Я не могу понять, где проблема? Я не получаю сообщение об ошибке при запуске этого кода. Заранее спасибо.Соответствие строк в VBA с другого листа

dim MatchedEntries() as string 
dim GWworkStations() as variant 
number_of_rows = ActiveSheet.UsedRange.Rows.Count 

With ActiveWorkbook.Worksheets("New Sheet") 
GWworkStations() = range("B2:B" & number_of_rows)  

End With 

ReDim MatchedEntries(1 To r) 'Size the array to hold the results. 
'for every cell that is not empty in GWworkStations(), search through column B of 'Col List ' sheet. 
For i = 1 To number_of_rows 

'matchedRow = Empty 
On Error Resume Next 'Keep running if Excel MATCH function below doesn't find a match. 
If Not IsEmpty(Cells(i, 1)) Then 
    matchedRow = Application.WorksheetFunction.Match(GWworkStations(i, 1), range("Col List!B:B"), 0) 

    If matchedRow = Empty Then Debug.Print "Empty " & matchedRow 
    If IsEmpty(matchedRow) Then 'No match.   
     MatchedEntries(i, 1) = "" 'GWworkStations(i, 1) 
    Else 
    'If GWworkStations(i, 1) = GWworkStations(i - 1) Then 

     If IsNumeric(matchedRow) Then 'Match was found. 

      MatchedEntries(i, 1) = Application.WorksheetFunction.Index(range("List!C:E"), matchedRow, 1) 
     Else 'MATCH function returned a non-numeric result. 
      MatchedEntries(i, 1) = "" 
     End If 'IsNumeric(MatchedRow) 
    End If 'IsEmpty(MatchedRow) 
    Else 
End If 
Next i 
range("E2:G" & number_of_rows) = MatchedEntries() 'Write the tag name results out to range E:G. 

ответ

0

Excel не любит пространство в названии листа. Вы можете исправить это, используя одинарные кавычки: Range("'Col List'!B:B"), или заменяя Range("Col List!B:B") на Sheets("Col List").Columns(2).

Вы также можете использовать Range.Find метод (который я предпочел бы):

matchedRow = Sheets("Sheet 3").Columns(2).Find(str).Row 
+0

@arcadeprecint большое спасибо за ответ. – Gudbahri

+0

@arcadeprecint, если я хочу изменить макрос для поиска нескольких вхождений на другом листе и скопировать соседние ячейки на активный лист, что было бы лучшим способом сделать это? – Gudbahri

+0

@ Gudbahri вы должны задать новый вопрос. Однако ссылки на разные рабочие листы не должны быть трудными? Вы делаете это в своем коде уже. Пожалуйста, не забудьте сначала попробовать. Просмотрев вышеприведенный код, у меня есть два неотложных предложения, которые помогут вам: Используйте «Опции Явно» (Google, что это значит). Это поможет вам написать когерентный код. Кроме того, не используйте 'On Error Resume Next' или, по крайней мере, деактивируйте его после соответствующей строки. Это причина, по которой вы не получаете сообщений об ошибках и очень плохой практике! (опять же, google, что это значит и как его использовать) – arcadeprecinct

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