アクセスVBA TOP値変数実行時エラー7874の原因とは?

このQ&Aのポイント
  • フォーム内テキストボックスの数値を使用して、SELECT TOP の変数を作成し、実行時にエラー7874が発生しています。
  • 要件は、テーブルT_1から各支店ごとの売上金額トップ2を抽出し、結果を表示することです。
  • しかし、VBAコードにはいくつかの問題があります。
回答を見る
  • ベストアンサー

アクセスVBA TOP値を変数

フォーム内テキストボックスの数値を、SELECT TOP の変数にしたくて、コマンドボタンを押した時に、下記VBAを書いたところ、実行時エラー7874 と出て、下から2行目でエラーとなりました。 Private Sub command1_Click() Dim 抽出数 As Integer Dim mySQL As String 抽出数 = Me![text1] mySQL = "SELECT * FROM T_1 AS Q_TEMP WHERE 顧客CD in (SELECT TOP " & 抽出数 & " 顧客CD FROM T_1 WHERE 支店CD=Q_TEMP.支店CD ORDER BY 売上金額 DESC,顧客CD) ORDER BY 支店CD, 売上金額 DESC , 顧客CD;" DoCmd.OpenQuery mySQL End Sub やりたい事は、テーブル:T_1に下記レコードがあり、各支店ごとのトップ売上金額2を抽出したいのと、トップ2を変数にしたいのです。 支店CD 顧客CD 売上金額 1 11 1,000 1 12 2,000 1 13 3,000 1 14 4,000 2 15 2,000 2 16 3,000 2 17 4,000 2 18 5,000 3 19 5,000 3 20 5,000 3 21 5,000 3 22 5,000 を、上記SQL文で、下記の結果にしたい 支店CD 顧客CD 売上金額 1 13 3,000 1 14 4,000 2 17 4,000 2 18 5,000 3 19 5,000 3 20 5,000 (売上金額が同じなら、顧客CDの小さい方から2つ) どこが間違っているか教えてもらえますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

> どこが間違っているか教えてもらえますか? 「DoCmd.OpenQuery」は、保存されたクエリなら実行できますが、 SQL文を実行することはできません。 「DoCmd.OpenQuery」に相当する形で、SQL文を実行するもの としては、   a)DoCmd.RunSQL mySQL   b)CurrentDb.Execute mySQL といった方法がありますが、これはアクションクエリ(追加/削除など) に相当するSQL文に限定され、データシートとして結果を表示する Select文には適用できません。 ですので、結果を表示させたい場合は、  a)新規クエリをその場で作成するか、予めクエリを用意しておき、   そのクエリのSQLプロパティに、作成したSQL文を設定する  b)「T_1」テーブルのすべてのフィールドに対応したコントロールを   設置したフォームを用意しておき、作成したSQL文をフォームの   RecordSourceに設定する といった方法をとるしかないかと思います。 下記コードは、提示されたコードから「DoCmd.OpenQuery mySQL」 の一行を削除して、代わりに追加するコードになります。 (Dim/Constの宣言部分は、他の宣言の直下でOk) 【予め「Q_1」という名前のクエリを用意しておくパターン】 ※「Q_1」にはテーブルもフィールドも何もなしで、とにかくその名前で   保存だけしておけばOkです。   (クエリの中身(→レコードではなく)は、下記コードを実行すると   上書されます)   '「Microsoft DAO #.# Object Library」への参照設定が必要   '(VBEのメニューで「ツール(T)→参照設定(R)」を選択してチェック)   Dim Qdf As DAO.QueryDef   Const cQry As String = "Q_1"   Set Qdf = CurrentDb.QueryDefs(cQry)   Qdf.SQL = mySQL   Qdf.Close   Set Qdf = Nothing   DoCmd.OpenQuery cQry 【予め「F_1」という名前のフォームを用意しておくパターン】 ※「T_1」の全フィールドを表示するためのコントロールの設置が必要。  (フィールド数に見合った数のコントロールの設置と、コントロールソース   の指定:   「T_1」テーブルをレコードソースとしてフォームを作成するのが無難)   Const cFrm As String = "F_1"   DoCmd.OpenForm cFrm, acFormDS   Forms(cFrm).RecordSource = mySQL ・・・以上です。 事前準備が多く必要になりますが、VBAによる編集の制御などが、より柔軟に できることから、フォームを使用する方がお勧めとなります。

WindsorAvenue
質問者

お礼

親切にご教示頂き大変感謝します。 パターンa) でできました。ありがとうございます。 Docmd.OpenQuery は、保存されたクエリを実行するコマンドなんですね。勉強になりました。 お勧めのパターンb) もやってみましたが、ダメでした。フォームF_1のプロパティ→データTab→レコードソースをT_1にしてみましたが、 >※「T_1」の全フィールドを表示するためのコントロールの設置が必要。  (フィールド数に見合った数のコントロールの設置と、コントロールソース   の指定: が理解できず…   是非できるようになりたいので、もう少し教えてもらえますか? >'「Microsoft DAO #.# Object Library」への参照設定が必要   '(VBEのメニューで「ツール(T)→参照設定(R)」を選択してチェック) は、チェックを入れました。DAO 3.6 Object Library です。

その他の回答 (1)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

> 是非できるようになりたいので、もう少し教えてもらえますか? 了解しました。 では、以前のご質問からするとご使用のAccessは2003のようですので、 そのバージョンでの操作手順を説明します。 http://okwave.jp/qa/q7906336.html ・・・といっても、前回の回答があまりに漠然としすぎていて不安にさせて しまったかもしれませんが(汗)、それほど複雑な操作は必要ありません。 特に、今回の場合はデータシート型で、テーブルの全フィールドを表示 させる形なので、以下の操作であっさりできてしまいます: 1)Accessのメニューから「挿入(I)→フォーム(F)」をクリック  (又はデータベースウィンドウ(フォーム等の一覧が表示される画面)で、   『フォーム』を選択して『新規作成(N)』ボタンをクリック、でもOk) 2)『新しいフォーム』ダイアログが開くので、リストボックスで「オートフォーム:  データシート」を、『基になるテーブル又はクエリの選択』で「T_1」を  それぞれ選択後、『OK』ボタンをクリック 3)「T_1」テーブルの全フィールド・全レコードが、データシート型フォーム  として表示される ・・・以上です。 見た目は「T_1」テーブルと同じかと思いますが、Accessのメニューから 「表示(V)→デザイン ビュー(D)」を選択すると、このフォームのデザイン ビューが表示されます。 そこに表示されるテキストボックス(背景色が白の四角い枠)などが、 前回回答の『全フィールドを表示するためのコントロール』になります。 (『コントロール』というのは、テキストボックスや、コマンドボタン、チェック  ボックスなどの総称です) また、これらのコントロールをダブルクリックするとそのコントロールの プロパティシートが表示されますが、その中の『データ』タブに、 『コントロールソース』という項目があります。 (ラベルなど、テーブルのデータに連動しないタイプのコントロールには  この項目はありません) 各コントロールには、この『コントロールソース』として指定したフィールド の値が表示されるようになっています。 (『フィールド』は、テーブルやクエリなどの縦列のことです) なお、データシートビューでは、テーブルやクエリと同様の表示となるため デザインビューでのレイアウトは特にデータ表示には影響しませんが、 メニューで「表示(V)→フォーム ビュー(F)」を選択した場合は、デザイン ビューのレイアウトが、データ表示の際にも反映されるようになります。 フォームビュー(単票フォームや帳票フォームなどがあります)で表示させる 場合は、必要に応じて、デザインビュー上でコントロールをドラッグしたり、 プロパティシート上で設定値を変えるなどして、デザインやレイアウトを 変更します。 フォームを開いた時に最初にどの表示のさせ方にするかは、フォームの プロパティシートの『表示』タブの、『既定のビュー』の項目で指定します。 (フォームのプロパティシートは、プロパティシートの最上段にあるコンボ  ボックスで「フォーム」を選択して表示させることができる他、フォームの  (マス目を含めて)何もないところをクリックして切り替えることもできます) ・・・以上、途中からとりとめがなくなってしまいましたが(汗)、参考まで。

WindsorAvenue
質問者

お礼

引き続き丁寧に教えていただきありがとうございます。実はMe![text1]のMe!は、Forms![F_1]!だったので、それのレコードソースをT_1にしてました^^); 説明不足と勘違いですいませんm(_ _)m ご教示頂いたF_1をF_2にしてできました! 感激です!! 今回初めてVBAを書きましたが、マクロと違いもっとできる事が広がる予感がしました☆もっともっと勉強したいと思いました! ホントにありがとうございました。感謝です!

関連するQ&A

  • アクセス 抽出条件

    いつもお世話になります。 次の条件で抽出したい時、クエリの抽出条件の書き方を教えてもらえますか。 支店CD 顧客CD 売上金額 昇順         降順 1     11     5,000 1     12     4,000 1     13     3,000 1     14     2,000 2     15     6,000 2     16     5,000 2     17     4,000 3     18     7,000 3     19     6,000 3     20     5,000 支店ごとの上位2レコードを抽出したいのです。下記のように 支店CD 顧客CD 売上金額 1     11     5,000 1     12     4,000 2     15     6,000 2     16     5,000 3     18     7,000 3     19     6,000 アクセスは2003です。よろしくお願いします。

  • Access VBA 日付で抽出できない?

    次の質問にお答えいただけませんか。 フォームで抽出条件を入力しテーブルから抽出をするとき Dim db As DAO.Database Dim rs As DAO.Recordset Dim mySQL As String Set db = CurrentDb() mySQL = "SELECT * FROM T_明細 " _ & "WHERE 顧客ID = " & CStr(Me!txtKey) & ";" Set rs = db.OpenRecordset(mySQL, dbOpenDynaset) 上記のような記述をしました。 テーブル名:T_明細   フィールド:顧客ID  日付 金額  フォームの抽出条件入力テキストボックス:txtKey このとき顧客IDでの抽出は問題なく出来ましたが "WHERE 顧客ID = を "WHERE 日付 = に変更して日付で抽出をしたいのですがうまくいきません。 テーブルの日付フィールドは 書式をgee-mm-dd 定型入力を>L99\-99\-99;0;# で書き込みました。 フォームのtxtKeyテキストボックスのプロパティも書式をgee-mm-dd 定型入力を>L99\-99\-99;0;#に設定してあります。 このようなときは mySQL = "SELECT * FROM T_明細 " _ & "WHERE 日付 = " & CStr(Me!txtKey) & ";" の、記述を何か変更しないといけないような気もしますが 対処の方法を教えていただけませんか。

  • SQL SERVER 店舗毎のTOP10

    表題の件のSQLについてアドバイスお願いいたします。 DB:SQL SERVER 2008 R2 テーブル:売上伝票 カラム 店舗|伝票No|伝票日付|商品CD|商品名|数量|単価|金額(数量x単価) SELECT TOP 10 店舗NO, 商品CD, 商品名, SUM(数量) AS 販売数, SUM(金額)AS 販売金額 FROM 売上伝票 WHERE 伝票日付 BETWEEN [開始日] AND [終了日] GROUP BY 店舗NO,商品CD,商品名, ORDER BY 店舗NO,販売金額 DESC 当然ですが、上記のSQLでは、一番若い店舗NOのトップ10しか抽出できません。 店舗別、販売金額のトップ10を抽出するための、SQL文についてお教えください。

  • ACCESSのモジュールで

    おはようございます。 Access97で受注管理データベースを作成しています。 新規顧客コード作成の際、いくつかの条件でコードを分けています。 そのためSQLで抽出し、それに1を足して新規コードとしています。 たとえば下記のSQL文を書き、 mySQL="SELECT Max(顧客コード) AS 顧客コードの最大 FROM 顧客マスタ GROUP BY グループ HAVING (グループ='CB');" その抽出結果を取得したいのですが、そのためにはレコードセットとみなさせるのかと思い、いろいろやってみたのですが、結局出来ません。(それからして怪しい) VBAお勉強中で根本的に仕組みを理解できていないせいだと思うんですが、 数冊参考書を見ても分かりませんでした。 分かりにくい質問文ですみません。どなたか助けてください。よろしくお願いします。

  • Access クエリ内のクエリ

    クエリの中で、他のテーブルと一致するデータを抽出したいのですが、結果が0件の結果しかかえって来ません。 何処が間違っているのかお教え頂けたら幸いです。 何がしたいかと言うと、「dbo_VIEW_CIJ用売上伝票」の下記項目の中の「T_得意先」の中の抽出フラグのTrueデータを抽出し新しい「T_税抜」テーブルを作成したいのですが、結果は0件しかかえって来ません。 ちなみに、得意先CDのIN句を抜くとちゃんとデータは抽出されます。 《テーブル》 【dbo_VIEW_CIJ用売上伝票】(SQL Serverリンクテーブル) ・納品日付 ・伝票NO ・得意先CD ・税抜金額 ・消費税区分 ・商品名 ・摘要 ・数量 ・単位名 ・単価 ・金額 {T_得意先】 得意先CD 抽出フラグ(YES・NO型) 《抽出条件》 納品日 : >=#(開始日変数)# And #(終了日変数)# 消費税区分 : 1 得意先CD : IN(SELECT [T_得意先]![得意先CD] FROM [T_得意先] WHERE[T_得意先]![抽出フラグ]='True') 《SQL》 SELECT dbo_VIEW_CIJ用売上伝票.納品日付, "" AS 部門コード, dbo_VIEW_CIJ用売上伝票.伝票NO, dbo_VIEW_CIJ用売上伝票.得意先CD, "" AS F, dbo_VIEW_CIJ用売上伝票.税抜金額, dbo_VIEW_CIJ用売上伝票.消費税区分, "" AS 商品CD, dbo_VIEW_CIJ用売上伝票.商品名, dbo_VIEW_CIJ用売上伝票.摘要, "" AS ケース数, "" AS 入数, dbo_VIEW_CIJ用売上伝票.数量, dbo_VIEW_CIJ用売上伝票.単位名, dbo_VIEW_CIJ用売上伝票.単価, [dbo_VIEW_CIJ用売上伝票]![消費税区分]*[dbo_VIEW_CIJ用売上伝票]![税抜金額] AS tmp小計, [dbo_VIEW_CIJ用売上伝票]![数量]*[dbo_VIEW_CIJ用売上伝票]![単価] AS tmp単価計 INTO Tmp税抜 FROM dbo_VIEW_CIJ用売上伝票 WHERE (((dbo_VIEW_CIJ用売上伝票.納品日付)>=#10/21/2013# And (dbo_VIEW_CIJ用売上伝票.納品日付)<=#11/20/2013#) AND ((dbo_VIEW_CIJ用売上伝票.得意先CD) In (select [T_得意先]![得意先CD] from [T_得意先] Where [T_得意先]![抽出フラグ] = True)) AND ((dbo_VIEW_CIJ用売上伝票.消費税区分)=1)) ORDER BY dbo_VIEW_CIJ用売上伝票.納品日付; ※上記SQL文は、SQLビューを記載してますが、デザインビューで作成し、得意先CDのIN句の部分は、得意先CDにビルドを使って入力しました。 参考にしたURL http://office.microsoft.com/ja-jp/access-help/HA010206111.aspx ・サブクエリをクエリ フィールドの抽出条件として使用する Access2010 Windows7

  • ACCESSのVBAのSQLを教えてください。

    テーブル1とテーブル2があり、それをUNIONで結合して、リンクさせたOracleのテーブルキーと 結合し、Oracleのテーブルにないキーを検索したいのですが、うまく出来ません。 ACCESSのVBAで作りたいのですが・・どうかご教授願います。 構成  テーブル1   項目名  Key 顧客コード1   名前 テーブル2     項目名   Key 顧客コード1   Key 顧客コード2      名前 Oracleのテーブル  テーブルB     項目名  Key 管理コード  テーブル1の顧客コード1とテーブル2の顧客コード2をUNIONでまとめたものをA1としA1.顧客コードとします それとOracleのテーブルであるテーブルBの管理コードと結合して テーブルBにないA1の顧客コードを抽出するSQL文を作成したいと思います。 (管理コード,顧客コード1,顧客コード2は同じ属性、同じ桁数) SELECT A1.管理コード FROM ( SELECT T1.顧客コード1 as 顧客コード FROM テーブル1 T1 UNION SELECT T2.顧客コード2 as 顧客コード FROM テーブル2 T2 )A1, テーブルB WHERE A1.顧客コード = テーブルB.管理コード AND テーブルB.管理コード IS NULL; エラーにはなりませんが、実行結果は、管理コード 0件です。データ的には、テーブルB側にはテーブル1にはあるがテーブルB側にないデータはあります。

  • Accessで複数テーブルのJoin

    次のようなテーブル(T1~T4)とクエリ(Q1~Q2)があります。 クエリの表で囲っているものはAccessのQBEを表しています。 その下はAccessが自動生成したSQLです。 Accessがある場合はいいのですが、ない場合、いきなりSQLを 書かないといけないわけですが、どのような順番に並べていって いいのか整理がつきません。 4つ以上になるとさっぱりです。 何かヒントをいただけませんでしょうか? T1:売上表[売上No、日付、顧客CD] T2:顧客表[顧客CD、顧客名] T3:売上明細[ID、売上No、連番、商品CD、数量] T4:商品表[商品CD、商品名、単価] Q1: ┌────────────────┐ │日付 │ 商品名│単価 │数量 │ ├────────────────│ │売上表│商品表│商品表│売上明細│ └────────────────┘ SELECT 売上表.日付, 商品表.商品名, 商品表.単価, 売上明細.数量 FROM 商品表 INNER JOIN (売上表 INNER JOIN 売上明細 ON 売上表.売上No = 売上明細.売上No) ON 商品表.商品CD = 売上明細.商品CD; Q2: ┌────────────────────┐ │日付 │ 顧客名│商品名│単価 │数量 │ ├────────────────────│ │売上表│顧客表│商品表│商品表│売上明細│ └────────────────────┘ SELECT 売上表.日付, 顧客表.顧客名, 商品表.商品名, 商品表.単価, 売上明細.数量 FROM (商品表 INNER JOIN (売上表 INNER JOIN 売上明細 ON 売上表.売上No = 売上明細.売上No) ON 商品表.商品CD = 売上明細.商品CD) INNER JOIN 顧客表 ON 売上表.顧客CD = 顧客表.顧客CD;

  • アクセスでの年度別集計

    教えてください。 売上データの支店別・品目別の年間売上の集計を出したいのですが、売上年と売上月は別のフィールドになっています。下記の様な感じで・・・ CD 支店名 品目 売上金額 売上年 売上月  2004年度(2004/4/1~2005/3/31)の品目別売上合計を出したいのです。 クエリは売上フィールドで集計し、抽出条件を、  売上年    売上月  2004      >=4    2005       <=3 にしてみたのですが、そうすると品目の合計にはなりません。(同じ品目でも売上月が違えば別のレコードになります) わかりにくい説明で申し訳ありませんが、困っています。よろしくお願いします。

  • Accessで

    以下のようなSQLの結果に、なぜか"々"が含まれている佐々木や奈々子なども抽出されます。"々"が含まれないようにするにはどのようなSQLにしたら良いのでしょうか?宜しくお願いします。 SELECT [T_顧客情報].[氏名] FROM [T_顧客情報] WHERE ((([T_顧客情報].[氏名]) Like "*ー*")); 動作環境 Access2003 SP1 WindousXP HomeEdition SP2

  • 売上トップ10を抽出したい

    お世話になっています。 Access2003を使っておりますが、抽出条件で煮詰まっており、知恵をお借りできないかと、質問させていただきました。 顧客ごとの売上を抽出するクエリを作ったのですが、そこからさらに、任意の期間でそれぞれの月のトップ10を抽出したいのです。 例:2006年10月~11月の売上トップ10 2006年10月 A社 100万 B社  90万 C社  80万 D社  70万    : 2006年11月 B社 120万 A社 100万 D社  80万 C社  60万    : というように抽出したいのですが、良い方法はあるのでしょうか? どうかよろしくお願いいたします。

専門家に質問してみよう