С вашим кодом довольно мало серьезных проблем. Не пытаясь быть резким, но, надеюсь, это поможет вам понять изменения, которые я предлагаю.
У вас есть две переменные для использования в качестве индексов (i
, k
), но вы только увеличиваете i
. k
остается неизменным все время. Вот почему вы получаете вывод только в 1 строку.
Вы также использовали цикл For Each
, который по существу добавляет еще один набор невидимых индексов для того же набора данных, который вы используете в i
. Вам лучше использовать For
цикл с i
, который избавит от необходимости i=i+1
, и создать enrange
.
Кроме того, в разделе оператора IF
вашего кода вы используете i
по обе стороны от знака =, поэтому вы выводите результат 1 на wsmacro
в той же строке что он найден на wsmain
.
Использование DestLastRow
вместо i
для выходной строки на wsmacro
также создаст вам проблемы, потому что он рассчитывается только один раз (у вас его нет внутри цикла), поэтому данные перезаписываются.
У вас есть 3 разных листа, по которым вы путешествуете, поэтому вам нужно 3 разных индекса.
Кроме того, wsmacro
и destsht
относятся к одной и той же таблице. Вам не нужны оба.
С учетом всего сказанного, вот мое непроверенное предложение:
Public Sub MainFileData2()
Dim iDest As Long, iMain As Long, iRef As Long
Dim MainLastRow As Long, RefLastRow As Long
Dim wbMacro As Workbook
Dim wbMain As Workbook
Set wbMacro = Workbooks.Item("MacroFile.xlsm")
Set wbMain = Workbooks.Item("SourceFile.csv")
Dim wsMacro As Worksheet
Dim wsMain As Worksheet
Dim wsRef As Worksheet
Set wsMain = wbMain.Worksheets.Item("SourceFileData")
Set wsRef = wbMacro.Worksheets.Item("Sheet1")
Set wsMacro = wbMacro.Worksheets("Data")
iMacro = 1 'Index for the destination sheet
MainLastRow = wsMain.Cells(wsMain.Rows.Count, 1).End(xlUp).Row
RefLastRow = wsRef.Cells(wsRef.Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
For iMain = 2 To MainLastRow 'Go through each row of wsMain
For iRef = 2 To RefLastRow 'For each row in the Main sheet, go through each row of the reference sheet
If wsMain.Cells(iMain, 1) = wsRef.Cells(iRef, 1) Then
wsMacro.Range("candnum").Offset(iMacro, 0) = wsMain.Cells(iMain, "B")
wsMacro.Range("candname").Offset(iMacro, 0) = wsMain.Cells(iMain, "C")
wsMacro.Range("estat").Offset(iMacro, 0) = wsMain.Cells(iMain, "E")
wsMacro.Range("ira").Offset(iMacro, 0) = wsMain.Cells(iMain, "G")
wsMacro.Range("wrkflw").Offset(iMacro, 0) = wsMain.Cells(iMain, "K")
wsMacro.Range("fln").Offset(iMacro, 0) = wsMain.Cells(iMain, "O")
wsMacro.Range("city").Offset(iMacro, 0) = wsMain.Cells(iMain, "R")
wsMacro.Range("country").Offset(iMacro, 0) = wsMain.Cells(iMain, "S")
iMacro = iMacro + 1 'Ensures the next output to wsMacro will go in the next row
Exit For 'The match has been found, so you can move on to the next row in wsMain without checking the rest of the rows in wsRef
End If
Next iRef
Next iMain
Application.ScreenUpdating = True
End Sub