Vlookup在2个工作簿中

时间:2016-11-07 14:34:44

标签: excel vba excel-vba

我需要为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

enter image description here enter image description here

2 个答案:

答案 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。我很确定它会更长。