VBA根据该文件中的单元格值打开Excel文件

问题描述

我一直在网上寻找这个问题的答案。我看到很多关于根据不在该文件中的单元格值打开 excel 文件博客和帖子。

我的问题:是否可以根据我尝试打开的文件中的单元格值打开文件?另一种表述方式:VBA 能否在未打开的文件搜索单元格值,然后在找到该单元格值时打开该文件

进一步说明:

我将系统中的报告保存到一个文件夹中,并且这些正在保存的文件具有一个通用名称(报告、报告 (1)、报告 (2)、报告 (3).....)。但是,报告中的数据是不同的。它们都有一个共同的单元格(单元格 A7),用于指定报告的用途。我想使用 VBA 代码根据单元格 A7 中的值打开这些文件之一。这甚至可能吗?

在此先感谢您的指导。

解决方法

如果您知道工作表名称,则可以使用 ExecuteExcel4Macro。如果不知道工作表名称,则可以使用 ADO 首先获取该名称(此处更容易,因为只有一张工作表)

示例:

Sub Tester()
    
    Const fldr As String = "C:\Excel\Temp\"
    Dim f,v
    
    f = Dir(fldr & "*.xlsx")
    'loop over all files in folder
    Do While Len(f) > 0
        'passing empty string for sheetname,since we don't know it...
        v = ReadCell(fldr,f,"",Range("A7").Address(True,True,xlR1C1))
        Debug.Print f,v
        f = Dir
    Loop

End Sub

'Read a cell value given a workbook path,name,optional sheetname,'  and cell address (R1C1 format)
Function ReadCell(fPath,wbName,wsName,addr)
    Const adSchemaTables = 20
    Dim cn,conStr,rs
    
    If Len(wsName) = 0 Then
        'sheet name is not known,so find the first name using ADO
        conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & fPath & wbName & "';" & _
                 "Extended Properties=""Excel 12.0;HDR=NO;IMEX=1;"";"
        Set cn = CreateObject("ADODB.connection")
        cn.Open conStr
        Set rs = cn.openschema(adSchemaTables)
        wsName = Replace(rs("TABLE_NAME").Value,"$","")
        rs.Close
        cn.Close
    End If
    
    ReadCell = ExecuteExcel4Macro("'" & fPath & "[" & wbName & "]" & _
                                  wsName & "'!" & addr)
    
End Function