• 締切済み

ExcelVBA AddinでOnAction

ツールバーにボタンを作って、そのボタンをクリックしたら 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では通常にアドイン側のサブルーチンが 起動しています。 取りあえず、誰もつけそうにない名前をアドイン側のサブルーチンにつけていますが、 これしか手立てはないものでしょうか?

みんなの回答

  • kybo
  • ベストアンサー率53% (349/647)
回答No.3

>5.で開いたサブルーチンには、Module1にサブルーチンa があるのみです。 >.OnAction = "XXX.a" と変更したところで、アクティブになっているワークブックの >モジュールXXXにサブルーチンaがあれば、こっちの方を実行してしまうのは >変わりませんでした。 XXXはオブジェクト名で変更できるので、固有のモジュール名に変更しておくのが無難です。 >アドイン側のモジュール名なり、サブルーチン名なりを工夫して衝突しないような >名前を工夫するしかないのでしょうか? 通常はアドイン登録時のモジュールを常に参照しつづけるはずなのですがね。 何らかの原因で書き換えられていると考えられます。

doara_2011
質問者

お礼

回答ありがとうございます。 実は 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 以上

  • kybo
  • ベストアンサー率53% (349/647)
回答No.2

.OnAction = "a" を .OnAction = "Module1.a" とモジュール名も記載する様にしたほうが無難です。 Module1といったありきたりものではなく、アドインのものはあらかじめ変更しておくことをお勧めします。 >5.で開いたワークブックのサブルーチン 5.で開いたワークブックにはツールバーを作成するような記述はないのでしょうか? 記述があるならそこが問題の可能性もあります。

doara_2011
質問者

補足

回答ありがとうございます。 5.で開いたサブルーチンには、Module1にサブルーチンa があるのみです。 .OnAction = "XXX.a" と変更したところで、アクティブになっているワークブックの モジュールXXXにサブルーチンaがあれば、こっちの方を実行してしまうのは 変わりませんでした。でも、名前が衝突する確率はぐっと減りそうです。 アドイン側のモジュール名なり、サブルーチン名なりを工夫して衝突しないような 名前を工夫するしかないのでしょうか?

  • kybo
  • ベストアンサー率53% (349/647)
回答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

doara_2011
質問者

補足

回答ありがとうございます。 AddinInstallイベントって今一つどういう時に使用するのかわかってませんでした。 「ツール」→「アドイン...」で、チェックをOnにすると実行されるようですね。 確かにこの方法なら、アドインをOpenする度にツールバーを作成することがないので 動作が少しは軽くなりそうですが、問題は解決しませんでした。 一応、こちらのやったことを書いておきます。 1.アドインのThisWorkbookにkyboさんのマクロを書いて、保存   もちろん、Workbook_Openは消しました。 2.サブルーチンaを含むワークブックを開いていないか確認 3.「ツール」→「アドイン...」を選択し、アドインをOff、Onする 4.ツールバーのボタンをクリックし、アドインのサブルーチンが動作しているのを確認 5.サブルーチンaを含むワークブックを開く 6.再びツールバーのボタンをクリックするが、5.で開いたワークブックのサブルーチン   が動作した。 手順はあっているでしょうか? なお、上記はExcel2003で行いました。

関連するQ&A

  • VBA アドイン

    今,下記のプログラムを組みメニューバーに登録しユーザフォームを実行させようとしています. Private Sub workbook_addininstall() Dim Menubar As CommandBar Set Menubar = Application.CommandBars.Add(Name:="グラフ作成ツール") With Menubar.Controls.Add(Type:=msoControlButton) '1 .FaceId = 23 .Style = msoButtonIconAndCaption .TooltipText = "グラフ作成ツール" .OnAction = ThisWorkbook.Name & "!UserForm_open" End With Menubar.Visible = True MsgBox "「グラフ作成ツール」ツールバーがインストールされました。", vbOKOnly End Sub 標準モジュールに Sub UseForm_open() graph.Show End Sub として実行させようとすると,下記のようなエラーが返ってきて実行できませんでした. マクロ''グラフ作成ツール.xla'!UserForm'を実行できません。   このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。 どうすれば実行できますでしょうか?ご指導ご鞭撻のほどよろしくお願いいたします.

  • エクセルVBA アドイン メニューの作成方法

    OS:windowsXP HomeEdition ソフト:Excel2003 アドインを作成し配布したいのですが、xla形式で保存しエクセル上でアドインさせ、 作成したメニューからテスト起動させてみると、アドインの元のファイル(拡張子xls)が 展開してしまいます。展開させずにアドインプロシージャを起動させたいのですが 何が原因か調べてもわかりませんでした。知っている方、ご助言御願い致します。 以下に、私の作成したマクロを記述します。 マクロ解説HPで勉強しつつ作成致しました。 ~~~~~~~~~~~~~~~~~~~~~~~~~ <ThisWorkBookへの記述> Dim mySubMenu As CommandBarControl Sub MakeSubMenu() Dim myMenu As CommandBar Dim cmdSubMenu As CommandBarControl 'すでにサブメニューがあれば削除する DelSubMenu Set myMenu = Application.CommandBars("worksheet Menu Bar") Set mySubMenu = myMenu.Controls.Add(Type:=msoControlPopup) mySubMenu.Caption = "メニュー" Set cmdSubMenu = myMenu.Controls("メニュー").Controls.Add(Type:=msoControlButton) cmdSubMenu.Caption = "コマンド1" 'サブメニューでコマンド1を選択したとき cmd1() を呼び出す cmdSubMenu.OnAction = "cmd1" Set cmdSubMenu = myMenu.Controls("メニュー").Controls.Add(Type:=msoControlButton) cmdSubMenu.Caption = "コマンド2" 'サブメニューでコマンド2を選択したとき cmd2() を呼び出す cmdSubMenu.OnAction = "cmd2" End Sub Sub DelSubMenu() 'メニューバーのサブメニューを削除する On Error Resume Next mySubMenu.Delete End Sub <標準モジュールへの記述> Private Sub cmd1() MsgBox "コマンド1を選択しました" End Sub Private Sub cmd2() MsgBox "コマンド2を選択しました" End Sub ~~~~~~~~~~~~~~~~~~~~~~~ 尚、マクロは簡略化し、のせております。 よろしく御願い致します。

  • エクセル2007で自前のツールバーを作る方法

    エクセル2000です。 以下のマクロで自前の新しいツールバーが作れ、作動します。 ところがエクセル2007ではうんともすんとも言ってくれません。 エクセル2007で使う場合はどのようにしたらよいでしょうか? ユーザーフォームで似たようなものを作る方法はわかるのですが、できれば以下の方法を使いたいのです。 Sub 三択メニュー() On Error Resume Next Application.CommandBars("選択します").Delete On Error GoTo 0 Application.CommandBars.Add Name:="選択します", Position:=msoBarFloating With Application.CommandBars("選択します") .Visible = True .Controls.Add Type:=msoControlButton With .Controls(1) .Style = msoButtonCaption .Caption = "⇒メニュー1 " .OnAction = "Msg_1" End With .Controls.Add Type:=msoControlButton With .Controls(2) .Style = msoButtonCaption .Caption = "⇒メニュー2 " .OnAction = "Msg_2" End With .Controls.Add Type:=msoControlButton With .Controls(3) .Style = msoButtonCaption .Caption = "⇒メニュー3 " .OnAction = "Msg_3" End With End With End Sub Sub Msg_1() Application.CommandBars("選択します").Delete MsgBox "追加コマンド1を処理しました。" End Sub Sub Msg_2() Application.CommandBars("選択します").Delete MsgBox "追加コマンド2を処理しました。" End Sub Sub Msg_3() Application.CommandBars("選択します").Delete MsgBox "追加コマンド3を処理しました。" End Sub

  • EXCEL VBAアドイン:シートの右クリックメニューへの追加方法その2

    下記「シートの右クリックメニュー追加」+BBBマクロをアドインへ組み込み、皆さんへ配布して、自動的に右クリックメニューに組み込んでBBBマクロを動作させたいのですが、やり方を教えて下さい。 PERSONAL.XLSのThisWorkbookにAddinstallイベントプロシージャーで下記のように記述しましたがエラーが出ます。 どのように修正すれば良いか、教えて下さい。 また、やり方はこれでOKでしょうか。 なお、標準モジュールに登録して実行すると動きます。 宜しく、お願いします。 「エラー内容」 実行時エラー’91’ オブジェクト変数またはWithプロック変数が設定されていません。 Sub シートの右クリックメニュー追加()  With CommandBars("Cell").Controls.Add   .Caption = "AAA(メニューの表示文字)"   .OnAction = "BBB(実行するマクロ名)"   .BeginGroup = True  End With End Sub

  • Word ツールバーの削除

    下記の様なマクロを組み込みました。 しかしこのマクロ自体不必要になったので削除したのですがツール→ユーザー設定→ツールバーにはツールバー及びボタンが残ってしまいました。 ツール→ユーザー設定→ツールバーで削除をすれば消えますが新たにWordを立ち上げると消えていません。 マクロでCommandBars("Indent").Deleteともしましたが結果は同じでした。 どうすれば消えるのでしょうか?どなたかご教授願います。 Sub auto_open() Dim myBar As CommandBar, myButton As CommandBarButton '新しいMenuBarを追加 Set myBar = CommandBars.Add 'MenuBarに名前を設定 myBar.Visible = True myBar.Name = "Indent" myBar.Position = msoBarTop '新しいボタンを追加 Set myButton = myBar.Controls.Add With myButton .Caption = "[チュックインデント]" .Style = msoButtonCaption End With 'ボタンが押下時実行マクロ設定 myButton.OnAction = "checkIndent" myBar.Visible = True End Sub Sub auto_close()

  • EXCEL VBA:シートの右クリックメニューへの追加方法

    (1)EXCEL VBAで、シートの右クリックメニューへの追加方法が下記の通り、ある本に載っていたので試してみましたが、うまく動作しません。 どこが間違っているか教えて下さい。  Sub シートの右クリックメニュー追加()  With CommandBars("Ply").Controls.Add  .Caption = "AAA(メニューの表示文字)"  .OnAction = "BBB(実行するマクロ名)"  .BeginGroup = True  End With  End Sub (2)上記「シートの右クリックメニュー追加」+BBBマクロをアドインへ組み込み、皆さんへ配布して、右クリックメニューで動作させたいのですが、やり方を教えて下さい。 宜しく、お願いします。

  • メニューバーのイベントが2回実行される

    CommandBarControlでメニューバーを作成し、イベントを実行していますが、何故か2回実行されてしまいます。 具体的には、  Set myMenu = Application.CommandBars("Worksheet Menu Bar"). _ Controls.Add(Type:=msoControlPopup, before:=11) With myMenu .Caption = "User's MenuBar(xx)" With .Controls.Add .Caption = "フォームを開く" .OnAction = "OpenForm(2)" End With 上記で「フォームを開く」メニューバーを作成して、これを選択すると、UserForm1.Show というロジックが書かれているSubプロシジャーが実行されます。 これにより、フォームが開くのですが、どうもこのプロシジャーが2回実行されており、フォームが2つ開いているのです。 しかし、原因がわかりません。 対策としては、 1.2回実行される原因を調べる。 2.UserForm1が既に開いていたら開かないようにロジックを変更す   る。 1は皆無ですし、2はUserForm1が既に開いているかをチェックするロジックが分かりません。 どなたか教えて下さい。 よろしくお願いします m(_ _)m

  • Excell2010VBAmacro互換性

    マイクロソフトオフィス2010EXCELマクロについて質問させてください。 VBAマクロでマウス右クリック時にポップアップメニューを出し、 自作マクロを呼び出すようにしました。動作している。 このマクロを別PCのオフィス2013で動作させると、 マクロ内部ではポップアップメニューを作成動作している ようです(デバッグで通っていること確認)ようですが、 EXCEL画面上にはメニューが表示されません。 サンプルマクロは下記参照。 非互換または設定漏れがあるのでしょうか?   サンプルマクロ Sheet1 --------------------------------------- Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Application.CommandBars("Cell").Reset '右クリックメニューを初期設定に戻す Call set_RightMenu '右メニュー登録 End Sub Module1 --------------------------------------- Sub reset_RightMenu() ' '右クリックメニューを初期化 ' Application.CommandBars("Cell").Reset End Sub Public Sub set_RightMenu() ' ' 右クリックメニューを設定する ' Call reset_RightMenu '右クリックメニュー初期化 With Application.CommandBars("Cell") _ .Controls.Add() .BeginGroup = True .Caption = "menu0" .FaceId = 682 .OnAction = "menu0" End With With Application.CommandBars("Cell") _ .Controls.Add(Type:=msoControlPopup) .BeginGroup = True .Caption = "SubMenu" With .Controls.Add(Type:=msoControlButton) .Caption = "menu1" .FaceId = 931 .OnAction = "menu1" End With With .Controls.Add(Type:=msoControlButton) .Caption = "menu2" .FaceId = 931 .OnAction = "menu2" End With End With End Sub Sub menu0 MsgBox "****** Menu 0 *******" End Sub Sub menu1 MsgBox "****** Menu 1 *******" End Sub Sub menu2 MsgBox "****** Menu 2 *******" End Sub

  • Excel VBAでツールバーにマクロを登録したい

    自作のツールバーをブックに添付し、 スタートアップにマクロを書いたブックを保存し(起動して非表示にしてあります)、 そのマクロをツールバーの各ボタンに登録しようとしています。 下記のようなコードを書いたのですが、ツールバーに作成したボタンにはマクロが登録できるのですが、 サブメニュー内のボタンには登録できません。 Dim MyWB, NBar MyWB = "stampB.xls" NBar = "stampB1.0" For i = 1 To Application.CommandBars(NBar).Controls.Count  'ボタンのキャプションと同じ名前のマクロを登録  With Application.CommandBars(NBar).Controls.Item(i)   .OnAction = MyWB & "!" & .Caption  End With Next i これをどのように改良したら、サブメニュー内のボタンにもマクロを登録できるようになりますでしょうか? ご存知の方どうぞよろしくお願いします。

  • EXCEL VBA でマクロが作動するシートとしないシートがある。

    右クリックのショートカットメニューに作成したマクロを追加しました。その追加マクロを実行しても右クリックのショートカットに追加されないシートがあります。同じbookでもその他のシートでは、右クリックのショートカットメニューに追加されているものもあります。 なぜでしょうか? できないのは、右クリックのショートカットの表示です。目的の動作(下記の場合は、フォントの色を変える)は、どのシートでも作動します。 ちなみにプロシージャーは次のように書いています。PERSONAL.XLSに登録してあります。 宜しくお願いします。 'セルの右クリックショートカットメニューを作成 Sub 色々右クリック() 赤みぎクリック 黒みぎクリック 青みぎクリック End Sub Sub 赤みぎクリック() Dim Newb Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "赤" .OnAction = "赤フォント" .BeginGroup = False End With End Sub Sub 赤フォント() Selection.Font.ColorIndex = 3 End Sub Sub 黒みぎクリック() Dim Newb Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "黒" .OnAction = "黒フォント" .BeginGroup = False End With End Sub Sub 黒フォント() Selection.Font.ColorIndex = 1 End Sub Sub 青みぎクリック() Dim Newb Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "青" .OnAction = "青フォント" .BeginGroup = False End With End Sub Sub 青フォント() Selection.Font.ColorIndex = 5 End Sub Sub Reset_RightClick() Dim rightBar As CommandBar Application.CommandBars("cell").Reset End Sub

専門家に質問してみよう