我需要为2个工作簿中的数据运行Vlookups。我将在运行VBA代码时打开两个工作簿,并将两个工作簿保存为.xlsm,因此它们都是宏启用的。
使用Vlookup Excel函数我没有问题,但我想使用VBA代码自动运行它。
以下是信息,
我有2个工作簿,Book3.xlsm和Book32.xlsm。 Book3是我想要的结果,如第二张图所示。数据范围每个月都不同,所以我需要循环到最后一行的末尾。
Book3 ID和Type和Result中有3列,Book32,ID和Result中有2列,我想使用Book3中的ID列进行Vlookup,并获取Book32中Result列中的值。这些数据都在Sheet1中。
现在我的代码会运行,但请查看第一张没有显示所需结果的图片。如果找不到,我可以将值保留为#N / A但是在这种情况下,应该使用Vlookup找到所有值。
这是我的代码,
Sub test()
On Error Resume Next
Dim Res_Row As Integer
Dim Res_Clm As Integer
Dim Table1 As Range
Dim Table2 As Range
Dim cl As Range
Set Table1 = Workbooks("Book3.xlsm").Sheets("Sheet1").Columns("A:C")
Set Table2 = Workbooks("Book32.xlsm").Sheets("Sheet1").Columns("A:B")
Res_Row = Sheet1.Range("C2").Row
Res_Clm = Sheet1.Range("C2").Column
For Each cl In Table1
Sheet1.Cells(Res_Row, Res_Clm) = Application.WorksheetFunction.VLookup(cl, Table2, 2, False)
Res_Row = Res_Row + 1
Next cl
MsgBox "Done"
End Sub
答案 0 :(得分:3)
这段代码如何避免循环并且更容易阅读\维护。
With Workbooks("Book3.xlsm").Sheets("Sheet1")
Dim lRow as Long
lRow = .Range("A" & .Rows.Count).End(xlup).Row
With .Range("C2:C" & lRow)
.FormulaR1C1 = "=Vlookup(RC[-2],[Book32.xlsm]Sheet1!C1:C2,2,0)"
.Value = .Value
End With
End With
答案 1 :(得分:1)
这是:
Sub test()
On Error Resume Next
Dim Res_Row As Integer
Dim Res_Clm As Integer
Dim Table1 As Range
Dim Table2 As Range
Set Table1 = Workbooks("Book3.xlsm").Sheets("Sheet1").Columns("A:C")
Set Table2 = Workbooks("Book32.xlsm").Sheets("Sheet1").Columns("A:B")
Res_Clm = 3
循环将在table1的每一行上。
For Each i In Table1.Rows
If Sheet1.Cells(i.row, 1) = "" Then Exit For
如果单元格中没有数据(""),则程序退出循环
Sheet1.Cells(i.row, Res_Clm) = Application.WorksheetFunction.VLookup(Sheet1.Cells(i.row, 1), Table2, 2, False)
Next i
接下来我增加每个循环的i ..就像i = i + 1
MsgBox "Done"
End Sub
对vlookup的第一个参数使用了错误的参数。 你的循环也是" cl"只能在三行上工作,所以我使用行参数。
一般来说,我愿意编写你的vlookup函数而不是使用Application.WorksheetFunction.VLookup。我很确定它会更长。