【问题标题】:VLookup using a Workbook that is not Open使用未打开的工作簿进行 VLookup
【发布时间】:2022-11-03 06:55:40
【问题描述】:

我有这个函数可以打开一个存储了我的查找表的工作簿,然后获取特定位置的单元格值并保存它,但是,我让这个函数针对不同的 VLookup 表重复了多次。有没有办法在不打开工作簿的情况下引用工作表?本质上,我希望替换 Workbooks.Open 函数,这样它就不会打开所有不同的工作簿。这只是使用Workbooks.Open 行的函数之一的示例

Function GetScopeFilename(axsunpart As String, sweeprate As Double) 
Dim wbSrc As Workbook, ws As Worksheet, position As Long

Set wbSrc = Workbooks.Open("C:\Users\Documents\LookupTable.xlsx")
Set ws = wbSrc.Worksheets("Scope Filename")

If sweeprate = 50 Then
    position = 2 
ElseIf sweeprate = 100 Then
    position = 3
ElseIf sweeprate = 200 Then
    position = 4
ElseIf sweeprate = "" Then
    MsgBox "No argument sweep rate value. Can be found. Check before running again."
    'Stop
End If

GetScopeFilename = WorksheetFunction.VLookup(axsunpart, ws.Range("A1:D4"), position, False)

End Function

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    编辑2:

    我找不到使用WorksheetFunction.VLookup 引用已关闭工作簿的方法(我很高兴听到有人可以这样做)。但是,它确实适用于 VLOOKUP 函数,当写入单元格时 - 使用 links

    1. 解决方法:链接和单元格公式 - 避免使用Workbooks.Open

    在可用单元格中编写公式,将值保存在变量中并清除单元格 - 例如单元格A1:

    Function GetScopeFilename(axsunpart As String, sweeprate As Double)
    Dim temp_cell As Range, position As Long
    set temp_cell = Range("A1") 'choose available cell at the moment
    
    'your if statements here
    
    With temp_cell
        .FormulaR1C1 = "=VLOOKUP(" & axsunpart & ",'C:UsersDocuments[LookupTable.xlsx]Scope Filename'!R1C1:R4C4," & position & ",False)"
        GetScopeFilename = .Value
        .Clear
    End With
    
    End Function
    

    旁注:尝试使用XLOOKUP function 而不是VLOOKUP - 一个简短的比较here。基本上它是VLOOKUPHLOOKUP 的组合。

    2.打开wb外部功能-保持Workbooks.Open

    虽然第一个解决方案应该更快,但如果您不想在单元格中写入并决定保留Workbooks.Open,则最好:

    在函数外打开工作簿并将其作为参数传递

    正如@MathieuGuindon 所指出的那样。这在多次调用该函数时很有帮助(搜索工作簿将只打开一次)。

    简化示例:

    Sub main()
        Dim wbSrc As Workbook
        'other variables omitted for simplicity
        Set wbSrc = Workbooks.Open(path_to_file)
        debug.print GetScopeFilename(wbSrc)
    end Sub
    
    Function GetScopeFilename(wbSrc As Workbook) 
        'function
    end Function
    

    【讨论】:

    • 因此,与其将Set wbSrc 等同于工作簿,不如将其设置为='C:UsersDocuments[LookupTable.xlsx]Scope Filename' !A1,然后我可以保持我的其余功能不变?
    • @resu_student,一开始我误解了.. 我认为WorksheetFunction.VLookup 不适用于封闭的工作簿。另一方面,在单元格中编写的VLOOKUP 函数可以工作 - 例如='C:UsersDocuments[LookupTable.xlsx]Scope Filename'!A1。暂时写入一个单元格然后从中读取值是可接受的解决方法吗?如果是,我可以更新我的解决方案。
    • 暂时在单元格中书写是什么意思?对于宏,我引用的工作簿在宏运行的整个过程中都是相同的。
    • @resu_student 我编辑了答案。希望它更清晰和有帮助。
    • 哦,我想我明白了,你的意思是进入一个特定的 Excel 单元格,然后使用该函数键入 =VLOOKUP 然后添加输入?
    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    相关资源
    最近更新 更多