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

個人用マクロを作る練習で、あるサイトから下記サンプル①②をいれたのですが
sub macroを実行するとコンパイルエラー「subまたはFunctionが定義されていません」
となります。 エクセル2007です。
①personal.XLSBの標準モジュール
Function CalcTax(price As Long) As Double
Dim d As Date
Dim tax As Double
' 消費税が変わる基準日
d = #10/1/2019#
If d > Date Then
tax = 1.08
Else
tax = 1.1
End If
CalcTax = price * tax
End Function
②BOOK1の標準モジュール
Sub macro() ’消費税込み計算
Debug.Print (CalcTax(100))  
End Sub
当初アドインで作ったのですが同じエラーで、アドイン設定に関係ない
個人用マクロにしましたが同じエラーです。
一旦保存して終了し再度開いてもエラーになります。
①の中にsub macroを入れて実行すると正しく110と表示されます。
何が不足していますでしょうか。

A 回答 (2件)

こんにちは


事象は少しわからないのですが、下記の参考サイトのような手順で登録されたのでしょうか?
https://hirachin.com/post-7298/

関数登録はApplication.MacroOptions メソッドを使ったのでしょうか
https://docs.microsoft.com/ja-jp/office/vba/api/ …

PERSONAL.XLSBに関してもですが、他のブックのVBAを実行する場合
https://docs.microsoft.com/ja-jp/office/vba/api/ …

Application.Run "x!xx" のように呼ぶと思いますが、引数があるとうまく行かない場合があるようです
Callについては、対象VBAProjectがPublicでないので参照されていないとダメなのだと思います

各マクロ有効ブックのVBAProjectオブジェクト名は変更しないと同じ
VBAProjectとなります
VBEのオブジェクトブラウザのツリーを見ると確認できます
これを参照可能にするためには、#1で示したようにプロパティで
オブジェクト名を変更します
例えば、Personal_VBAProject 重複しなければよいかと

で VBAを実行するブックで参照設定 Personal_VBAProject にチェック
又はVBAで参照する この場合、セキュリティ設定の変更が必要だったかと・・

On Error Resume Next
ActiveWorkbook.VBProject.References.AddFromFile Application.StartupPath & "\PERSONAL.XLSB"

Personal_VBAProject内を呼ぶ事が出来ます

アドインについては、調べれば、情報はありそうですが、だいぶ忘れてしまいましたので良い回答が出来なくすみません
    • good
    • 0
この回答へのお礼

ありがとうございます。
①:はい、参考サイトは、そのhttps://hirachin.com/post-7298/です。
②:関数登録も同じです。従って、ワークシート上の操作は、ユーザー関数「=CalcTax」や、リボン登録したSubモジュールも動きました。
③:質問欄の②のように普通にモジュールCallしていました。Application.Runは、以前使用したことがあるのですが失念しておりました。申し訳ありません。 Application.Runでアドインのxlamを指定して実行したらコンパイルエラーは消えました。(ファイル指定しないと”マクロ無効エラー"になる)

④しかし本来作りたかったのはパラメーター受け渡し付共通モジュールです。
Sub test11()
a = 100
Call Application.Run("'アドインテスト.xlam'!test_subA", a, b)
Debug.Print a & " " & b
End Sub
aは渡せましたが、戻り値のbがempty でした。
⑤ユーザー関数のCall Application.Run("CalcTax", 300)では戻り値の330が取得できませんでした。→ こちらはファイル指定不要でした。
⑥その後調べて CallByName関数というのを使ってみたところ
Call CallByName(Application, "Run", VbMethod, "'アドインテスト.xlam'!test_subA", a, b)でab両方取得できました。

問題点としてRANGEの受け渡しが出来ないのですが、これはやむなしとしました。ユーザー関数はおまけなので使えなくても良しとし、SubとCallByNameでほぼ対応できました。

基本的なミス(Application.Run)をご指摘頂きありがとうございました。

お礼日時:2022/08/24 10:19

こんばんは


Functionで引数があるので、そのままで使用したいのでしたら、
参照設定をします

①VBEを開く
②プロジェクトブラウザのpersonal.XLSBの
VBProjectを右クリック プロパティから名前を変更して
VBProject名を任意の名前(使われている名前は不可)に変更
③使用するブック側で参照設定
任意に決めた名前にチェックを入れます。
これで呼び出されると思いますが・・・
私個人的には面倒なのでpersonal.XLSBを使用するよりアドインにした方が良いと思います。
    • good
    • 1
この回答へのお礼

ありがとうございます。
使用するブック側で参照設定したつもりですが、personal.XLSBに参照設定のツリー?が表示されて、参照する側のような表示になって難航し面倒そうなので、一旦全部削除してSub(A)とFunction( CalcTax)の2つを入れたアドインをあらためて作り、Aをリボンにマクロとして登録しました。新規ブックを開き
①リボンから実行するとAは動きました。
②セルで=を入れてもCalcTaxは関数候補として出てきませんが、
=calctax(100)入力すると110が表示されました。
③テストマクロでAをCallすると定義されていないエラー
上記「macro」でCalcTax(100)を呼び出そうとしても同じくエラー

Sub A() 'タイトル除きでセレクト
Selection.CurrentRegion.Select
Selection.Offset(1).Select
Selection.Resize(Selection.Rows.Count - 1).Select
End Sub

セキュリティのデジタル署名が無かったので作成してます。
③でアドインファイルのモジュール参照が出来ていないようですが、
①②が出来ているのが不思議です。

出来ないと不便というわけでは無いのですが、エラーの出るのを
出来れば解消したく、なにかヒントがあればお願いします。

お礼日時:2022/08/23 16:16

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