アプリ版:「スタンプのみでお礼する」機能のリリースについて

*二つのマクロを両方実行させたいです*(初心者)
VLOOKUPのように、二つのSHEETで、それぞれ値が一致するものがあればもうひとつのSHEETのほうに値を自動的に表示させる、という仕組みをマクロで作ってみました。
(尚、今回はその中身の質問ではありません)
下記の二つの式は、それぞれは機能する、ということは確認済みなので、中身には問題ないはずなのですが、
これら二つを同じエクセルファイルに、Macro1,Macro2と設定して、実行しても、Macro2のほうしか実行されません。
1のほうは、実行を押しても作動しません。

尚、Macro2を消去すると、1のほうは正常に実行されます。

このMacro1と2は、一つにまとめても問題ありません。
(何にせよどちらも実行されればどんな形でも構いません)
初心者のため、説明が下手ですが、どなたか教えていただけないでしょうか。
どうすれば、下記の1と2を両方実行することができるのでしょうか。

下記が、私の作った式(Macro1と2です)

Sub Macro1()
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


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

A 回答 (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さんと同様の疑問を持っていますので、回答よろしくお願いします。

この回答への補足

皆様、大変申し訳ありません。
元々の文章にあやまりがありました。
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

補足日時:2010/05/14 12:15
    • good
    • 0
この回答へのお礼

教えていただいたやり方でついに成功しました。
初心者の私に丁寧に教えていただき本当にありがとうございました。
またこれからもすこしずつ学んでいこうと思います。
お時間をとらせてすみませんでした。

他の皆さんもまことにありがとうございました。

お礼日時:2010/05/17 16:52

> なぜか、というと、初心者ですので、どうしてよいかわからず例題に習って、


> 必要な式を二つ作ったのです。
> (なので無駄が多いとは思うのですが)

無駄というより無意味ですよ。意味のないことに労力を使う必要を感じないのですが…。
例題にまったく同じものを2個作るようにかいてあるのでしょうか?

なにがどうして良いかわからなかったのか
そこから解決したほうがいいと思います。

基本的に何がしたくて2個作るようになったのですか?

この回答への補足

大変申し訳ありません。
元々記入していたマクロに間違いがありました。
訂正して載せておきましたのでまたお時間があれば見てみてください。

補足日時:2010/05/14 12:17
    • good
    • 0

>実行はツール→マクロ→(マクロ名が出てくる)→実行


>です。

実行のやりかたは問題ないようですね。

>これら二つを同じエクセルファイルに、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を取ると、エラーが起こってしまいました。
しかし、今申し上げたやり方にしますと、何も起こらないんです。

基本的なところがわかっていないと思うので、お手数をおかけしますがもしなにか間違いがわかりましたらお願いします。

補足日時:2010/05/13 14:12
    • good
    • 0

2つ確認させてください。



(1) 具体的に、どのような実行のさせ方をしていますか?

(2) Macro1とMacro2、それぞれのマクロが実行されているかどうかは、どのようにして確認していますか?

この回答への補足

実行はツール→マクロ→(マクロ名が出てくる)→実行
です。

また、それぞれのマクロの実行は、
Macro1だけで実行、
そしてMacro2だけで実行(このときMacro1は完全に消去)
だと、それぞれには作動します。
なので、このそれぞれのマクロに問題はないようです。

補足日時:2010/05/13 10:55
    • good
    • 0

どんな手順でマクロを実行していますか?



質問文面から推測すると、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つに分かれました。
そして、その実行ボタンを押しても、どれも反応がありません。

お手数をおかけし申し訳ありませんが何かわかりましたらまたお願いします。

補足日時:2010/05/13 10:52
    • good
    • 0

Sub Mainloop()


Call Macro1()
Call Macro2()
End Sub

とかじゃ、駄目ですか?

この回答への補足

回答に大変感謝いたします。
ただ、初心者のため、具体的に教えていただけないでしょうか。
私の書いた二つの式を並べてその最後に教えていただいたものを記入したらよろしいでしょうか?

補足日時:2010/05/12 17:07
    • good
    • 0

1も2もまったく同じですがなぜ同じものを2個作る必要があるのでしょう?


ちなみにどちらも動作しますよ。

この回答への補足

なぜか、というと、初心者ですので、どうしてよいかわからず例題に習って、必要な式を二つ作ったのです。
(なので無駄が多いとは思うのですが)

補足日時:2010/05/13 10:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!