使用getopenfilename和vlookup从封闭的工作簿中获取数据

时间:2018-10-26 23:25:30

标签: excel vba vlookup getopenfilename

我想使用GetOpenFileName和VLOOKUP从封闭的工作表中提取数据,但是我是VBA的新手,并不熟悉语法。

我一直遇到未指出错误之处的“自动化错误”或“对象错误”。 我相信我在VLOOKUP中的范围arg不正确,但是不确定应该是什么。 有人可以帮我吗?

Sub GetAmazonInventory()

Dim wbk As Workbook
Set wbk = Workbooks.Open(FileName:=Application.GetOpenFilename, ReadOnly:=True)
wbk.Activate

Dim shtName As String
shtName = wbk.Worksheets(1).Name

Dim sh As Worksheet
Set sh = wbk.Worksheets(shtName)

wbk.Close

ActiveCell.Value = Application.IfError(Application.VLookup(ActiveCell.Offset(0, -12), sh.Range("A2:F900"), 5, False), 20)

End Sub

2 个答案:

答案 0 :(得分:2)

发生错误的原因是您已关闭工作簿,并且仍在尝试从已关闭的工作簿中提取范围。

如果您想保持新工作簿的打开状态,但使用原始ActiveCell的范围,则可以为该单元格创建一个变量。

Sub GetAmazonInventory()

    ' Set a reference to your 'Active Cell'
    Dim myCell As Range
    Set myCell = ActiveCell

    Dim wbk As Workbook, ws As Worksheet
    Set wbk = Workbooks.Open(Filename:=Application.GetOpenFilename, ReadOnly:=True)
    Set ws = wbk.Worksheets(1)

    myCell.Value = Application.IfError(Application.VLookup(myCell.Offset(0, -12), _
            ws.Range("A2:F900"), 5, False), 20)

    wbk.Close

End Sub
  

侧面说明:您无需仅设置工作表就获得工作表的名称。所以我删除了。

     

我还将添加一些验证,以确保活动单元至少在正确的列/行中。例如,如果您的活动单元格应始终位于B列中,则类似以下内容:

If myCell.Column <> 2 then
    Msgbox "ActiveCell is not in the correct column. Please reselect!"
    Exit Sub
End If

答案 1 :(得分:1)

您可以在工作表上引用带有VLOOKUP公式的已关闭工作簿。关闭工作簿之前,您需要存储一个字符串,该字符串代表该范围的完整限定路径。

由于您未指明ActiveCell是什么,因此请使用偏移量

Sub GetAmazonInventory()

    Dim wbk As Workbook, addr as string

    Set wbk = Workbooks.Open(FileName:=Application.GetOpenFilename, ReadOnly:=True)
    addr = wbk.Worksheets(1).Range("A2:F900").address(external:=true)
    wbk.Close

    ActiveCell.formula = "=iferror(vLookup(" & ActiveCell.Offset(0, -12).address(0, 0) & _
                           ", " & addr & ", 5, False), 20)"

End Sub