在 VBA 中使用 VLookup 引用另一个 Excel 文件
Using VLookup in VBA to reference another Excel file
我正在尝试在 VBA 中编写引用另一个文件的 VLookup Table。以下是我的目标的简单概述:
- 在另一个 Excel 文件的单元格 A2 中查找值
- 从另一个 Excel 文件的第 2 列中提取信息并放入单元格 B2
- 转到单元格 A3 并重复该过程,直到 A 列中没有更多条目为止
这是我已有的代码。我不断收到一条错误消息 "Unable to get the VLookup property of the WOrksheetFunction class." 我检查了引用该错误的其他帖子,但它们没有任何帮助。你们都看到我的代码有错误吗?或者谁有更好的方法来完成这个任务?
Sub SBEPlannerAdder()
Dim wbk As Workbook
Set wbk = Workbooks.Open("C:\Users\user\Documents\Support File\Planner.xlsx")
With Sheets("Sheet1")
' Selects the first cell to check
Range("A2").Select
Dim x As Variant
x = wbk.Worksheets("Sheet1").Range("A1:C1752")
' Loops through all rows until an empty row is found
Do Until IsEmpty(ActiveCell)
Range(ActiveCell.Offset(0, 1) & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup((ActiveCell.Column & ActiveCell.Row), x, 2, 0)
ActiveCell.Offset(1, 0).Select
Loop
End With
Call wbk.Close(False)
End Sub
当您打开工作簿时,它会成为活动工作簿。您似乎从未将控制权交还给目标工作簿。
Sub SBEPlannerAdder()
Dim rw As Long, x As Range
Dim extwbk As Workbook, twb As Workbook
Set twb = ThisWorkbook
Set extwbk = Workbooks.Open("C:\Users\user\Documents\Support File\Planner.xlsx")
Set x = extwbk.Worksheets("Sheet1").Range("A1:C1752")
With twb.Sheets("Sheet1")
For rw = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
.Cells(rw, 2) = Application.VLookup(.Cells(rw, 1).Value2, x, 2, False)
Next rw
End With
extwbk.Close savechanges:=False
End Sub
请参阅 How to avoid using Select in Excel VBA macros 了解更多摆脱依赖的方法 select 并激活以实现您的目标。
这取决于您打算一次性还是重复执行此操作。我反复假设,因为手动执行此操作并不是那么困难。
我首先要看的是你的论点。前两个应该是范围。所以说清楚一点,也许你可以做类似
的事情
Dim x As Range
set x = wbk.Worksheets("Sheet1").Range("A1:C1752")
...
Range(ActiveCell.Offset(0, 1) & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Range(Activecell.Address), x, 2, 0)
重要的一点是确保您的前两个参数是 Vlookup 函数的范围。
我正在尝试在 VBA 中编写引用另一个文件的 VLookup Table。以下是我的目标的简单概述:
- 在另一个 Excel 文件的单元格 A2 中查找值
- 从另一个 Excel 文件的第 2 列中提取信息并放入单元格 B2
- 转到单元格 A3 并重复该过程,直到 A 列中没有更多条目为止
这是我已有的代码。我不断收到一条错误消息 "Unable to get the VLookup property of the WOrksheetFunction class." 我检查了引用该错误的其他帖子,但它们没有任何帮助。你们都看到我的代码有错误吗?或者谁有更好的方法来完成这个任务?
Sub SBEPlannerAdder()
Dim wbk As Workbook
Set wbk = Workbooks.Open("C:\Users\user\Documents\Support File\Planner.xlsx")
With Sheets("Sheet1")
' Selects the first cell to check
Range("A2").Select
Dim x As Variant
x = wbk.Worksheets("Sheet1").Range("A1:C1752")
' Loops through all rows until an empty row is found
Do Until IsEmpty(ActiveCell)
Range(ActiveCell.Offset(0, 1) & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup((ActiveCell.Column & ActiveCell.Row), x, 2, 0)
ActiveCell.Offset(1, 0).Select
Loop
End With
Call wbk.Close(False)
End Sub
当您打开工作簿时,它会成为活动工作簿。您似乎从未将控制权交还给目标工作簿。
Sub SBEPlannerAdder()
Dim rw As Long, x As Range
Dim extwbk As Workbook, twb As Workbook
Set twb = ThisWorkbook
Set extwbk = Workbooks.Open("C:\Users\user\Documents\Support File\Planner.xlsx")
Set x = extwbk.Worksheets("Sheet1").Range("A1:C1752")
With twb.Sheets("Sheet1")
For rw = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
.Cells(rw, 2) = Application.VLookup(.Cells(rw, 1).Value2, x, 2, False)
Next rw
End With
extwbk.Close savechanges:=False
End Sub
请参阅 How to avoid using Select in Excel VBA macros 了解更多摆脱依赖的方法 select 并激活以实现您的目标。
这取决于您打算一次性还是重复执行此操作。我反复假设,因为手动执行此操作并不是那么困难。
我首先要看的是你的论点。前两个应该是范围。所以说清楚一点,也许你可以做类似
的事情Dim x As Range
set x = wbk.Worksheets("Sheet1").Range("A1:C1752")
...
Range(ActiveCell.Offset(0, 1) & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Range(Activecell.Address), x, 2, 0)
重要的一点是确保您的前两个参数是 Vlookup 函数的范围。