dポイントプレゼントキャンペーン実施中!

Personal.xlsbにマクロを書き、他ブックのマクロから呼び出そうとしてもエラーになります。
エラーメッセージ:
コンパイルエラー SubまたはFunctionが定義されてません。

Book1
Sub Test()
Call Macro1
End Sub

PERSONAL.XLSB
Sub Macro1()
Range("A1").Selelct
End Sub

なぜでしょう?

A 回答 (3件)

こんにちは。



>なぜでしょう?
理由は、グローバル化していないからです。
私は、長い間、分かりませんでした。

標準モジュールなら、Private を付けないかぎりは、Public 化していますが、それでは、一つのブックの中でしか通用しません。例えばユーザー定義関数を作って、別のブックの標準モジュール に保管したものも使えません。
通常は、#1さんが示しているように、Application.Run で呼び出しをしますが、常に使うものには、そういう面倒なことをしたくないものです。

その場合、呼び出される(マクロを登録した)ブックを、マクロを呼び出す側のVBE のツールから、参照設定を使うのです。ただし、VBProject という名称は、ダブってしまいますので、呼び出されるブックのプロパティのVBProject の名前は換えてください。また、プロシージャ名や関数名も一意のものにします。

当然、参照設定すると、今度は元のブックを開くと、呼び出されるブックは自動的についてきます。それはうっとうしいわけです。

だから、その呼び出される側のブックをアドイン化してしまうということをします。

ただし、個人用マクロブックに対しては、Excelでは参照設定しないのが一般的です。理由は知りませんが、もしかすると、個人用マクロブックは、一般のユーザーが知らないようなデータも含んでいるのかもしれません。個人用マクロブックは取り扱いには慎重に扱ったほうが良いようです。MS-Wordの場合は、最初から設定が入っています。

えてください。圧倒的に前者のRun を使う方が多いですが、参照設定自体は、手動だけでなく、マクロで自動的に設定が可能です。Application.Run で行うか、参照設定にするかは、その状況によって変えてください。
    • good
    • 2
この回答へのお礼

ありがとうございます。
アドイン化、試してみます。

お礼日時:2015/11/18 21:08

こんばんは。



>えーそりゃないよ引数付はダメじゃん、が感想です。

こんな感じで処理することもあります。
'//
'TestBook1.xlsmが同じフォルダーにある場合

num = 5
Application.Run "'TestBook1.xlsm'!Module1.MyTestArg(" & num & ")"
'ただ、あまりうまくいくとはいえません。これは、文字の引数が受けられません。
'やはり、Call の方が上です。
'--------------
Public Sub MyTestArg(arg)
If IsNumeric(arg) Then
 MsgBox arg ^ 2
Else
 MsgBox "文字? " & arg
End If
End Sub

'//
    • good
    • 0

ブックが違うものはCallでは呼べません。



Book1
Sub Test()
  Application.Run "PERSONAL.XLSB!Module1.Macro1"
End Sub

PERSONAL.XLSB
Sub Macro1()
  Range("A1").Selelct
End Sub
    • good
    • 0
この回答へのお礼

いやいや使いたい時にいつでも実行出来るように登録するのが個人用⚫⚫⚫
と書こうとしたところで分かりました。

他所からcallするのがダメなのですね。
えーそりゃないよ引数付はダメじゃん、が感想です。

お礼日時:2015/11/18 18:42

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A