プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。
Access2000のVBAで質問させてください。

現在、下記の様な状況です。
・「テーブルA」がある。
・「テーブルA」の"番号"が"1"のものだけを抽出する「抽出」クエリを作成
※クエリのデザインビューで"1"を指定するのでなく、
   VBA上で、パラメータとして"1"を指定したい
   1ではなく、2に変わる事もあるため、VBAで操作。
・結果をExcelに書き出したい

そこで、いろいろなサイトを見たのですが、
・VBAでパラメータを使用したクエリを作成
・Excelに書き出し
の2つの内容が別々に記載されており、
私の力では、別々で作成はできるのですが、
・VBAでパラメータを使用・設定したクエリをExcelに書き出し
する事はできませんでした。

本当に勝手で申し訳ございませんが、
 ・VBAでパラメータを使用・設定したクエリをExcelに書き出す
ソースを頂けないでしょうか?

「××と○○を組合わせればよい」などの、一部を抽出したコメントは、
不要ですので、本当に申し訳ございませんが、
ソースレベルでご返信頂ければと思います。
※一部を抽出したコメントは、ネットで見たのですが、結果、
 目的を達成することはできませんでした。

お手数で申し訳ございませんが、なにとぞ宜しくお願い致します。
※何度ひつこい・勝手ですみませんが、ソースレベルでの
回答のみお願いします。

A 回答 (1件)

クエリ「Q2」の内容が以下になっていると仮定します。

(「番号」は数値型 )

SELECT * FROM テーブルA WHERE 番号=[数字入力];

このクエリを開くと「数字入力」が表示され、入力すると抽出結果が表示されます。
以下を VBA で記述し実行してみます。

Public Sub testDAO()
  Dim rs As DAO.Recordset
  Dim i As Long

  With CurrentDb.QueryDefs("Q2")
    .Parameters("[数字入力]") = 1
    Set rs = .OpenRecordset
  End With
  If (Not rs.EOF) Then
    With CreateObject("Excel.Application")
      .WorkBooks.Add
      With .Range("A1")
        For i = 0 To rs.Fields.Count - 1
          .Offset(, i) = rs(i).Name
        Next
        .Offset(1).CopyFromRecordset rs
      End With
      .Visible = True
    End With
  End If
  rs.Close
  Set rs = Nothing
End Sub

Public Sub testADO()
  Dim rs As ADODB.Recordset
  Dim cat As New ADOX.Catalog
  Dim i As Long

  cat.ActiveConnection = CurrentProject.Connection
  With cat.Procedures("Q2").Command
    .Parameters("[数字入力]") = 1
    Set rs = .Execute
  End With
  If (Not rs.EOF) Then
    With CreateObject("Excel.Application")
      .WorkBooks.Add
      With .Range("A1")
        For i = 0 To rs.Fields.Count - 1
          .Offset(, i) = rs(i).Name
        Next
        .Offset(1).CopyFromRecordset rs
      End With
      .Visible = True
    End With
  End If
  rs.Close
  Set rs = Nothing
End Sub

前者がDAO、後者がADO
直接 Excel を起動し、新規 Book に抽出結果を転記して表示するまでです。
後は、
 .Parameters("[数字入力]") = 1
部分の値を、関数のパラメータにして受け渡しするとか・・・
フォームに入力した値を参照する様にするとか・・・・

※ .Offset(1).CopyFromRecordset rs でデータを転記してますが、
書式がチョッと・・・ってな場合には、
先に書式を設定してから CopyFromRecordset してみたりします。

※ DoCmd.TransferSpreadsheet を使いたい場合は、
「数字入力」部分をフォームで作成しておいて、
クエリではそのフォームを参照するようにします。(未検証)

参考にする/しないは、自己責任にてお願いします。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!