2016-11-07 151 views
-1

我需要为2个工作簿中的数据运行Vlookups。我将在运行VBA代码时打开两个工作簿,并将两个工作簿都保存为.xlsm,以便它们都启用宏。2个工作簿中的Vlookup

我使用Vlookup Excel函数没有问题,但我想使用VBA代码自动运行它。

这里是信息,

我有2个工作簿,Book3.xlsm和Book32.xlsm。 Book3是我想要的结果,如第二张照片所示。数据范围每个月都有所不同,所以我需要遍历最后一行的末尾。

我在Book3 ID和类型和结果中有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

+1

我注意到,当查找值不是[从AZ排序](http://blog.contextures.com/archives/2016/03/03/excel-vlookup-sorting-problem/)或[最小到最大](https://www.ablebits.com/office-addins-blog/2014/08/27/excel-vlookup-not-working/)和[一些其他预期的东西](https://www.ablebits .com/office-addins-blog/2014/04/09/why-excel-vlookup-not-working /),我倾向于尽可能避免它,因为它在过去给我带来麻烦,我个人建议做一个改为UDF。 – Sgdva

回答

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 
+0

感谢您的快速回复,当我运行代码时,我有一个运行时错误9的下标超出范围,错误指向此行与工作簿(“Book3”)。表(“Sheet1”) – sc1324

+1

@ Johndi - 查看我的编辑并再试一次。很抱歉测试后,我发布为答案。 –

+0

再次感谢,当我运行代码时,它现在给我一个运行时错误1004,带有应用程序定义的或对象定义的错误,并且错误指向此行,.FormulaR1C1 =“= Vlookup(RC [-2 ],[Book32.xlsm]!Sheet1!C1:C2,2,0)“ – sc1324

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 

循环将是对表1的每一行。

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 = I +1

MsgBox "Done" 

End Sub 

您对vlookup的第一个参数使用了错误的参数。 你的循环“cl”只能在三行上工作,所以我使用了行参数。

一般来说,我会代之以编写你的vlookup函数而不是使用Application.WorksheetFunction.VLookup。我很确定它会更长。

+0

谢谢你能解释一下这些行和他们做什么吗?如果Sheet1.Cells(i.row,1)=“”则退出 Sheet1.Cells(i.row,Res_Clm)= Application.WorksheetFunction.VLookup(Sheet1.Cells(i.row,1),Table2,2,假) 下一个我 – sc1324

+1

@Johndi我编辑的帖子来解释这一行,但我认为你应该阅读一个基本的vba教程,而不是使用宏记录器。 – timat

相关问题