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

このQ&Aのポイント
  • CommandBarControlでメニューバーを作成し、イベントを実行すると、2回実行されてしまう問題が発生しています。
  • フォームを開くメニューバーを作成し、選択すると、同じコードが2回実行されてしまい、フォームが2つ開かれてしまいます。
  • 問題の原因が分からず、対策としては原因を調べるか、既に開かれているかをチェックするロジックを追加する必要があります。
回答を見る
  • ベストアンサー

メニューバーのイベントが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

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

>何故か2回実行されてしまいます。 引数を ( ) 付きで渡してるからですね。 OnActionプロパティに引数付きマクロ名を設定する時はシングルクォーテーションで囲みます。 .OnAction = "'OpenForm 2'" 他に、ParameterプロパティやTagプロパティを使ったりする方法もあります。 : With .Controls.Add   .Caption = "フォームを開く1"   .OnAction = "test"   .Parameter = 1 End With With .Controls.Add   .Caption = "フォームを開く2"   .OnAction = "test"   .Parameter = 2 End With : Sub test()   Dim i As Long      i = Application.CommandBars.ActionControl.Parameter   MsgBox i   UserForm1.Show 0 End Sub #http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=42;id=FAQ

amamaq
質問者

お礼

end-uさん: どうもありがとうございました。 引数を ( ) 付きで渡してはダメなんて初めて知りました。 勉強不足でした。 即直したところバッチリでした。m(_ _)m

その他の回答 (1)

  • joqr
  • ベストアンサー率18% (742/4026)
回答No.1

>1は皆無ですし デバッグモードでトレースして、わからないのかな? >2はUserForm1が既に開いているかをチェックするロジックが分かりません。 意味無いでしょ? バグってるんですよ? あなたのプログラムは… 小手先のコーディングで回避するのは???です

関連するQ&A

  • エクセル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

  • エクセル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 ~~~~~~~~~~~~~~~~~~~~~~~ 尚、マクロは簡略化し、のせております。 よろしく御願い致します。

  • メニュー登録のマクロの書き方

    エクセルを開いた時のツールバーで、 「ファイル」を選択すると「新規作成」などのメニューが出ますよね。 その中に「印刷範囲」というメニューがあり、 これにカーソルを合わせると更に右に「印刷範囲の設定」「印刷範囲のクリア」というメニューが出てきます。 この、2階層持つメニューをマクロで作成したいのですが、可能でしょうか。 1階層だけであれば、 Set menu1 = Application.CommandBars("worksheet menu bar"). _ Controls.Add(Type:=msoControlPopup, Temporary:=True) menu1.Caption = "ツールバーに表示させるメニュー名" .Controls.Add Type:=msoControlButton With .Controls(1) .Caption = "メニュー1" .OnAction = "メニュー1のマクロの名前?" End With という記述で実現できました。

  • Excel:メニューから関数に飛ぶ際に引数を持たせる

    Excel2003でマクロを組んでいます。 ThisWorkbookにて、  With Menu1   .Controls.add Type:=msoControlButton   With .Controls(1)    .Caption = "手順1"    .OnAction = "Jikkou"   End With  End With のように記述し、Menu1というオリジナルのメニューの中に、 「手順1」というメニューを表示させ、これを実行すると関数"Jikkou"が動くようにしました。 このJikkouという関数に、引数を持って行きたいのですが、 どのように記述すればよいでしょうか。 具体的には、異なるメニューを実行して同じ関数へ移動する際、 「どのメニューを選択してきたのか」によって、Jikkouの中で処理を分岐させたいのです。 引数を持たせられたら解決しそうだと思って質問しています。 他に何か方法があれば(例えば、それよりこちらの方が自然だ、のような方法があれば)教えていただきたいです。 以下、引数の持たせ方がわからず詰まった、自分の考えたコードです(勿論動きません)。 目的が伝われば幸いです。 ---▼ThisWorkbookの一部---------------------------  With Menu1   .Controls.add Type:=msoControlButton   With .Controls(1)    .Caption = "手順1"    a = 0    .OnAction = "Jikkou a"   End With  End With  With Menu1   .Controls.add Type:=msoControlButton   With .Controls(2)    .Caption = "手順2"    a = 1    .OnAction = "Jikkou a"   End With  End With ---▼関数Jikkou------------------------------------ Sub Jikkou(byVal a as integer)  if a = 0 then   msgbox "手順1から来た"  elseif a = 1 then   msgbox "手順2から来た"  end if End Sub

  • EXCELで右クリックメニューの追加

    EXCELで右クリックメニューを追加するにあたり、以下のコードをネットで取得しました。 右クリックメニューを階層化してさらに、いくつか選べるようにするにはどうしたら良いのでしょうか? ------------------------------------------------------------- Dim Newb Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "コマンド" .OnAction = "Sample_cmd" .BeginGroup = False End With Sub Sample_cmd() MsgBox Now End Sub ------------------------------------------------------------- 判る方お願いします。

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

  • めっちゃ困ってます

    ソフトを使おうとしたのですがいきなりつまづきました。11行目の◎◎のところがまちがってる?という事らしいのですが、どなたかどうしたらなおるか教えていただけないでしょうか。 Sub MortalityMenu() DeleteMort Dim MortMenu As CommandBarControl Dim MainMenu As CommandBar Dim SecondMenu As CommandBarControl Dim HelpIndex As Integer Dim NewButton As CommandBarControl Dim IconSheet As Worksheet 'Set IconSheet = Worksheets("Sheet5") Set MainMenu = Application.CommandBars("Worksheet Menu Bar") ◎HelpIndex = MainMenu.Controls("Help").Index◎ Set MortMenu = MainMenu.Controls.Add(Type:=msoControlPopup, _ Before:=HelpIndex) MortMenu.Caption = "&Mortality" Set SecondMenu = MortMenu.Controls.Add(Type:=msoControlPopup) SecondMenu.Caption = "&P-spline" Set NewButton = SecondMenu.Controls.Add(Type:=msoControlButton) With NewButton .Caption = "Fit Model" .Style = msoButtonIconAndCaption .OnAction = "Graduation.RunPS" End With Set NewButton = SecondMenu.Controls.Add(Type:=msoControlButton) With NewButton .Caption = "Generate Scenario" .Style = msoButtonIconAndCaption .OnAction = "Graduation.AddScenPS" End With Set SecondMenu = MortMenu.Controls.Add(Type:=msoControlPopup) SecondMenu.Caption = "&Lee-Carter" Set NewButton = SecondMenu.Controls.Add(Type:=msoControlButton) With NewButton .Caption = "Fit Model" .Style = msoButtonIconAndCaption .OnAction = "Graduation.RunLC" End With Set NewButton = SecondMenu.Controls.Add(Type:=msoControlButton) With NewButton .Caption = "Generate Scenario" .Style = msoButtonIconAndCaption .OnAction = "Graduation.RunLCProjection" End With ' Set SecondMenu = MortMenu.Controls.Add(Type:=msoControlButton) ' SecondMenu.Caption = "&Add Mortality Data" ' SecondMenu.OnAction = "AddData.AddMortalitySheets" Set SecondMenu = MortMenu.Controls.Add(Type:=msoControlButton) SecondMenu.Caption = "&About CMI Software" SecondMenu.OnAction = "Graduation.ShowAbout" End Sub Sub DeleteMort() On Error Resume Next CommandBars(1).Controls("Mortality").Delete End Sub

  • Excel2003右クリックについて

    Excel2000でVBAを使って右クリックのメニューに項目を追加するマクロを作成したのですが、 Excel2003では右クリックでメニューが出てきません。なぜでしょうか?? Private Sub Workbook_Open() Dim cbMenuBar As CommandBar Dim cbGomaPop As CommandBarPopup Dim oGomaControl As CommandBarControl Dim cbGomaMenuItem As CommandBarButton Dim n As Integer Dim fExistGomaContextMenu As Boolean On Error Resume Next ' Add Goma Menu to Context Menu Set cbMenuBar = Application.CommandBars("Cell") ' Avoid Excel2003(beta) Error on Add Context Menu If Int(Application.Version) < 11 Then 'Check Goma Context Menu (Dic) Exist fExistGomaContextMenu = False For n = cbMenuBar.Controls.Count To 1 Step -1 If cbMenuBar.Controls(n).Caption = MITEM_DIC_CAPTION2 Then fExistGomaContextMenu = True Exit For End If Next n If fExistGomaContextMenu = False Then Set cbGomaMenuItem = cbMenuBar.Controls.Add(Temporary:=True) With cbGomaMenuItem .BeginGroup = True .Caption = MITEM_TRAN_CAPTION2 .OnAction = MITEM_TRAN_ACTION End With Set cbGomaMenuItem = cbMenuBar.Controls.Add(Temporary:=True) With cbGomaMenuItem .Caption = MITEM_OPT_CAPTION2 .OnAction = MITEM_OPT_ACTION End With Set cbGomaMenuItem = cbMenuBar.Controls.Add(Temporary:=True) With cbGomaMenuItem .Caption = MITEM_DIC_CAPTION2 .OnAction = MITEM_DIC_ACTION End With Set cbGomaMenuItem = cbMenuBar.Controls.Add(Temporary:=True) With cbGomaMenuItem .Caption = MITEM_DIC_CAPTION3 .OnAction = MITEM_DIC_ACTION2 End With End If End If End Sub おわかりになる方がいらっしゃいましたら教えて下さい。

  • 「shift」ボタンが押された時。

    Excel2000のVBAをしています。 既に作成しているマクロを「右クリックメニュー」に登録しようと思ってます。その上で二つ質問があります。 処理したい内容(1) 「shift」ボタンが押しっぱなしの時に「右クリックメニュー」に自作コマンドが表示されている様にし、「shift」ボタンが押されてない時は、Excelの通常の「右クリックメニュー」を表示する方法を教えて頂きたいです。 処理したい内容(2) 現在把握している「右クリックメニュー」に登録するソースは、 With Application.CommandBars("CELL").Controls.Add(Before:=1) .Caption = "mymenu(A)" .OnAction = "syori" なんですが、Excelを「改ページプレビュー」にした場合、登録したコマンドが表示されなくなってしまいます。通常でもプレビューでも使用出来るようにしたいので教えて頂きたいと思っています。 複数の質問ですが、よろしくお願いします。

  • VBAにて メニューを追加して、区切りの線も追加するには

    以下のコードにてメニューを追加していますが、 区切りの線を追加するにはどうすれば良いのでしょうか? Set SubMenu = MainMenu.Controls.Add SubMenu.Caption = "空白シートの削除" SubMenu.OnAction = "空白シートの削除" Set SubMenu = MainMenu.Controls.Add SubMenu.Caption = "空白シートの追加" SubMenu.OnAction = "空白シートの追加" 空白シートの削除 _________  ← 区切りの線 空白シートの追加