ママのスキンケアのお悩みにおすすめアイテム

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

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

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

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

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

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBAからクエリのパラメータを設定したいです。

いつもお世話になっております。

クエリーは全く同じ内容ですが、
複数のフォームにパラメータを入力するユーザーインターフェースのため、ク
エリーを複数用意して、それぞれに
[forms]![F_TEST]![テキスト名]というパラメータを設定し、フォームの帳票やレポートの帳票に出力していま
した。

このクエリを一本にして、VBAから動的にパラメータを参照するフォームを指定
できないでしょうか?

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

Aベストアンサー

再びmaruru01です。
既存のクエリもVBAのSQLステートメント化をお奨めします。
それを標準モジュールに、

Public Sub myRunSQL(Para As String)

  Dim SQL As String

  SQL = "(SQL文の前の方)" & Para & "(SQL文の後ろの方)"
  DoCmd.RunSQL SQL

End Sub

という風にそれぞれのクエリを各プロシージャにしておけば、どこからでも呼び出せるわけです。
すでに作ってあるクエリを書き直すのは面倒ですが、一度書いてしまえばあとは楽です。
また、まったく同じじゃないんだけど結構似てるというクエリは、プロシージャをコピーして名前と中身をかえてやればすぐ出来るわけです。
ちなみに私は、基本的には、クエリもマクロも使用せず、すべてVBAで書いています。
では。

QAccess パラメータクエリーをVBAで実行

初めての質問になります、宜しくお願いします。

Access2007でのPG開発を行っています。

Insertのパラメータクエリーを作成してました(以下Q_Inst)。

VBA側でパラメータをセットして実行するとエラーが出てしまいます。

実行時エラー3265
要求された名前、または・・・

dbCmd.CommandText = "Q_Inst"
dbCmd.CommandType = adCmdStoredProc
dbCmd.Parameters.Refresh
dbCmd.Parameters("[ID]") = 1 ' ←ここでエラー
dbCmd.Parameters("[Name]") = TanakaTarou
dbCmd.Parameters("[Birth]") = "1980/12/01"

ADODB.Command をあまり使わないので勝手がいまいち分かりません。
SELECT、INSERT、UPDATEは今までdbCon.Execute(strSQL)でstrSQLの中にべた書きしてました。

エラーの対処方法をご教授お願い致しますm( _ _ )m

初めての質問になります、宜しくお願いします。

Access2007でのPG開発を行っています。

Insertのパラメータクエリーを作成してました(以下Q_Inst)。

VBA側でパラメータをセットして実行するとエラーが出てしまいます。

実行時エラー3265
要求された名前、または・・・

dbCmd.CommandText = "Q_Inst"
dbCmd.CommandType = adCmdStoredProc
dbCmd.Parameters.Refresh
dbCmd.Parameters("[ID]") = 1 ' ←ここでエラー
dbCmd.Parameters("[Name]") = TanakaTarou
dbCmd.Parameters("[Birt...続きを読む

Aベストアンサー

以下もみてください。

ADOでのパラメータクエリの使用例

http://www.accessclub.jp/ado/createparameter.html
http://www.accessclub.jp/ado/refresh.html

QACCESSでVBAから選択クエリの抽出条件を指定したい

選択クエリの抽出条件はデザインビューの「抽出条件」欄に直接条件式を書き込むのが普通だと思いますが、この条件式をVBAで記述することは出来るでしょうか?

DoCmd.RunSQL ではアクションクエリしか実行できないようだし、
DoCmsOpenQuery では引数に抽出条件を指定することが出来ないし困っています。

Aベストアンサー

おつかれさま~(^_^)
惜しいですね!
もう少しですね

さてさて、明日出張なので今日はたぶん最後のレスになってしまいますが、
ちなみに明日は返答できないのであしからず。。。

> Forms("サブフォーム").RecordSource = strSQL
駄目でしたか。。。

もし私が記載した内容で埋め込みのサブフォームを
利用しているのであれば
自分を参照する為に「Me」を使って

Me.埋め込みフォーム.Form.RecordSource = StrSQL
Me.埋め込みフォーム.Requery

に変更すれば動くと強く思います。
# 念じてます(^^)

ちなみに、
Me.
と打ち込んだ時点でオートコンプリート(名称あってるかな~)
機能が働いて参照できるオブジェクトが表示される
はずです。
その中にKojiさんが書いた埋め込みオブジェクトが
きっとあるはず
もしかすると"FormA"とか名前を付けたつもりでも
Visual Basic Editor君が気を利かせて
Form_formA
とかになってる場合があります。
最近やってないんでうろ覚えなんですが、こんな処を注意すれば大丈夫!

追伸
このコードって検索とかで使えますから
覚えておくときっと役に立ちますよ♪

おつかれさま~(^_^)
惜しいですね!
もう少しですね

さてさて、明日出張なので今日はたぶん最後のレスになってしまいますが、
ちなみに明日は返答できないのであしからず。。。

> Forms("サブフォーム").RecordSource = strSQL
駄目でしたか。。。

もし私が記載した内容で埋め込みのサブフォームを
利用しているのであれば
自分を参照する為に「Me」を使って

Me.埋め込みフォーム.Form.RecordSource = StrSQL
Me.埋め込みフォーム.Requery

に変更すれば動くと強く思います。
# 念じてま...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QVBAをつかってクエリの情報を抽出するには??

ACCESS VBAを使ってプログラムを組んでいるVBA初心者です。ヘルプやいろんなHPを参考にしているのですが、どうしてもわからないことがあるのでおしえてください。
クエリの情報をフォームの日付から抽出し、csvファイルを作成するというものを作ろうとしています。
クエリの抽出条件でフォームの日付の期間で抽出するようにしてあります。
VBAにてOpenRecordsetでクエリから情報を抽出しようとするのですがクエリがありませんとエラーをはかれてしまいます。クエリの指定方法がまちがっているのでしょうか?
また、以下の方法とは別の方法でクエリから抽出するやりかたがありましたら教えていただけませんでしょうか?よろしくお願いいたします。
以下にどのように記述しているか記します。
------------
Public Function value()
On Error GoTo ERRORRR
Set db = CurrentDb
Dim rs As Recordset

Set rs = db.OpenRecordset("[開通チェック]", dbOpenDynaset)
Debug.Print rs.EOF
Do Until rs.EOF
Debug.Print rs!ID
Debug.Print rs!登録状態
Debug.Print rs!開通年月日
rs.MoveNext
Loop
rs.Close: Set rs = Nothing
db.Close: Set db = Nothing
Exit Function
ERRORRR:
msgbox Err.number & ":" & Err.description
End Function

--------
開通チェック:クエリ (開通年月日には Between [Forms]![開通チェック]![開始日] And [Forms]![開通チェック]![終了日] の抽出条件が書かれています。)

使用しているACCESS Ver:ACCESS97

ACCESS VBAを使ってプログラムを組んでいるVBA初心者です。ヘルプやいろんなHPを参考にしているのですが、どうしてもわからないことがあるのでおしえてください。
クエリの情報をフォームの日付から抽出し、csvファイルを作成するというものを作ろうとしています。
クエリの抽出条件でフォームの日付の期間で抽出するようにしてあります。
VBAにてOpenRecordsetでクエリから情報を抽出しようとするのですがクエリがありませんとエラーをはかれてしまいます。クエリの指定方法がまちがっているのでしょうか?
...続きを読む

Aベストアンサー

パラメータがあるクエリはパラメータをParametersで入れてあげないと開けません。
パラメータを読み取れないのでRecordsetにクエリを渡せない状態でエラーが出ていると思います。

Dim db as Database
Dim qd as QueryDefs
Dim rs as Recordset
Dim pr1 As Date, pr2 As Date

Set db = CurrentDb()

pr1 = Format(Forms("開通チェック")("開始日"), "yyyy/mm/dd")
pr2 = Format(Forms("開通チェック")("終了日"), "yyyy/mm/dd")

Set qd = db.QueryDefs("開通チェック")
qd.Parameters("pr1").Value = pr1
qd.Parameters("pr2").Value = pr2

Set rs = qd.OpenRecordSet() 'ここでRecordsetにクエリを渡します。

これでいけると思います。

パラメータがあるクエリはパラメータをParametersで入れてあげないと開けません。
パラメータを読み取れないのでRecordsetにクエリを渡せない状態でエラーが出ていると思います。

Dim db as Database
Dim qd as QueryDefs
Dim rs as Recordset
Dim pr1 As Date, pr2 As Date

Set db = CurrentDb()

pr1 = Format(Forms("開通チェック")("開始日"), "yyyy/mm/dd")
pr2 = Format(Forms("開通チェック")("終了日"), "yyyy/mm/dd")

Set qd = db.QueryDefs("開通チェック")
qd.Parameters("pr1")....続きを読む

QAccess2000でVBAからパラメータクエリを実行

Access2000でフォームからの値を参照して実行するクエリを作りました。
SQLで表すと、以下のようなものです。

クエリ名:test
SELECT TEST.HAKKODTE FROM TEST
WHERE (((TEST.HAKKODTE)=Format([Forms]![F_メニュー]![txtNyukinDate],"yyyymmdd")));

このクエリをダブルクリックで実行すると問題なく実行できます。


これを、VBAからレコードを参照したいと思い、
以下のように記述しました。

Dim cn As ADODB.Connection
Set cn = CurrentProject.Connection

Dim rs1 As ADODB.Recordset
Set rs1 = New ADODB.Recordset

Dim sqlstr As String

sqlstr = "SELECT * FROM test;"

rs1.Open sqlstr, cn, adOpenKeyset, adLockOptimistic


しかし、Open処理で、「1つ以上の必要なパラメータの値が設定されていません」
というエラーになってしまいます。

VBAを実行するときに、[Forms]![F_メニュー]![txtNyukinDate]に
きちんと値は入力されています。

これを実行する方法はあるでしょうか?

Access2000でフォームからの値を参照して実行するクエリを作りました。
SQLで表すと、以下のようなものです。

クエリ名:test
SELECT TEST.HAKKODTE FROM TEST
WHERE (((TEST.HAKKODTE)=Format([Forms]![F_メニュー]![txtNyukinDate],"yyyymmdd")));

このクエリをダブルクリックで実行すると問題なく実行できます。


これを、VBAからレコードを参照したいと思い、
以下のように記述しました。

Dim cn As ADODB.Connection
Set cn = CurrentProject.Connection

Dim rs1 As ADODB.Recordset
S...続きを読む

Aベストアンサー

すみません、No.6です。補足です。

当方のテストでは "yyyy/mm/dd" を使いましたが、
テーブルの「HAKKODTE」列のデータ型によっては
違うと思います。


自作関数の
Function date_return() As Date
も、
takuchantikuさんの環境では
Function date_return() As String
が正解かもしれません。
(フォールドのデータ型のご提示が無いので適当にテストしました。)

ご自分の環境に合わせて適当に読み替えてください。
上記はあくまでもテストなので、適当です。


言いたかった事は…、
パラメータクエリをレコードセットして開きたい時は…。

・フォームの値を自作関数を使って(自作関数を経由させて)
クエリの抽出条件に(言わば間接的に)セットし、
・そのクエリをVBAで、"まんま"で実行する

というやり方です。

説明不足ですみませんでした。

QアクセスからVBAでエクセルに出力する方法

アクセスからVBAでエクセルに出力する方法
アクセスで下記のようなクエリの結果に対して、VBAにて会社毎のエクセルファイルを作成、
保存したいと思いますが、どのようにすればいいでしょうか?

ファイル名は、[KAISYA_MEI].xlsとし、それぞれをC:\ などに保存したい。

ちなみにExcel2003、Access2003を使用しています。

・アクセスのクエリ結果
KAISYA_ID  KAISYA_MEI  TANTOSYA_MEI     MAIL     TEL
1        ○○社        ***        ***@***0*-***-****
2        △△社        ***        ***@***0*-***-****
2        △△社        ***        ***@***0*-***-****
3        □□社        ***        ***@***0*-***-****
3        □□社        ***        ***@***0*-***-****

↓ 
ファイル名:○○社.xls のエクセルファイル
KAISYA_ID  KAISYA_MEI  TANTOSYA_MEI     MAIL     TEL
1        ○○社        ***        ***@***0*-***-****

↓ 
ファイル名:△△社.xlsのエクセルファイル
KAISYA_ID  KAISYA_MEI  TANTOSYA_MEI     MAIL     TEL
2        △△社        ***        ***@***0*-***-****
2        △△社        ***        ***@***0*-***-****

...


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

アクセスからVBAでエクセルに出力する方法
アクセスで下記のようなクエリの結果に対して、VBAにて会社毎のエクセルファイルを作成、
保存したいと思いますが、どのようにすればいいでしょうか?

ファイル名は、[KAISYA_MEI].xlsとし、それぞれをC:\ などに保存したい。

ちなみにExcel2003、Access2003を使用しています。

・アクセスのクエリ結果
KAISYA_ID  KAISYA_MEI  TANTOSYA_MEI     MAIL     TEL
1        ○○社        ***        ***@***0*-***-****
2   ...続きを読む

Aベストアンサー

もっぱらADOを使っておりますが、本課題はDAOの方が楽だと考え、諸サイトを参考に作成してみましたが、#2のリンク先で、DAOを用いているコードとほぼ同じですね。一時的なクエリを作成している(事前にダミーのクエリを作っておく必要なし)のが違っているのと、一時的なテーブルを作成していますが、これはdb.OpenRecordsetに直接SQLを与えてRecordsetを取得すれば必要がない様です。折角作ったので、ご参考までに載せておきます。テーブル名の記載がなかったので、「Table名」という名前のテーブルで記述しています。
'DAOに参照設定要
Sub test()
Dim db As DAO.Database
Dim qdf As QueryDef
Dim RS As DAO.Recordset
Dim mySQL As String, destFileName As String
Dim i As Integer

'重複しない会社名リストを作成、IDを用いる方がベター
Set db = CurrentDb
mySQL = "SELECT DISTINCT KAISYA_MEI INTO T_KAISHA_LIST FROM Table名;"
db.Execute mySQL
'会社名リストの各レコードについて処理
Set RS = db.OpenRecordset("T_KAISHA_LIST")
RS.MoveFirst
Do Until RS.EOF
mySQL = "SELECT * FROM Table名 WHERE KAISYA_MEI='" & RS(0) & "';"
'テンポラリクエリを作成
Set qdf = db.CreateQueryDef("Q_temp", mySQL)
DoCmd.SetWarnings False
'出力先エクセルファイルがすでに存在していれば削除
destFileName = "C:\" & RS(0) & ".xls"
If Dir(destFileName) <> "" Then Kill destFileName
'Access2000用コード
DoCmd.TransferSpreadsheet acExport, 8, "Q_temp", destFileName, True, ""
db.QueryDefs.Delete "Q_temp"
DoCmd.SetWarnings True
Set qdf = Nothing
RS.MoveNext
Loop
RS.Clone
Set RS = Nothing
db.Execute "Drop Table [T_KAISHA_LIST];"
db.Close: Set db = Nothing
End Sub

もっぱらADOを使っておりますが、本課題はDAOの方が楽だと考え、諸サイトを参考に作成してみましたが、#2のリンク先で、DAOを用いているコードとほぼ同じですね。一時的なクエリを作成している(事前にダミーのクエリを作っておく必要なし)のが違っているのと、一時的なテーブルを作成していますが、これはdb.OpenRecordsetに直接SQLを与えてRecordsetを取得すれば必要がない様です。折角作ったので、ご参考までに載せておきます。テーブル名の記載がなかったので、「Table名」という名前のテーブルで記述してい...続きを読む

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。

QACCESS2007 マクロ クエリのパラメータ代入

ACCESS2007を使用しています。

マクロで、パラメータ付きのクエリを動かしたいのですが、
どのようにパラメータをセットすればよいのでしょうか。

そのままマクロを実行すると、パラメータを要求するboxが表示されます。
本来なら、パラメータには初期値をセットして、何も手を加えずにマクロを実行したいのです。

よろしくお願いします。

Aベストアンサー

No.1です。

> この、「キー送信」というアクションがないような・・・

Access2007では、初期設定では、一部のアクションしか表示されなく
なっています。

「キー送信」など、全てのアクションを表示させるには、適当なマクロを
デザインビューで開いて、『デザイン』リボンの『表示/非表示』タブの
『すべてのアクションを表示』ボタンをクリックしてオン(オレンジ色表示)に
して下さい。

・・・なのですが・・・(汗)

> コードAには、[forms]![フォーム画面]![txtコードA]としています。

前回の回答は、「[forms]![フォーム画面]![txtコードA]」の形ではなく、
「[検索条件は?]」といった1組の角括弧で括ったパラメータを条件に
したものを想定していました(=フォームが開いているかどうかに関わらず
常にパラメータダイアログが出るタイプ)。
この場合でも「キー送信」でパラメータを渡すことはできるのですが、
前回回答でも触れたように、「キー送信」は確実性に欠けます。

ですので、フォーム参照型のクエリなのでしたら既に回答がある通り、
クエリ実行前にフォームを開くか、フォーム自体に今回のクエリを開く
ボタンを設置するか、で対応された方がよいと思います。

なお、フォームとクエリを開いた後、「閉じる」アクションを使って、すぐに
そのフォームを閉じているようでしたら、「フォームを開く」アクションでは
『ウィンドウ モード』引数を「非表示」にすることをお勧めしておきます。

また、今後「パラメータを初期値以外にしたい」といった場合があれば、
「フォームを開く」と「クエリを開く」の間に、「値の代入」を指定して、
「[forms]![フォーム画面]![txtコードA]」に値を入力することもできます
ので、併せて参考まで。


※Accessは、「現在開いているフォームの一覧」のようなものを内部に
 持っています(=Formsコレクション)。
 「[Forms]![フォーム画面]」というのは、このコレクションの中から、
 「フォーム画面」という名前のものを参照する、という意味です。
 従って、「フォーム画面」が開いていない状態では、コレクションに
 該当するものが見つからないため、パラメータダイアログで値が要求
 されることになります。

No.1です。

> この、「キー送信」というアクションがないような・・・

Access2007では、初期設定では、一部のアクションしか表示されなく
なっています。

「キー送信」など、全てのアクションを表示させるには、適当なマクロを
デザインビューで開いて、『デザイン』リボンの『表示/非表示』タブの
『すべてのアクションを表示』ボタンをクリックしてオン(オレンジ色表示)に
して下さい。

・・・なのですが・・・(汗)

> コードAには、[forms]![フォーム画面]![txtコードA]としています。

...続きを読む

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング