• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:アクセスVBA TOP値を変数)

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

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

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

  • ベストアンサー
  • 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