Excel VBA - 具有不同文件名的 VLookup

Excel VBA - VLookup with Varying File Names

我正在尝试对没有常量名称的文件执行 vlookup。文件名由显示在两个文本框中的文件名确定。我已经开始设置 vLookup 方程,但我不确定当我 运行 宏时它出了什么问题。我从 vlookup 行收到类型不匹配错误,范围值似乎为空。有没有其他方法可以参考适用于这种情况的范围?感谢您的帮助。

'Populating the textbox
Private Sub openDialog1()

Dim fd As Office.FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
  .AllowMultiSelect = False
  .Title = "Please select the report."
  .Filters.Clear
  .Filters.Add "Excel 2003", "*.xls"
  .Filters.Add "All Files", "*.*"
  If .Show = True Then
    FilePath1 = .SelectedItems(1)'The full File path
    ary = Split(.SelectedItems(1), "\")'Splitting the file name from the file path
    TextBox1.Value = ary(UBound(ary))'Displaying just the file name and extension

  End If
End With
End Sub
'The second textbox is filled the same way.


'VLookup using a cell in File 1 vs. the column in File 2
Private Sub Vlookup()

Windows(TextBox2.Value).Activate
myFileName2 = ActiveWorkbook.Name
mySheetName2 = ActiveSheet.Name
myRangeName2 = Range("B2:B2000")

Windows(TextBox1.Value).Activate
Columns("F:F").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("F2").Select

Range("F2").Formula = "=VLOOKUP(E2,[" & myFileName2 & "]" & mySheetName2 & "!" & myRangeName2 & ",1,0)" ' Having issues with the syntax here.

Range("F2").Select
Selection.AutoFill Destination:=Range("F2:F2000")
End sub

myRangeName2 = Range("B2:B2000").Address 开始,得到 B2:B2000 部分。如果您的工作表名称可能包含 space,那么您将需要添加环绕标记(又名撇号),例如 '[Book1]Sheet 2'!$B:$B00。示例:

Range("F2:F2000").Formula = "=VLOOKUP(E2, '[" & myFileName2 & "]" & mySheetName2 & "'!" & myRangeName2 & ", 1, FALSE)"

刻度 在第一个方括号之前开始,在分隔 workbook/worksheet 与实际单元格区域的感叹号之前结束。

您会注意到上面的公式可以以相对 向下填充 的方式一次应用于所有单元格(取代单独的 .FillDown 操作)。 myRangeName2 需要表示绝对单元格地址(例如 $B$2:$B$2000),这是像 myRangeName2 = Range("B2:B2000").Address 一样使用时的默认值。有关详细信息,请参阅 Address property

附录:.外部地址:=True

虽然学习 workbook/worksheet/单元格范围地址的正确字符串构造从来都不是坏事,但可以通过将 , External:=True 参数添加到 [=17= 来直接检索整个内容] 检索。

myRangeName2 = ActiveWorkbook.ActiveSheet.Range("B2:B2000").Address(RowAbsolute:=1, ColumnAbsolute:=1, external:=True)
Range("F2:F2000").Formula = "=VLOOKUP(E2, " & myRangeName2 & ", 1, FALSE)"