• ベストアンサー

RunMacroメソッドではsubプロシージャーは呼び出せない?

RunMacroメソッドはvbaのsubプロシージャーのマクロ1を呼び出すことはできないのでしょうか? DoCmd.RunMacro "マクロ1", 2 とするとエラーになってしまいます。 どうしても2回マクロを実行したい場合は Call マクロ1 Call マクロ1 とするしかないですか?

  • qwfgjo
  • お礼率100% (282/282)

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

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

Excelの場合は「マクロ=モジュール(VBA)」ですが、 Accessの場合は「マクロ」と「モジュール」は別物になります。 で、ご質問の「RunMacro」は、データベースウィンドウ (=テーブルやクエリなどの一覧が表示される画面)で、 『マクロ』選択時に表示されるもの(「マクロ」オブジェクト)を 実行する際に使用するメソッドです。 ですので、「マクロ1」がSubプロシージャの実行には 使用できません。 (実行すると、マクロオブジェクトから「マクロ1」を探すものの、  見つからないのでエラーを返す、と) Subプロシージャを指定回数実行する場合は、例えば 以下のように、「For Next」構文などを使用します。 'フォーム上の「コマンド1」ボタンのクリック時イベント Private Sub コマンド1_Click()   '回数カウント用の変数を宣言   Dim i As Integer   '「i」が「1」から「2」になるまで(=2回)反復   For i = 1 To 2     Call マクロ1   Next End Sub ・・・以上です。 ~~~~~~~~~~~~~~~~~~~~~~~~~~ hana-hana3さんへ: RunMacroメソッド及び「マクロの実行」アクションでも 実行回数の指定は可能ですので、参考まで: (下記サイトはAcc2007のヘルプですが、この辺りはAcc97から  仕様変更はなかったはずです:それ以前は使用経験なし) http://office.microsoft.com/ja-jp/access/HA012262831041.aspx

qwfgjo
質問者

お礼

「マクロ」と「モジュール」は別なのですね。 ご回答ありがとうございます。

その他の回答 (1)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

RunMacroでは実行回数を指定する事はできません。 ヘルプにもそのような指定方法は書かれていないと思いますが?

qwfgjo
質問者

お礼

確認してみます。ご回答ありがとうございます。

関連するQ&A

  • プロシージャが大きすぎます!

    Excel2000のVBAでフィルターオプションの連続操作をマクロで作成しているのですが、60回以上フィルターオプションを実行できるように記述したのですが、 長すぎてしまい、マクロを実行すると 「プロシージャが大きすぎます」と表示され実行できなくなります。ヘルプやHPを参考にして調べてみると、プロシージャを短くすればよいことはわかったのですが、SUBでプロシージャを短くし、その後、そのSUBで区切ったものを連続実行するためにはどのようにすればよいのでしょうか? VBAを勉強したばかりで、見当違いの質問かもしれませんが、補足いたしますので、よろしくお願いいたします。

  • マクロ subプロシージャーは指定できない?

    accessのマクロの アクション:プロシージャの実行 は、 subプロシージャーは指定できないのでしょうか? 標準モジュールに Sub test1() MsgBox "プロシージャーの実行のテストです" End Sub Function test2() MsgBox "プロシージャーの実行のテストです" End Function と作り、 マクロのプロシージャの実行で プロシージャ名をtest2()にすると、うまく表示されますが、 test1()だと、失敗します。 subプロシージャーをマクロで呼び出す方法を教えてください。

  • SubではなくFunctionで作られる理由

    access2007を使っています。 素朴な疑問なのですがマクロを変換した時はなぜ Subプロシージャーではなく、Functionなのでしょうか? 「クエリを開く」と言うマクロを、VBAに変換したところ ******************************************************* Function マクロ1() On Error GoTo マクロ1_Err DoCmd.OpenQuery "クエリ1", acViewNormal, acEdit マクロ1_Exit: Exit Function マクロ1_Err: MsgBox Error$ Resume マクロ1_Exit End Function ******************************************************* となりました。 戻り値や返り値はないものは、FunctionプロシージャーではなくSubプロシージャーで作るものと思っていたのですが なぜ上記のコードはFunctionなのでしょうか? Functionで作る理由を教えてください。 特に意味はないのでしょうか? ちなみにFunctionをSubに書き換えて実行したら問題なくクエリが開きました。

  • vbs subプロシージャーにするべきなの?し

    vbs subプロシージャーにするべきなの?しないべきなの? call a sub a() msgbox "b" end sub vbsでこのコードを実行すると問題なく動くのですが、 call a をsubとend subで囲わなくていいのでしょうか?

  • VBAのプロシージャのsubについて

    VBAのサブルーチンとプロシージャについての質問です。 VBAのプロシージャは,サブルーチンのsubで書き始めると思いますが, どうしてプロシージャなのに,サブルーチンのsubで書き始めるのでしょうか?

  • プロシージャが実行されたかの有無の判断

    Sub test() ・・・・・ IF ・・・・ then Call マクロ1 End If ・・・・・ ・・・・・ If testと言う名のプロシージャーの中でマクロ1と言うプロシージャーが実行されたなら Then MsgBox "マクロ1は実行されました" End If End Sub ということを実行したいのですがどうすればいいのでしょうか? マクロ1の実行条件自体が複雑でIf ~Thenの中に書ききれないので 実行の有無を値で返したりすることは不可能でしょうか? よろしくお願い致します。

  • マクロからFunctionプロシージャーを実行する

    マクロからFunctionプロシージャーを実行するには? 標準モジュールに Function アプリケーションのサイズを最大化する() DoCmd.RunCommand acCmdAppMaximize End Function があるのですが、 マクロからこれを実行したいのですが、見つかりませんと言う旨のエラーが発生します。 何が間違ってるのでしょうか? エラー番号は2482が表示されます。 ご回答よろしくお願いします。

  • excelマクロ subプロシージャに関して

    excelでセルの色を変えるというものをコーディングしました。 選択したセルの隣のセルの値がそれぞれ、○だったら選択したセルの色を変えるプログラムです。 引数なしのため、ユーザー定義関数として定義することができず?、subプロシージャとして定義しているので、 シート内で全ての行に対応させることができず、実行するには一行ずつ、マクロの実行をさせなければ、このプロシージャを使えず、困っています。1行ずつでは作った意味がないので。。。 作ったプロシージャが手元にないので、明日アップしたいと思いますが、質問の意味がわかるかたいましたら、お願いします。

  • エクセルからアクセスのプロシージャーを実行させるには?

    エクセルの標準モジュールには→エクセル側のプロシージャー アクセスの標準モジュールには→アクセス側のプロシージャー と言う名前のプロシージャーが作成されています。 これをどちらもエクセル側で実行させることは出来ないでしょうか? 「アクセス側のプロシージャー」ではアクセス側の処理が実行されます。 でもできればエクセル側のコマンドボタンを一回押すだけで エクセルとアクセスの両方の処理を実行させたいです。 エクセルの標準モジュールには Sub エクセル側のプロシージャー() Call アクセス側のプロシージャー End Sub これを実行すると コンパイルエラーになります。 どうすれば一度で二つのアプリケーションのプロシージャーを実行させることが可能でしょうか? よろしくお願い致します。

  • 元のプロシージャーを取得するプロパティ

    Sub test1() Call test2 End Sub Sub test2() If ?? Then MsgBox "test1から実行されたマクロです。" End If End Sub 上記のコードで どこから実行されたプロシージャ化を取得する方法はありますか? 現在は、 Dim bl_test1_yes As Boolean Sub test1() bl_test1_yes = True Call test2(bl_test1_yes) End Sub Sub test2(bl_test1_yes) If bl_test1_yes = True Then MsgBox "test1から実行されたマクロです。" End If End Sub としていますが、 元のプロシージャーを取得するプロパティがあれば教えてください。

専門家に質問してみよう