エクセルマクロで、ひとつのマクロの中でほかのマクロを呼び出し、実行させたいのですが、やりかたがよくわかりません。

functionを使うのでは・・・?とか思うのですが・・・。

マクロを事前に何個も実行させるのではなく、ポチッとひとつだけ
実行したら終わるようにしたいのです。
今回の例ではマクロが2つですが、何個もマクロがあるので、メインのマクロをスタートさせたらすべてのマクロが動くようにしたいと考えています。
ご協力お願いします。詳細はコメントに記載します。

回答の条件
  • 1人10回まで
  • 登録:2009/01/30 19:12:36
  • 終了:2009/01/31 17:49:43

ベストアンサー

id:rome0315 No.5

rome0315回答回数13ベストアンサー獲得回数32009/01/31 11:18:53

ポイント50pt

> ⇒逆で、aaa.xlsでマクロを実行して、aaa.xlsのマクロを呼び出したいのです。

> 教えていただいたもののマクロ1とマクロ2を逆にすればいいんですよね?

はい。同じbook内のマクロであれば、マクロ名だけで呼び出せます。

別のbookのマクロはファイルを開いた状態で「Application.Run "ファイル名!マクロ名」で呼び出せます。


> macro1、macro2はa1.xls、aaa.xlsに事前に設定してあり、

> さらにmacroRunというマクロをa1.xlsに組み込むということですか?

macroRunの名前はなんでもいいんですが、自分がメインとしたいファイルに組み込んでください。

id:yuko0909

ありがとうございます。さっそくやってみます。

2009/01/31 17:48:07

その他の回答(4件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/01/30 19:34:27

お気づきのように、マクロ1に Functionプロシージャ を使います。

ご質問のケースでは、以下のような構造になります。

「ポチッとひとつだけ実行したら」が macro2 の方です。ここから macro1 を呼び出し、計算結果を macro2 の変数 x に代入します。

Function macro1(引数1, 引数2....)
    ....
    macro1 = このファンクションが返す値
End Function

Sub macro2
    ....
    x = macro1(引数)
    ....
End Sub
id:yuko0909

回答ありがとうございます。

質問なのですが、

>D列~G列にはマクロ1を実行してえられた結果(a1.xlsのシート2)のA列~D列を出力する。

という部分をするにはマクロ1のほうに、その出力の過程も書くのでしょうか?

(たとえば「.Range("D" & i).value = sheet2.Range("A" & i).valueとかみたいな出力の部分)

それとも、これはマクロ2のほうに書くのでしょうか?

2009/01/31 08:02:52
id:rome0315 No.2

rome0315回答回数13ベストアンサー獲得回数32009/01/30 20:58:03

マクロ1はa1.xlsにあり、マクロ2はaaa.xlsにあるとうことでしょうか?

a1.xlsでマクロを実行して,aaa.xlsのマクロを呼び出したいということであれば、

下記のようなマクロをa1.xlsで実行すればできると思います。


Sub MacroRun()

Macro1

Application.Run "aaa.xls" & "!Macro2"

End Sub

id:yuko0909

回答ありがとうございます。

>マクロ1はa1.xlsにあり、マクロ2はaaa.xlsにあるとうことでしょうか?

⇒はい、マクロ1はa1.xlsに、マクロ2はaaa.xlsにあります。

>a1.xlsでマクロを実行して,aaa.xlsのマクロを呼び出したいということであれば、

>下記のようなマクロをa1.xlsで実行すればできると思います。

⇒逆で、aaa.xlsでマクロを実行して、aaa.xlsのマクロを呼び出したいのです。教えていただいたもののマクロ1とマクロ2を逆にすればいいんですよね?

2009/01/31 08:07:44
id:rome0315 No.3

rome0315回答回数13ベストアンサー獲得回数32009/01/30 21:13:56

回答の補足です。

上記だと、aaa.xlsが開かれていないとエラーになります。

ファイルを開閉する処理を入れました。

開くときのファイルは絶対パスで指定してください。

Sub MacroRun()

'マクロ1を実行

Macro1

'aaa.xlsを開く

Workbooks.Open "C:\aaa.xls"

'aaa.xlsのマクロ2を実行

Application.Run "aaa.xls" & "!Macro2"

'aaa.xlsを閉じる

Workbooks("aaa.xls").Close

End Sub

id:yuko0909

補足回答ありがとうございます。

macro1、macro2はa1.xls、aaa.xlsに事前に設定してあり、さらにmacroRunというマクロをa1.xlsに組み込むということですか?

2009/01/31 08:15:29
id:pahoo No.4

pahoo回答回数5960ベストアンサー獲得回数6332009/01/31 10:12:19

ポイント50pt

マクロ1のほうに、その出力の過程も書くのでしょうか?

どちらでも構いません。

ただ、マクロ1とマクロ2の役割分担は、あらかじめ明らかにしておくのが定石です。

そこで、私だったら、コメントにあるマクロ1の仕様を以下のように改めます。単一列のコピーのみをマクロ1に負わせた方が、汎用性があると考えたので。


マクロ1

名称 Function macro1
引数 file0 コピー元のExcelファイル名
sheet0 file0の中で処理対象とするシート名
col0 コピー元の列名
col1 コピー先の列名
戻り値 macro1 TRUE/FALSE(処理が成功したかどうか)
id:yuko0909

ありがとうございます。やってみます。

2009/01/31 17:47:36
id:rome0315 No.5

rome0315回答回数13ベストアンサー獲得回数32009/01/31 11:18:53ここでベストアンサー

ポイント50pt

> ⇒逆で、aaa.xlsでマクロを実行して、aaa.xlsのマクロを呼び出したいのです。

> 教えていただいたもののマクロ1とマクロ2を逆にすればいいんですよね?

はい。同じbook内のマクロであれば、マクロ名だけで呼び出せます。

別のbookのマクロはファイルを開いた状態で「Application.Run "ファイル名!マクロ名」で呼び出せます。


> macro1、macro2はa1.xls、aaa.xlsに事前に設定してあり、

> さらにmacroRunというマクロをa1.xlsに組み込むということですか?

macroRunの名前はなんでもいいんですが、自分がメインとしたいファイルに組み込んでください。

id:yuko0909

ありがとうございます。さっそくやってみます。

2009/01/31 17:48:07
  • id:yuko0909
    例)
    マクロ1
     a1.xlsのA列(ID番号)とB列(名称)、b1.xlsのA列(ID番号)とB列(住所)をa1.xlsのシート2のA列~C列に出力するマクロがあるとする。
     各列には、A列にa1.xlsのA列を、B列にa1.xlsのB列を、C列にb1.xlsのB列を出力する。
     ※a1.xlsのA列とb1.xlsのA列のID番号は同じ。ID番号が同じデータを取得して出力している。

    マクロ2
    result.xlsという名前のファイルの各列に出力していく。
    aaa.xlsのA列の値がなくなるまで処理を続ける。
     ・A列~F列にaaa.xlsのA列~C列までの値を出力する。
      ※aaa.xlsのA列にはID番号が入っている。
     ・D列~G列にはマクロ1を実行してえられた結果(a1.xlsのシート2)のA列~D列を出力する。
      ※aaa.xlsのA列とa1.xlsのシート2のA列の値が一致するときのみ出力
     ・H列~J列にはaaa.xlsのD列~F列の値を出力する



    つまり、マクロ2のなかでマクロ1を呼び出し(?)、マクロ1を実行して得られる結果を利用して
    マクロ2に値を出力したいのです。

    マクロ1を事前に実行し、結果のシートを作っておいてからマクロ2で「Set wc = Workbooks("a1.xls").Worksheet(2)」のようにして
    マクロ1の結果のシートを参照するようにすればできるとは思うのですが、マクロを事前に何個も実行させるのではなく、ポチッとひとつだけ
    実行したら終わるようにしたいのです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません