2016-04-18 8 views
0

Я написал следующий код, который я надеялся использовать для поиска значений из столбцов 21 до последней строки на другом листе и возврата их на этот лист на основе значения в колонке А в этом листе и колонке В на другом листе.Индекс/совпадение при циклировании по строкам и столбцам

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

Dim wsMvOld As Worksheet 
Dim wsMvFile As Worksheet 
Dim wsColumn As Long 
Dim lastColumn As Long 
Dim y As Integer 
Dim i As Integer 
Dim FrRngCount As Range 

Set wsMvOld = wbMVRVFile.Worksheets(2) 

wbMVRVFile.Worksheets.Add().Name = "MV " & Format(DateSerial(Year(Date), Month(Date), 0), "dd-mm-yy") 

Set wsMvFile = wbMVRVFile.ActiveSheet 

Set FrRngCount = wsMvFile.Range("A:A") 
y = Application.WorksheetFunction.CountA(FrRngCount) 

lastColumn = wsMvFile.Cells(1, wsMvFile.Columns.Count).End(xlToLeft).Column 

For wsColumn = 21 To lastColumn 
For i = 2 To y 
    wsMvFile.Columns(wsColumn).Cells(i) =  Application.Index(wsMvOld.Range(wsColumn), Application.Match(wsMvFile.Range("A" & i), wsMvOld.Range("B:B"), 0)) 
Next i 

Next wsColumn 

End Sub 

Благодарим за помощь!

+0

Забыл «WorksheetFunction» перед «индексом»? Но на самом деле почему все используют функции рабочего листа в VBA XD – findwindow

+0

Позвольте мне попробовать. Причина, по которой я использую функции рабочего листа, заключается в том, что я не знаю лучшего решения. Какие-либо предложения? –

+0

Посмотрите 'find'? – findwindow

ответ

3

Это не проверено, но оно заменяет функцию рабочего листа на метод поиска vba.

Private Sub Worksheet_Activate() 
Dim wsMvOld As Worksheet 
Dim wsMvFile As Worksheet 
Dim wsColumn As Long 
Dim lastColumn As Long 
Dim y As Integer 
Dim i As Integer 
Dim FrRngCount As Range 

Set wsMvOld = wbMVRVFile.Worksheets(2) 

Set wsMvFile = wbMVRVFile.Worksheets.Add() 
wsMvFile.Name = "MV " & Format(DateSerial(Year(Date), Month(Date), 0), "dd-mm-yy") 



Set FrRngCount = wsMvFile.Range("A:A") 
y = Application.WorksheetFunction.CountA(FrRngCount) 

lastColumn = wsMvFile.Cells(1, wsMvFile.Columns.Count).End(xlToLeft).Column 


For i = 2 To y 
    Dim rng As Range 
    Set rng = sMvOld.Range("B:B").Find(wsMvFile.Range("A" & i)) 
    For wsColumn = 21 To lastColumn 
     If Not rng Is Nothing Then 
      wsMvFile.Columns(wsColumn).Cells(i).Value = wsMvOld.Cells(rng.Row, wsColumn) 
     Else 
      wsMvFile.Columns(wsColumn).Cells(i).Value = 0 
     End If 
    Next wsColumn 
Next i 


End Sub 
+0

Так что хорошая новость в том, что ошибка ушла сейчас. Но макрос занимает много времени, и, похоже, он не заполняет столбцы. Любая идея почему? –

+0

Попробуйте отредактировать, я перевернул петли, теперь он только петли в столбце, если строка истинна. –

+0

Да, теперь это работает. Большое спасибо Скотту. Если я хотел бы показать ноль, если значение не может быть найдено на другом листе, есть ли простой способ изменить петлю? –

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