Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
ADOを使って抽出クエリに抽出条件を受けわたす
投稿日時: 18/11/27 00:43:26
投稿者: mmiwa

よろしくお願いします
アクセスのファイルに
ID、名前 の二つのフィールドを持った「T1」と
 select ID, 名前 from T1 where ID = [inpara];というクエリ「Q1」を
作成しました
エクセルからADOを使って
パラメーター[inpara]に抽出条件を与え
クエリ結果を取得したいと考えています
 
Dim myCat As New ADOX.Catalog
Dim myCMD As ADODB.Command
Dim myRS As New ADODB.Recordset
 
myCat.ActiveConnection = プロバイダ & "Data Source=" & データファイル
 
Set myCMD = myCat.Procedures("Q1").Command
 
myCMD.Parameters("[inpara]") = 2
 
myRS.Open myCMD
 
Cells(1,1).copyfromrecordset myRS
 
Set myCMD = Nothing
 
を走らせてもエラーは出ないものの
データを抽出することが出来ません
(recordcount = -1の状態です)
 
どこを修正したら良いでしょうか?
どなたかお教えください
 

回答
投稿日時: 18/11/27 09:53:54
投稿者: sk

引用:
アクセスのファイルに
ID、名前 の二つのフィールドを持った「T1」と
 select ID, 名前 from T1 where ID = [inpara];というクエリ「Q1」を
作成しました
エクセルからADOを使って
パラメーター[inpara]に抽出条件を与え
クエリ結果を取得したいと考えています

(標準モジュール)
-----------------------------------------------------------------
Sub subLoadRecords()
 
    Dim cn As ADODB.Connection
    Dim cmd As ADODB.Command
    Dim prm As ADODB.Parameter
    Dim rs As ADODB.Recordset
    Dim strFileName As String
     
    strFileName = "C:\FolderName\DatabaseName.accdb"
     
    Set cn = New ADODB.Connection
    With cn
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileName & ";"
        .CursorLocation = adUseClient
        .Open
    End With
     
    Set cmd = New ADODB.Command
    With cmd
        Set .ActiveConnection = cn
        .CommandType = adCmdStoredProc
        .CommandText = "Q1"
        Set prm = .CreateParameter("inpara", adInteger, adParamInput)
        prm.Value = 2
        .Parameters.Append prm
        Set rs = .Execute
    End With
         
    If rs.EOF Then
        MsgBox "該当するレコードがありません。", _
               vbExclamation, _
               "レコードなし"
    Else
        'Cells.ClearContents
        Cells(1, 1).CopyFromRecordset rs
    End If
     
    rs.Close
    Set rs = Nothing
    Set prm = Nothing
    Set cmd = Nothing
    cn.Close
    Set cn = Nothing
 
End Sub
-----------------------------------------------------------------
 
以上のようなコードを実行なさればよろしいかと。

投稿日時: 18/11/27 17:03:22
投稿者: mmiwa

skさん ありがとうございました
  
    With cmd
        Set .ActiveConnection = cn
        .CommandType = adCmdStoredProc
        .CommandText = "Q1"
        Set prm = .CreateParameter("inpara", adInteger, adParamInput)
        prm.Value = 2
        .Parameters.Append prm
        Set rs = .Execute
    End With
  
がっちり定義が必要なんですね
もし名前フィールドにパラメータを設定した場合はどうしたら良いですか?
adInteger⇒adChar 2⇒"'伊藤'"
  
        Set prm = .CreateParameter("inpara", adChar, adParamInput)
        prm.Value = "'伊藤'"
        .Parameters.Append prm
  
ではエラーでした

投稿日時: 18/11/27 17:29:00
投稿者: mmiwa

すみません
 
        Set prm = .CreateParameter("inpara", adChar, adParamInput, 255)
        prm.Value = "伊藤"
 
とサイズを指定することで解決できました
お騒がせしました
 
skさん ありがとうございました