Microsoft Access 掲示板

ADOでの接続について

1 コメント
views
4 フォロー

以下のようにすると、csvファイルに接続できます。

    yname = Environ("UserProfile") 'ユーザー名を取得

    'ADOを使用してCSVファイルに接続
    Set adoCn = CreateObject("ADODB.Connection") 'ADODBコネクションオブジェクトを作成
    adoCn.Provider = "Microsoft.ACE.OLEDB.12.0"
    adoCn.Properties("Extended Properties") = "Text;HDR=No"
    adoCn.Open yname & "\Desktop\VBA\hoge\hogehoge\"

    strSQL = "SELECT * FROM holiday.csv"

しかし、以下のようにするとエラーになります。  
    adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Properties=Text;HDR=No;" & yname & "\ Desktop\VBA\hoge\hogehoge\" '接続  
    strSQL = "SELECT * FROM holiday.csv"

そもそも、csvもexcelもデータベースとして扱っているはずなのに、
Data Source=を使用しないのは、なぜなのでしょうか?
モヤモヤが治まりません。

こういうものだと丸呑みして使っても、とりあえず問題ないのですが、
咀嚼しておいた方が、先々役に立つことがあるような気がして、質問させていただきました。

よろしくお願い致します。

タークン
作成: 2024/02/16 (金) 19:13:31
通報 ...
1

そもそも、csvもexcelもデータベースとして扱っているはずなのに、
Data Source=を使用しないのは、なぜなのでしょうか?

Data SourceはADODB.Connectionの必須プロパティになりますので
使用していない」 のではなく
タークンさんの記述方法では 「明示していない」 というのが正確な表現になります

Sub Sample1()
    Dim adoCn As ADODB.Connection
    Dim incantation As String
    Dim testDir As String
    
    testDir = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\VBA\hoge\hogehoge"
    
    Set adoCn = New ADODB.Connection
    adoCn.Provider = "Microsoft.ACE.OLEDB.12.0"
    adoCn.Properties("Extended Properties") = "Text;HDR=No"
    adoCn.Open testDir
    incantation = adoCn.ConnectionString
    adoCn.Close
    
    adoCn.Open incantation
    Debug.Print adoCn.State
    adoCn.Close
    Set adoCn = Nothing
    
    MsgBox "接続文字列中のData Sourceの位置は " & _
               InStr(1, incantation, "Data Source", vbTextCompare)
End Sub

  
ちなみに CSVをレコードセットとしてOpenするのが目的でしたら、以下のような簡略表記も可能です

Sub Sample2()
    Dim adoRs As ADODB.Recordset
    Dim testDir As String
    Dim strSQL As String
    
    testDir = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\VBA\hoge\hogehoge"
    strSQL = "SELECT * FROM [Text;DATABASE=" & testDir & ";HDR=NO;].holiday.csv;"
    
    Set adoRs = CurrentProject.Connection.Execute(strSQL)
    If Not adoRs.EOF Then MsgBox "CSVの列値: " & adoRs.Collect(0)
    adoRs.Close
    Set adoRs = Nothing
End Sub