- ベストアンサー
二つのマクロを両方実行させたいです(初心者)
- VLOOKUPのように、二つのSHEETで、それぞれ値が一致するものがあればもうひとつのSHEETのほうに値を自動的に表示させる、という仕組みをマクロで作ってみました。
- Macro1とMacro2という2つのマクロを作成しましたが、同じエクセルファイルで実行するとMacro2の方が実行され、Macro1が実行されません。どうすれば両方のマクロを実行できるでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
Sub Macro1() Msgbox "これはMacro1です。" End Sub Sub Macro2() Msgbox "これはMacro2です。" End Sub Sub Macro3() Call Macro1 Call Macro2 End Sub 上記の3つのマクロを1つのモジュールに書いて、Macro3を実行するとどうなりますか? VBEでは、[F8]キーを押すことで、1行ずつステップ実行させることができます。 ステップ実行で、実際のマクロの流れを確認することができます。 上記のMacro3にカーソルを合わせて、[F8]キーを押してみてください。 そして、上記の3つのマクロがどのように流れになるのか確認してみてください。 それができたら、ご自分で作ったマクロでも[F8]でステップ実行して流れを確認してみてください。 あと、私も#6さんと同様の疑問を持っていますので、回答よろしくお願いします。
その他の回答 (6)
- kmetu
- ベストアンサー率41% (562/1346)
> なぜか、というと、初心者ですので、どうしてよいかわからず例題に習って、 > 必要な式を二つ作ったのです。 > (なので無駄が多いとは思うのですが) 無駄というより無意味ですよ。意味のないことに労力を使う必要を感じないのですが…。 例題にまったく同じものを2個作るようにかいてあるのでしょうか? なにがどうして良いかわからなかったのか そこから解決したほうがいいと思います。 基本的に何がしたくて2個作るようになったのですか?
補足
大変申し訳ありません。 元々記入していたマクロに間違いがありました。 訂正して載せておきましたのでまたお時間があれば見てみてください。
- nattocurry
- ベストアンサー率31% (587/1853)
>実行はツール→マクロ→(マクロ名が出てくる)→実行 >です。 実行のやりかたは問題ないようですね。 >これら二つを同じエクセルファイルに、Macro1,Macro2と設定して、実行しても、Macro2のほうしか実行されません。 >1のほうは、実行を押しても作動しません。 それは、Macro2を実行しているからじゃないんですか? Macro1を実行すると、 Sub Macro1() のところから始まって、 End Sub で終了します。 その下に Sub Macro2() と書いてあっても、Macro2は実行されません。 それは解っていますか? 同じファイルにいくつものマクロを書いても、実行されるのは、指定して実行させたマクロだけです。 マクロからマクロを実行させることもできます。 その場合は、マクロの中で、 Call マクロ名 と書きます。 なので、Macro1とMacro2があって、その2つをMacro3で実行させたいなら、 Sub Macro3() Call Macro1 Call Macro2 End Sub とすればよいです。
補足
何度も申し訳ありません。丁寧に教えてくださったのに未だうまくいかないです。 Module1にMacro1を記入し、Module2にはMacro2を記入しました。そしてModule3に教えていただいたMacro3を記入しました。そしてMacro3の実行を押すと、なにも起こりませんでした。 End Subは、Macro1,2、3、全てに必要ですよね? End Subを取ると、エラーが起こってしまいました。 しかし、今申し上げたやり方にしますと、何も起こらないんです。 基本的なところがわかっていないと思うので、お手数をおかけしますがもしなにか間違いがわかりましたらお願いします。
- nattocurry
- ベストアンサー率31% (587/1853)
2つ確認させてください。 (1) 具体的に、どのような実行のさせ方をしていますか? (2) Macro1とMacro2、それぞれのマクロが実行されているかどうかは、どのようにして確認していますか?
補足
実行はツール→マクロ→(マクロ名が出てくる)→実行 です。 また、それぞれのマクロの実行は、 Macro1だけで実行、 そしてMacro2だけで実行(このときMacro1は完全に消去) だと、それぞれには作動します。 なので、このそれぞれのマクロに問題はないようです。
- Sinogi
- ベストアンサー率27% (72/260)
どんな手順でマクロを実行していますか? 質問文面から推測すると、VBEのコード上から実行しているような気もしますが、どのような方法であれ1回の実行指示で実行できるのはひとつです。 質問文程度のコード量ならひとつにしても差し支えありませんが、大作になると「プロシージャが大きすぎます」のようなエラーになる恐れがあります。 そんなときは#2氏が提示したように、既存のマクロを順次実行するすマクロを作成し、それを呼び出すことになります。 よってご質問への回答は 1.ひとつにする →マクロ1の最後(End Sub)の直前にマクロ2の実態部分を記述する 2.#2氏回答のように 希望の順次実行ができるマクロを記述し、そのマクロを実行する のいずれかでいかが?
補足
ありがとうございます。馬鹿な質問で申し訳ありませんが、 1、に関しては、 Sub Macro1() For s ***(省略) Exit For '値が見つかったのでForを終了 End If Next Next (このNextに続けて下記の式を記入。下記はmacro2()に記入していた式です) For s = ***(省略) Exit For '値が見つかったのでForを終了 End If Next Next End Sub で、よいでしょうか。こうすると、実行を押しても何も作動しなくなりました。 また2についてですが、 私が始めに記載しておりましたMacro1と2の式をそのまま続けさまに書いて、 #2氏が教授下さったマクロをその最後に記載すると、実行画面で Macro1,Macro2,Mainloopの3つに分かれました。 そして、その実行ボタンを押しても、どれも反応がありません。 お手数をおかけし申し訳ありませんが何かわかりましたらまたお願いします。
- t_nojiri
- ベストアンサー率28% (595/2071)
Sub Mainloop() Call Macro1() Call Macro2() End Sub とかじゃ、駄目ですか?
補足
回答に大変感謝いたします。 ただ、初心者のため、具体的に教えていただけないでしょうか。 私の書いた二つの式を並べてその最後に教えていただいたものを記入したらよろしいでしょうか?
- kmetu
- ベストアンサー率41% (562/1346)
1も2もまったく同じですがなぜ同じものを2個作る必要があるのでしょう? ちなみにどちらも動作しますよ。
補足
なぜか、というと、初心者ですので、どうしてよいかわからず例題に習って、必要な式を二つ作ったのです。 (なので無駄が多いとは思うのですが)
お礼
教えていただいたやり方でついに成功しました。 初心者の私に丁寧に教えていただき本当にありがとうございました。 またこれからもすこしずつ学んでいこうと思います。 お時間をとらせてすみませんでした。 他の皆さんもまことにありがとうございました。
補足
皆様、大変申し訳ありません。 元々の文章にあやまりがありました。 Macro1と2に全く同じものを書いてしまっていましたが、ここの質問欄に載せたときの誤りでした。 大変申し訳ありません。 以下が私が入力していた(本当の)Macroです。 要するに、要点検という名前のSheetとMASTERという名前のシートがあり、 それをSheet1という名前のSheetに、Vlookのような仕組みで、値を引っ張ってきて表示させようとしています。 大変申し訳ありませんでした。 とにかく、教えていただいたやりかたでもう一度やってみます。 Sub Macro1() For n = 2 To 70 '処理するSheet1の行数範囲 a = Sheets("Sheet1").Cells(n, 3) 'aにC列の値を代入 For m = 2 To 70 '検索する元データの行数範囲 If Sheets("要点検").Cells(m, 3) = a Then '要点検のC列の値とSheet1のC列が一致した場合 v = Sheets("要点検").Cells(m, 4) 'vにD列の値を代入 Sheets("Sheet1").Cells(n, 6).Value = v 'Sheet1のB列に値を入力 Exit For '値が見つかったのでForを終了 End If Next Next Sub Macro2() For s = 2 To 70 '処理するSheet1の行数範囲 b = Sheets("Sheet1").Cells(s, 2) 'bにB列の値を代入 For u = 2 To 70 '検索する元データの行数範囲 If Sheets("MASTER").Cells(u, 1) = b Then 'MASTERのA列の値とSheet1のB列が一致した場合 w = Sheets("MASTER").Cells(u, 2) 'wにB列の値を代入 Sheets("Sheet1").Cells(s, 3).Value = w 'Sheet1のC列に値を入力 Exit For '値が見つかったのでForを終了 End If Next Next End Sub