• 締切済み

Access VBAでパラメータクエリをSQL文へ

すみません、、初めて質問しますが、 お手柔らかに宜しくお願い致します。 1.集計クエリ1    ID--Group化 出庫数--合計 日付--Where条件 2..集計クエリ2  ID--Group化 入庫数--合計 日付--Where条件 3.出力用クエリ  ID 商品名 集計クエリ1の合計 集計クエリ2の合計  IDと左結合で、上記のクエリを作成 デザインビューでは1~3は完成しており、 VBA上で1と2を3のSQLに置き換えるところで悩んでおります。。 どなたか教えてください。 ちなみに1.集計クエリの下記のように試してみましたが、 Dim dbs As DAO.Database Dim qdf As QueryDef Dim rst As DAO.Recordset Set qdf = dbs.QueryDefs("Q_データ抽出をしたいクエリ") With qdf .Parameters("[Forms]![f_DataEx]![txt_YearStart]") = "2011" .Parameters("[Forms]![f_DataEx]![txt_MonthStart]") = "02" .Parameters("[Forms]![f_DataEx]![txt_DayStart]") = "23" .Parameters("[Forms]![f_DataEx]![txt_YearEnd]") = "2011" .Parameters("[Forms]![f_DataEx]![txt_MonthEnd]") = "02" .Parameters("[Forms]![f_DataEx]![txt_DayEnd]") = "23" Set rst = .OpenRecordset End With 上記で求めた"rstを基にSQL文が実行できれば、実現できそうなんですが、 うまく行きません。 言葉足らずの内容もあるかと思いますが、宜しくお願い致します。

みんなの回答

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.4

#1です。 > デザインビューでは1~3は完成しており、 1~3のクエリをSQLビューで表示して、開示できますか? (クエリ1・2の日付--Where条件の年月日に関する列定義はどうなってる?)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

こういう事をやりたいのではと思います。 Parameters 何処 Text; Select F1,F2 from t1 where F1 = [何処]; のようなSQLがあって qDef.Parameters("何処") = "あそこ" ・・的なことをやって qDef.Sql が Select F1,F2 from t1 where F1 = 'あそこ'; のような感じにならないかな?という事でしたら 多分、出来ません。 以前さんざん悩んで結局玉砕しました。。。 結局、元のクエリのParameters句は無くして、それをひな形として、 そのSQLから一時的なクエリを作成し sSql = qDef("Q1").SQL sSql=replace(sSql,"何処","こっち") 的なことをしてWHERE句の部分を変換し db.createquerydef("Q1_TMP") qDef("Q1_TMP").sql = sSql のようにしました。 以上、ご参考まで。

回答No.2

> 上記で求めた"rstを基にSQL文が実行できれば、実現できそうなんですが、 > うまく行きません。 DAOのレコードセットと、SQLは全く別系統の物ですので、レコードセットをSQL文に渡すと言うことはできません。 > 3.出力用クエリ >  ID 商品名 集計クエリ1の合計 集計クエリ2の合計 >  IDと左結合で、上記のクエリを作成 > > デザインビューでは1~3は完成しており、 3.出力用クエリ がすでにできているのなら、そのクエリに対して、Parameters を設定すればいいかと思います。パラメータクエリを元にさらにクエリを作成した場合、親クエリは子クエリのパラメータを引き継ぎますので。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> With qdf > .Parameters("[Forms]![f_DataEx]![txt_YearStart]") = "2011" テーブル・クエリの列名が[nYear]で、where [nYear]=[開始年] のような記述なら .Parameters("[開始年]") = "2011" のように、クエリのWhere条件で列に記述する名称を書くんじゃないですか?

accessbeginner
質問者

お礼

早速の御回答有難うございます!! Parametersに値を渡すところは出来て、Debug文で値を取得できるのは確認できました、、ただ、それを別のSQL文に渡せるのかどうかで悩んでおります、、

関連するQ&A

  • アクセス2000VBA DAOをADOに書き換えてください

    アクセス2000VBA DAOをADOに書き換えてください 下記プログラムをADOに書き換えてください。(DAT1、DAT2はモジュールにて定義してあります) Option Compare Database Dim DBS As Database Dim QDF As QueryDef Dim RST As DAO.Recordset Dim COUNT1 Private Sub Form_Load() On Error Resume Next DAT2 = [Forms]![伝票]![HAKKOU1] Set DBS = CurrentDb Set QDF = DBS.QueryDefs("発行") With QDF .Parameters("DAT1") = DAT2 ’もしかしたら DAT2 ではエラーがでるかもしれません。 Set RST = .OpenRecordset() ’正しい記述を教えてください .Close End With With RST COUNT1 = !指示書 .Close End With

  • アクセス VBA クエリSQL文変更

    以前、教えていただいたにもかかわらず、作業が上手くいったことで、理解を深めることを疎かに してしまい、一部を修正したところ、わからなくなってしまいました。 申し訳ございませんが、教えてください。 Xと同一の構成である X1~という複数のテーブルから一つを選択して、クエリYを実行 クエリYは、フィールド1の値が BBBであるレコードの、フィールド1、3、5を抽出 Dim dbs As DAO.Database Dim qrdef As DAO.QueryDef Set dbs = Currentdb Set qrdef = dbs.QueryDefs("クエリY") qrdef.SQL = Replace(Expression:=qrdef.SQL _         , Find:="テーブルX" _         , Replace:="テーブルX1" _         , Compare:=vbTextCompare) Set qrdef = Nothing Set dbs = Nothing 実行時エラー3075  クエリ式'テーブルX1.フィールド1'の構文エラー:演算子がありません デバッグ qrdef.SQL = Replace(Expression:=qrdef.SQL _         , Find:="テーブルX" _         , Replace:="テーブルX1" _         , Compare:=vbTextCompare) 元となるクエリを直接実行すると正しく動作します。

  • ACCESS VBA クエリを開く

    ACCESS初心者です。 VBAはEXCELで独学した程度の知識です。 フォームから受注納期を入力し、クエリを抽出。 クエリでレコード毎に製品票の印刷枚数を計算し レポートで各レコード毎に求められた印刷枚数分を 印刷させたいのですが・・・ クエリを開く段階でつまずいており困っています。 Private Sub コマンド23_Click() Dim db As DAO.database Dim rs As DAO.Recordset Dim qdf As DAO.QueryDef Set db = CurrentDb() Set qdf = db.QueryDefs("受注クエリ") With qdf .Parameters("納期") = Format(Forms![受注データ一覧]![納期], "yyyy/mm/dd") Set rs = .OpenRecordset .Close End With MsgBox rs![注文番号] rs.Close End Sub パラメータクエリの開き方、上記コードで問題ないでしょうか? そしてこのコードを実行した際 実行時エラー3421 データ型の変換エラーが発生しましたと表示されます。 ローカルウィンドウで 変数rs = nothingとなっており クエリのレコードが読み込めていないようです。 (Msgbox rs!注文番号はデータが読み込めたかテストするために コードを書いています。) どうぞ宜しくお願いいたします。

  • Access SQL パラメータクエリ(DAO)

    Access初心者で、独学で頑張っています。 どうしても一人で解決できないので、教えてください。 下記のようなコードを書きましたが、#1で 『PARAMETER句の構文エラーです』 となります。 Dim qd As DAO.QueryDef Dim rs3 As DAO.Recordset Dim mySQL As String Set qd = CurrentDb.CreateQueryDef("") mySQL = "PARAMETERS [ParaヘッダーID] COUNTER;" mySQL = mySQL & "SELECT [テーブルA].[明細ID], [テーブルA].[ヘッダーID] " _ & "FROM テーブルA " _ & "WHERE ((([テーブルA].[ヘッダーID])='ParaヘッダーID'));" With qd .SQL = mySQL   ' #1 ここで『PARAMETER句の構文エラーです』 となる .Parameters("ParaヘッダーID") = [TempVars]![tempヘッダーID] Set rs3 = .OpenRecordset() End With (この後、処理を続ける) やりたいことは、 「テーブルA」から、「ヘッダーID」が一時変数[TempVars]![tempヘッダーID]と一致するデータを抜き出し、後続の処理に使いたいのです。 なお、ヘッダーIDは長整数型で、[TempVars]![tempヘッダーID]をウォッチで確認すると整数が入っていました。 SQLについて、いろいろ調べて試しましたが、なかなか上手く行きません。 どこが違うのかご教授お願いします。

    • ベストアンサー
    • MySQL
  • Access2000で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]に きちんと値は入力されています。 これを実行する方法はあるでしょうか?

  • AccessのVBAでパラメータクエリー設定

    お世話になります。 AccessのVBAで質問させてください。 「クエリーA」に設定している「ID1」のパラメータを 「テーブルA」の「IDX」の値を設定したいと思っております。 「ID1」にパラメータ2を設定する方法は分かったのですが、 下記の2つの方法がわかりませんでした。 ・「ID1」のパラメータを「テーブルA」の「IDX」の値を設定する方法 ・「テーブルA」は複数レコードあるので、その数だけfor文的なループで回したい お手数で申し訳ございませんが、 「クエリーA」に設定している「ID1」のパラメータを 「テーブルA」の「IDX」の値を設定する方法VBAコードを 教えて頂ければと思います。 本当に勝手いいますが、コードを記載して頂ければと思います。 宜しくお願い致します。 -----「ID1」にパラメータ2を設定する方法----- Set qdf = dbs.QueryDefs("クエリーA") With qdf .Parameters("ID") = 2 Set rst = .OpenRecordset End With

  • 【Access2003】クエリで動作するSQLがVBAで動作せず困っています。

    下記のソースを実行したところ、「パラメータが少なすぎます。2を指定してください。」というエラーが表示されました。 エラーが発生する箇所は「db.Execute strsql」です。 しかし、このstrsqlに書かれているSQL文をクエリで実行した所、問題なく動作しました。 なんとなく、クエリでは書けるものの、VBAでは書きない所があるのかなと思ったのですが、どのように修正すればよいか分かりませんでした。 その為、上記の現象について、ご教示いただける方がいらっしゃいましたら、よろしくお願いします。 【VBA】 Private Sub btn_Click() Dim db As DAO.Database Dim ws As DAO.Workspace Dim str As String Set ws = DBEngine.Workspaces(0) Set db = CurrentDb ' トランザクション開始 ws.BeginTrans strsql = "INSERT INTO T_W ( W_DAY )" strsql = strsql & "SELECT T_M.M_DAY" strsql = strsql & " FROM T_M" strsql = strsql & " WHERE (((Left([T_M].[M_DAY],4) & Mid([T_M].[M_DAY],6,2) & Right([T_M].[M_DAY],2))" strsql = strsql & " Between IIf(Nz([Forms]![F_1]![text_str])='',0,[Forms]![F_1]![text_end])" strsql = strsql & " And IIf(Nz([Forms]![F_1]![text_str])='',99999999,[Forms]![F_1]![text_end])))" strsql = strsql & " ORDER BY T_M.M_DAY" db.Execute strsql ws.CommitTrans End Sub 【フォーム:F_1】 テキストボックス:text_str テキストボックス:text_end コマンドボタン:btn 【データベース:T_M】 フィールド名:M_DAY    値  :2001/01/01    値  :2001/01/02    値  :2001/01/03 (以下略) 【データベース:T_W】 フィールド名:W_DAY    値  :なし よろしくお願いします。

  • Access Excelへ出力時にエラー

    お世話になります。 下記にてローカルクエリの抽出結果をExcelへ出力しております。  Dim obj As Object  Dim MyDB As DAO.Database  Dim MyRs As DAO.Recordset  Dim qdf As DAO.QueryDef  Dim out_path as String  Dim sheet_name as String  out_path = "出力先ファイルのフルパス(ファイル名含む)"  sheet_name = "出力先シート名" Set MyDB = CurrentDb Set obj = GetObject(out_path, "Excel.Sheet") obj.Application.Visible = False obj.Parent.Windows(1).Visible = True Set qdf = MyDB.QueryDefs("ローカルクエリ名") With qdf .Parameters("[forms]![test]![id]") = Forms!test!id Set MyRs = .OpenRecordset .Close End With obj.Worksheets(sheet_name).Select   ← (注) obj.Application.Cells(24, 1).CopyFromRecordset MyRs ※ローカルクエリの抽出条件としてフォーム上のテキストボックスを  参照しているため、Parametersを使ってます。 とりえあず上記で抽出結果は出力されます。 但し、適当なExcelファイルを開いた状態で実行すると、(注)の箇所で 「実行時エラー1004 WorksheetクラスのSelectメソッドが失敗 しました」となってしまいます。 なお、Selectの箇所をActiveにすると「実行時エラー438 オブジェクトは このプロパティまたはメソッドをサポートしていません。」と表示されます。 また、obj.Application.Visible = False の箇所で開いていた Excelファイルが閉じてしまうのですが、そういうものなのでしょうか。 勉強不足で大変恐縮ですが、ご教授の程、宜しくお願い足します。

  • accessからexcelへ出力時。。。

    3つのクエリを一つのエクセルシートへ出力しようとしているのですが、 3つ目が張り付きません。なんでなんでしょうか?どなたか教えてください。 Dim dbs As Database Dim rst1 As Recordset Dim rst2 As Recordset Dim rst3 As Recordset Dim intRow As Integer Dim intCell As Integer Dim xlsx As Object Set dbs = CurrentDb Set rst1 = dbs.OpenRecordset("クエリA") Set rst2 = dbs.OpenRecordset("クエリB") Set rst3 = dbs.OpenRecordset("クエリC") Set xlsx = CreateObject("Excel.Application") 'Excelオブジェクトを生成 With xlsx .ScreenUpdating = False '画面の再描画を抑止 .Workbooks.Add '新しいブックを追加 '---"クエリA"---------------------------------------------------- intRow = 1 For intCell = 1 To rst1.Fields.Count .Cells(intRow, intCell).Value = rst1.Fields(intCell - 1).Name .Cells(intRow, intCell).Interior.ColorIndex = 15 Next intCell '各レコード出力 intRow = 2 Do Until rst1.EOF For intCell = 1 To rst1.Fields.Count .Cells(intRow, intCell).Value = rst1.Fields(intCell - 1) Next intCell intRow = intRow + 1 rst1.MoveNext Loop '集計Sum For intCell = 4 To rst1.Fields.Count .Cells(intRow + 1, intCell) = "=SUM(" & Cells(2, intCell).Address & ":" & Cells(intRow, intCell).Address & ")" Next intCell ・ ・2目のクエリはOK ・ ・ ’以下3つ目のクエリ Dim intRow3 As Integer Dim intCell3 As Integer intRow3 = intRow + 5 intCell3 = 5 For intCell3 = 5 To rst3.Fields.Count .Cells(intRow3, intCell3).Value = rst3.Fields(intCell3 - 1).Name .Cells(intRow3, intCell3).Interior.ColorIndex = 15 Next intCell3 '各レコード出力 intRow3 = intRow + 6 Do Until rst3.EOF For intCell3 = 5 To rst3.Fields.Count .Cells(intRow3, intCell3).Value = rst3.Fields(intCell3 - 1) Next intCell3 intRow3 = intRow3 + 1 rst3.MoveNext Loop '---- Dim rst3RC As Integer rst3RC = intRow + 5 + rst3.RecordCount '863 '集計Sum For intCell3 = 6 To rst3.Fields.Count - 1 .Cells(rst3RC, intCell3) = "=SUM(" & Cells(rst3RC - rst3.RecordCount, intCell3).Address & ":" & Cells(rst3RC - 1, intCell3).Address & ")" Next intCell3

  • テーブルのリンク(ACCESS)

    ACCESS2003で下記の記述で「実行時エラー ’3219’ 無効な処理です。」というエラーメッセージがでます。 外部mdbでテーブルをリンクさせるとこのエラーがでます。同じmdbファイルにデータテーブルを置くと問題なく処理できます。 参照設定も過去ログを見てチェックしています。 Dim dbs As DAO.Database Dim rst As DAO.Recordset Set dbs = CurrentDb Set rst = dbs.OpenRecordset("テーブル名", dbOpenTable) ACCESS97では何の問題もなかったのですが, 2003ではうまくいきません。 どうかよろしくお願いします。