【问题标题】:How to check if a worksheet exists in an excel file如何检查excel文件中是否存在工作表
【发布时间】:2018-09-05 23:00:07
【问题描述】:

我从用户那里收到一个 excel(Book1.xls) 文件,有时其中一个工作表名称是 XYZ,有时它的名称是 XYZ1。

我在做

 Dim Conn,Rs   
 Set Conn = CreateObject("ADODB.Connection")
 Conn.ConnectionTimeout = 10
 Conn.CommandTimeout = 300
 Conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Book1.xls;Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
 Set RS = Conn.Execute("SELECT * FROM [XYZ$B1:B1]")

当工作表名称为 XYZ1 时,上述代码的最后一行会出现错误消息: Microsoft Access 数据库引擎找不到对象“XYZ$CB1:B1”。确保对象存在并且正确拼写其名称和路径名。如果 'XYZ$CB1:B1' 不是本地对象,请检查您的网络连接或联系服务器管理员。

我想做的不是最后一行,而是

sheetNameString = Conn.Execute("SELECT Join(SheetName) from Book1.xls")

If InStr(sheetNameString,"XYZ1") Then
     Set RS = Conn.Execute("SELECT * FROM [XYZ1$B1:B1]")
Else
     Set RS = Conn.Execute("SELECT * FROM [XYZ$B1:B1]")
End If

【问题讨论】:

标签: excel vbscript


【解决方案1】:

在 conn.open 之后添加以下代码对我有用:

Dim Cat, Tbl, Tabs
Cat = CreateObject("ADOX.Catalog")
Cat.ActiveConnection = Conn
Tabs = Cat.Tables
For Each Tbl In Tabs
  'Tbl.Name holds the name
Next

【讨论】:

  • 抱歉,我花了一些时间来研究、编写和测试,所以我确信它有效。没有看到其他答案。
  • 您的回答也很有帮助。没问题 感谢您的帮助。
  • @Steve - +1 因为它是测试代码(而不是像我这样的空气代码)。
  • 这段代码中工作表名称在哪里定义?
【解决方案2】:

您可以使用“ADOX.Catalog”来获取数据库中的表列表:

Public Function getTableNames(oConn)
  Dim aRVal    : aRVal          = Array()
  Dim oCatalog : Set oCatalog   = CreateObject( "ADOX.Catalog" )
  Set oCatalog.ActiveConnection = oConn
  Dim oTable
  For Each oTable In oCatalog.Tables
      ReDim Preserve aRVal( UBound( aRVal ) + 1 )
      aRVal( UBound( aRVal ) ) = oTable.Name
  Next
  getTableNames = aRVal
End Function

If "XYZ1$" = getTableNames(Conn)(0) Then
     Set RS = Conn.Execute("SELECT * FROM [XYZ1$B1:B1]")
Else
     Set RS = Conn.Execute("SELECT * FROM [XYZ$B1:B1]")
End If

(未经测试,假设只有一张表/表格,需要改进(例如ReDim aRVal(oCatalog.Tables.Count - 1) 而不是ReDim Preserve),不确定是否会保留尾随的 $)

另一种方式:

Public Function getTableNames(oConn)
  Const adSchemaTables = 20
  Dim oRS   : Set oRS = oConn.OpenSchema(adSchemaTables)
  Dim aRVal : aRVal   = Array()
  Do Until oRS.EOF
     ReDim Preserve aRVal(UBound(aRVal) + 1)
     aRVal(UBound(aRVal)) = oRS.Fields("TABLE_NAME").Value
     oRS.MoveNext
  Loop
  getTableNames = aRVal
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 2023-03-04
    • 2018-09-08
    相关资源
    最近更新 更多