【问题标题】:VBA Excel get workbook object from closed file or refer to Excel SQL Table by sheet indexVBA Excel 从关闭的文件中获取工作簿对象或通过工作表索引引用 Excel SQL 表
【发布时间】:2021-05-30 04:56:49
【问题描述】:

我希望能够在不打开工作簿的情况下定义一个 Workbook 对象并获取有关其 Worksheets 对象的信息。

我有一个工作簿的名称/路径和一个代表Worksheet 的索引,我想获取工作表的名称。

此外,我想这样做的原因是,我随后想将关闭的工作簿中的工作表作为可以使用 SQL 语句进行操作的 Excel 表来引用。

所以最终我需要能够构造一个字符串,例如“SELECT * FROM [Sheet1$]”,其中“Sheet1”是已知索引引用的已关闭工作簿中工作表的名称。

所以一个更准确的问题是我可以通过索引而不是名称来引用 SQL 语句中的工作表吗?

但如果没有,是否可以将工作表对象设置为已关闭工作簿中的工作表?

这可行,但显然我打开和关闭文件。感谢您的任何帮助/见解


Option Explicit

Sub get_sheetname_from_index()

  Dim full_path_and_name As String
  full_path_and_name = Application.ThisWorkbook.Path & _
    Application.PathSeparator & "test_file.xlsx"
  
  Dim index As Long
  index = 1
  
  Dim wb As Workbook
  Set wb = Application.Workbooks.Open(full_path_and_name, ReadOnly:=True)
    
  Dim closed_file_sheet_name As String
  closed_file_sheet_name = wb.Worksheets(index).Name
  
  Dim x As Worksheet
  Set x = wb.Sheets(1)
 wb.Close savechanges:=False
  
  Debug.Print closed_file_sheet_name
  
  
  ' USe the file name here
  Dim connection As New ADODB.connection
  connection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data _
    Source= " & full_path_and_name & _
    ";Extended Properties=""Excel 12.0;HDR=YES;"""
  connection.Open
  
  
  Dim sql As String
  sql = "SELECT * FROM [" & closed_file_sheet_name & "$]"
  
  Dim rs As New ADODB.Recordset
  
  rs.Open sql, connection
  While Not rs.EOF
    Debug.Print rs.Fields(0).Name, rs.Fields(0).Value
    rs.MoveNext
  Wend
  
  rs.Close
  connection.Close
  

End Sub


【问题讨论】:

  • 你试过ADO connection to Excel吗?
  • 嗨@astentx 感谢您抽出宝贵的时间:是的,这就是我正在做的,但问题是我只知道工作表序数,而不知道工作表名称。我查看了您引用的链接,但我没有看到如何使用工作表序数来定义输入表范围
  • 工作表“序数”到底是什么意思?
  • 为什么不使用 Power-Query? support.microsoft.com/en-us/office/…
  • @JohnnieL 这是自 2016 年以来 Excel 365 中的一项功能。它允许您从已关闭的工作簿中提取工作表的内容,然后按照您认为合适的方式操作数据。甚至添加您自己的自定义字段。值得你花时间学习它

标签: sql excel vba adodb


【解决方案1】:

这是一种无需打开工作簿即可获取工作表名称以及工作簿中任何命名范围的名称的方法。

不确定它如何/是否可以与工作表索引一起使用。

Sub GetSheetAndRangeNames()
Dim con As Object
Dim cat As Object
Dim tbl As Object

    Set con = CreateObject("ADODB.Connection")
    con.Provider = "Microsoft.ACE.OLEDB.12.0;Data Source=c:\Users\Norie\Documents\Test.xlsx;Extended Properties='Excel 12.0 Xml';"
    con.Open
    Set cat = CreateObject("ADOX.Catalog")
    Set cat.ActiveConnection = con

    For Each tbl In cat.Tables
        Debug.Print tbl.Name
    Next tbl

End Sub

【讨论】:

  • 谢谢@norie - 这对我很实用:我可以设置一个目录对象并访问Tables(index).name
【解决方案2】:

使用 Dao,您可以通过索引号获取工作表名称。索引从 0 开始。

Sub getDaoTableName()
    Dim fn As String
    Dim conn As Object, db As Object
    Dim tbl As Object
    
    fn = ThisWorkbook.Path & Application.PathSeparator & "test_file.xlsx"

    Set conn = CreateObject("DAO.DBEngine.120")
    Set db = conn.OpenDatabase(fn, False, True, "Excel 12.0 Xml;HDR=Yes;")
    
    Set tbl = db.TableDefs(0) ' 0 is Sheets(1) : 1 is Sheets(2)
    MsgBox tbl.Name

    Set db = Nothing
    Set conn = Nothing

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    相关资源
    最近更新 更多