0

ユーザーから Excel(Book1.xls) ファイルを受け取りました。ワークシートの名前の 1 つが 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
4

2 に答える 2

0

「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

(テストされていない、1 つのシート/テーブルのみを想定している、改善が必要 (例: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
于 2013-09-25T20:42:50.470 に答える