- 締切済み
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文が実行できれば、実現できそうなんですが、 うまく行きません。 言葉足らずの内容もあるかと思いますが、宜しくお願い致します。
- accessbeginner
- お礼率20% (1/5)
- その他(データベース)
- 回答数4
- ありがとう数1
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- bin-chan
- ベストアンサー率33% (1403/4213)
#1です。 > デザインビューでは1~3は完成しており、 1~3のクエリをSQLビューで表示して、開示できますか? (クエリ1・2の日付--Where条件の年月日に関する列定義はどうなってる?)
- nicotinism
- ベストアンサー率70% (1019/1452)
こういう事をやりたいのではと思います。 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 のようにしました。 以上、ご参考まで。
- hatena1989
- ベストアンサー率87% (378/433)
> 上記で求めた"rstを基にSQL文が実行できれば、実現できそうなんですが、 > うまく行きません。 DAOのレコードセットと、SQLは全く別系統の物ですので、レコードセットをSQL文に渡すと言うことはできません。 > 3.出力用クエリ > ID 商品名 集計クエリ1の合計 集計クエリ2の合計 > IDと左結合で、上記のクエリを作成 > > デザインビューでは1~3は完成しており、 3.出力用クエリ がすでにできているのなら、そのクエリに対して、Parameters を設定すればいいかと思います。パラメータクエリを元にさらにクエリを作成した場合、親クエリは子クエリのパラメータを引き継ぎますので。
- bin-chan
- ベストアンサー率33% (1403/4213)
> With qdf > .Parameters("[Forms]![f_DataEx]![txt_YearStart]") = "2011" テーブル・クエリの列名が[nYear]で、where [nYear]=[開始年] のような記述なら .Parameters("[開始年]") = "2011" のように、クエリのWhere条件で列に記述する名称を書くんじゃないですか?
関連する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
- ベストアンサー
- Visual Basic
- 【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 値 :なし よろしくお願いします。
- ベストアンサー
- その他MS Office製品
- 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
- 締切済み
- Visual Basic
- テーブルのリンク(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ではうまくいきません。 どうかよろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
お礼
早速の御回答有難うございます!! Parametersに値を渡すところは出来て、Debug文で値を取得できるのは確認できました、、ただ、それを別のSQL文に渡せるのかどうかで悩んでおります、、