![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
ツールバーにボタンを作って、そのボタンをクリックしたら OnActionプロパティ
で指定したマクロを実行するというワークブックを作りアドイン化しました。
以下、アドインのマクロ。
ThisWorkbookに
Private Sub Workbook_Open()
' ツールバーを削除
On Error Resume Next
Application.CommandBars("MyMenu1").Delete
On Error GoTo 0
With Application.CommandBars.Add(Name:="MyMenu1")
.Visible = True
.Position = msoBarBottom
.RowIndex = 1
.Controls.Add (msoControlButton)
With .Controls.Item(1)
.Caption = "test1"
.OnAction = "a"
.FaceId = 59
End With
End With
End Sub
標準モジュールに
Public Sub a()
MsgBox "アドイン"
End Sub
としました。
これでこのアドインをExcelに登録すれば、どのファイルを開いた時でも
ツールバーのボタンをクリックすれば、アドインのマクロが実行されます。
が、上記OnActionに記述したのと同じ名前のサブルーチンが、
今アクティブになっているワークブックにあった場合には、アドイン側の
サブルーチンではなく、ワークブック側のが実行されてしまいます。
色々検索した結果、
OnActionの指定を「.OnAction = Thiswokbook.FullName & "!a"」とすればよい
という記述を目にし、その通りにしましたが効果ありませんでした。
なお、Excel2000または2003で起きました。2010では通常にアドイン側のサブルーチンが
起動しています。
取りあえず、誰もつけそうにない名前をアドイン側のサブルーチンにつけていますが、
これしか手立てはないものでしょうか?
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
>5.で開いたサブルーチンには、Module1にサブルーチンa があるのみです。
>.OnAction = "XXX.a" と変更したところで、アクティブになっているワークブックの
>モジュールXXXにサブルーチンaがあれば、こっちの方を実行してしまうのは
>変わりませんでした。
XXXはオブジェクト名で変更できるので、固有のモジュール名に変更しておくのが無難です。
>アドイン側のモジュール名なり、サブルーチン名なりを工夫して衝突しないような
>名前を工夫するしかないのでしょうか?
通常はアドイン登録時のモジュールを常に参照しつづけるはずなのですがね。
何らかの原因で書き換えられていると考えられます。
回答ありがとうございます。
実は http://fireball.loafer.jp/kes/vba/article_182.html というWebページを
見つけました。このページに従い、OnActionプロパティを使用する方法に見切りをつけ、
Clickイベントで処理する方法に切り替えました。
結果、成功です。きちんと、アドイン側のサブルーチンを実行してくれるようになりました。
プログラムはこんな感じになりました。
アドインのThisWorkbook
Private WithEvents m_Button As CommandBarButton
Private Sub m_Button_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
Call a
End Sub
Private Sub Workbook_AddinInstall()
Dim strFilename As String
' ツールバーを削除
On Error Resume Next
Application.CommandBars("MyMenu1").Delete
On Error GoTo 0
Debug.Print ThisWorkbook.Name & " AddinInstall"
With Application.CommandBars.Add(Name:="MyMenu1")
.Visible = True
.Position = msoBarBottom
.RowIndex = 1
Set m_Button = .Controls.Add(msoControlButton)
With m_Button
.Caption = "test1"
.Tag = "Test1"
.FaceId = 59
End With
End With
End Sub
Private Sub Workbook_AddinUninstall()
Debug.Print ThisWorkbook.Name & " AddinUninstall"
' ツールバーを削除
On Error Resume Next
Application.CommandBars("MyMenu1").Delete
On Error GoTo 0
End Sub
Private Sub Workbook_Open()
Set m_Button = Application.CommandBars("MyMenu1").FindControl( _
Type:=msoControlButton, Tag:="Test1")
End Sub
標準モジュール
Sub a()
MsgBox "アドイン"
End Sub
以上
No.2
- 回答日時:
.OnAction = "a"
を
.OnAction = "Module1.a"
とモジュール名も記載する様にしたほうが無難です。
Module1といったありきたりものではなく、アドインのものはあらかじめ変更しておくことをお勧めします。
>5.で開いたワークブックのサブルーチン
5.で開いたワークブックにはツールバーを作成するような記述はないのでしょうか?
記述があるならそこが問題の可能性もあります。
この回答への補足
回答ありがとうございます。
5.で開いたサブルーチンには、Module1にサブルーチンa があるのみです。
.OnAction = "XXX.a" と変更したところで、アクティブになっているワークブックの
モジュールXXXにサブルーチンaがあれば、こっちの方を実行してしまうのは
変わりませんでした。でも、名前が衝突する確率はぐっと減りそうです。
アドイン側のモジュール名なり、サブルーチン名なりを工夫して衝突しないような
名前を工夫するしかないのでしょうか?
No.1
- 回答日時:
せっかくアドインにしているのだから、Open時に毎回ツールバーを作成せずに、
アドイン登録時にツールバー作成、アドイン解除時に、ツールバー削除
の様にすれば、問題ないです。
(アドイン登録する際は、ほかに競合するマクロがない状態で行います)
Private Sub Workbook_AddinInstall()
With Application.CommandBars.Add(Name:="MyMenu1")
.Visible = True
.Position = msoBarBottom
.RowIndex = 1
.Controls.Add (msoControlButton)
With .Controls.Item(1)
.Caption = "test1"
.OnAction = "a"
.FaceId = 59
End With
End With
End Sub
Private Sub Workbook_AddinUninstall()
' ツールバーを削除
On Error Resume Next
Application.CommandBars("MyMenu1").Delete
On Error GoTo 0
End Sub
この回答への補足
回答ありがとうございます。
AddinInstallイベントって今一つどういう時に使用するのかわかってませんでした。
「ツール」→「アドイン...」で、チェックをOnにすると実行されるようですね。
確かにこの方法なら、アドインをOpenする度にツールバーを作成することがないので
動作が少しは軽くなりそうですが、問題は解決しませんでした。
一応、こちらのやったことを書いておきます。
1.アドインのThisWorkbookにkyboさんのマクロを書いて、保存
もちろん、Workbook_Openは消しました。
2.サブルーチンaを含むワークブックを開いていないか確認
3.「ツール」→「アドイン...」を選択し、アドインをOff、Onする
4.ツールバーのボタンをクリックし、アドインのサブルーチンが動作しているのを確認
5.サブルーチンaを含むワークブックを開く
6.再びツールバーのボタンをクリックするが、5.で開いたワークブックのサブルーチン
が動作した。
手順はあっているでしょうか?
なお、上記はExcel2003で行いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/13 08:41
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/10 14:24
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- Excel(エクセル) Excelのマクロコードについて教えてください。 1 2022/03/27 10:47
- Visual Basic(VBA) 標準モジュール Public mOnTime As Date Sub sample() '実行プロシ 1 2023/02/22 15:44
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
例外処理のフローチャートの記...
-
モジュールとサブルーチン
-
ACCESSのVBAでPrivate Sub ~en...
-
初歩的な質問なのですが、サブ...
-
Excel VBAで、ユーザーフォー...
-
COBOLで、Shellを起動するには?
-
ExcelVBA AddinでOnAction
-
”:”がいっぱいの文について。
-
VBでグローバル変数を宣言するには
-
Excel VBAでリンク切れをチェッ...
-
グラフのX,Y座標を取得したい
-
ユーザー定義関数に#NAME?が返...
-
VBA This Workbookモジュール...
-
エクセルVBAでシートモジュール...
-
Excel VBA 『Call』で呼び出す...
-
VBAで別モジュールへの変数の受...
-
DBD::mysql インストールについて
-
教えて下さい。
-
標準モジュールを削除したい。(...
-
Perl モジュールのアンインスト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
例外処理のフローチャートの記...
-
Excel VBAで、ユーザーフォー...
-
COBOLで、Shellを起動するには?
-
モジュールとサブルーチン
-
”:”がいっぱいの文について。
-
ExcelVBA AddinでOnAction
-
オフコン(富士通Kシリーズ)...
-
ACCESSのVBAでPrivate Sub ~en...
-
VBAで2重のDoLoop関数から抜け...
-
fortran95実行エラー
-
perlの構文でカンマの意味が分...
-
プログラムの可読性が悪いです...
-
Perlのサブルーチンの引数引継ぎ?
-
サブルーチンを認識しません。
-
GOSUB命令とは
-
Inline CでOpenMPは使えますか?
-
初歩的な質問なのですが、サブ...
-
サブルーチンに引数を2つ以上...
-
BASIC言語で時差を求めるには?
-
cobol サブルーチンのlink
おすすめ情報