投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/10/21 16:28:00
> VBAでADOでシート名を取得する場合の質問をさせて頂きたいです
CreateObject("Excel.Application") では都合が悪いという状況でしょうか。


> ワークブックの一番左のシート名の取得
> (sheets(0).name みたいな)
Excel のワークシートは 1 から始まるものだったはずでは…?

現状のコードだと、引数の SNo As Long が、そのインデックスにあたると思います。
ただしこちらは 0 から始まる番号です。
また、OLE DB Provider 側の仕様で、シート名の末尾に $ を付けた名前として返却されます。


> Set adoCat = New ADOX.Catalog
ADODB は参照設定なしで動くようにしているのに、
ADOX の方は CreateObject を使わず、参照設定を必須にしている点に違和感があります。

そもそも参照設定しているのなら、 As Object にするのではなく、
それぞれの固有型の変数として宣言した方が良いと思いますよ。


あるいは、ADOX を使わないスタイルもありますね。
(スキーマを取得するという点では同じことですが)

試しに、シート名の配列を返すようにしてみました。
今回は Excel のように 1 から始まる番号で返すようにしています。

Function GetSheetNames(ByVal excelFile As StringAs String()
    Dim sheetNames() As String

    Const adUseClient As Long = 3&
    Const adSchemaTables As Long = &H14&
    Dim cn As Object, rs As Object
    Set cn = CreateObject("ADODB.Connection")
    cn.Provider = "Microsoft.ACE.OLEDB.12.0"
    cn.Properties("Extended Properties") = "Excel 12.0;HDR=NO;IMEX=1"
    cn.Open excelFile
    Set rs = cn.OpenSchema(adSchemaTables)  'ADOX を使わずにスキーマを取得 
    ReDim sheetNames(1 To rs.RecordCount)
    Dim idx As Long
    idx = 0&
    Do Until rs.EOF
        idx = idx + 1&
        sheetNames(idx) = rs.Collect("TABLE_NAME")
        If sheetNames(idx) Like "*$" Then   '末尾の $ を除去 
            sheetNames(idx) = Left(sheetNames(idx), Len(sheetNames(idx)) - 1)
        End If
        rs.MoveNext
    Loop
    rs.Close
    cn.Close
    
    Set GetSheetNames = sheetNames
End Function