- ベストアンサー
アクセスVBA TOP値変数実行時エラー7874の原因とは?
- フォーム内テキストボックスの数値を使用して、SELECT TOP の変数を作成し、実行時にエラー7874が発生しています。
- 要件は、テーブルT_1から各支店ごとの売上金額トップ2を抽出し、結果を表示することです。
- しかし、VBAコードにはいくつかの問題があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> どこが間違っているか教えてもらえますか? 「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による編集の制御などが、より柔軟に できることから、フォームを使用する方がお勧めとなります。
その他の回答 (1)
- DexMachina
- ベストアンサー率73% (1287/1744)
> 是非できるようになりたいので、もう少し教えてもらえますか? 了解しました。 では、以前のご質問からするとご使用の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)」を選択した場合は、デザイン ビューのレイアウトが、データ表示の際にも反映されるようになります。 フォームビュー(単票フォームや帳票フォームなどがあります)で表示させる 場合は、必要に応じて、デザインビュー上でコントロールをドラッグしたり、 プロパティシート上で設定値を変えるなどして、デザインやレイアウトを 変更します。 フォームを開いた時に最初にどの表示のさせ方にするかは、フォームの プロパティシートの『表示』タブの、『既定のビュー』の項目で指定します。 (フォームのプロパティシートは、プロパティシートの最上段にあるコンボ ボックスで「フォーム」を選択して表示させることができる他、フォームの (マス目を含めて)何もないところをクリックして切り替えることもできます) ・・・以上、途中からとりとめがなくなってしまいましたが(汗)、参考まで。
お礼
引き続き丁寧に教えていただきありがとうございます。実はMe![text1]のMe!は、Forms![F_1]!だったので、それのレコードソースをT_1にしてました^^); 説明不足と勘違いですいませんm(_ _)m ご教示頂いたF_1をF_2にしてできました! 感激です!! 今回初めてVBAを書きましたが、マクロと違いもっとできる事が広がる予感がしました☆もっともっと勉強したいと思いました! ホントにありがとうございました。感謝です!
お礼
親切にご教示頂き大変感謝します。 パターンa) でできました。ありがとうございます。 Docmd.OpenQuery は、保存されたクエリを実行するコマンドなんですね。勉強になりました。 お勧めのパターンb) もやってみましたが、ダメでした。フォームF_1のプロパティ→データTab→レコードソースをT_1にしてみましたが、 >※「T_1」の全フィールドを表示するためのコントロールの設置が必要。 (フィールド数に見合った数のコントロールの設置と、コントロールソース の指定: が理解できず… 是非できるようになりたいので、もう少し教えてもらえますか? >'「Microsoft DAO #.# Object Library」への参照設定が必要 '(VBEのメニューで「ツール(T)→参照設定(R)」を選択してチェック) は、チェックを入れました。DAO 3.6 Object Library です。