Excel関数実行時の引数の持たせ方とは?

このQ&Aのポイント
  • Excel2003のマクロでメニューから関数に飛ぶ際に引数を持たせる方法を教えてください。
  • Jikkouという関数に異なるメニューから移動する際、選択されたメニューによって処理を分岐させたいです。
  • また、引数の持たせ方に加えて、他の方法があれば教えてください。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

> 挙げたコードに組み込むと、なぜかメッセージボックスが2回でますね。 あ、そうですね。   .OnAction = "'Jikkou(0)'" ですね。 同様のことを引数を使用せずに実現する方法を御紹介。  With Menu1   .Controls.add Type:=msoControlButton   With .Controls(1)    .Caption = "手順1"    .OnAction = "Jikkou"    .Tag = 0   End With  End With  With Menu1   .Controls.add Type:=msoControlButton   With .Controls(2)    .Caption = "手順2"    .OnAction = "Jikkou"    .Tag = 1   End With  End With Sub Jikkou()  On Error Resume Next  Select Case CommandBars.ActionControl.Tag   Case 0    msgbox "手順1から来た"   Case 1    msgbox "手順1から来た"   Case Else    msgbox "その他から来た"   End Select End Sub

tktk1228
質問者

お礼

回答ありがとうございます。 前回のお礼時に書込んだURLの中の情報がタイミング良く(悪く)消えてしまったので少々困ってました。 お陰で解決いたしました。 しかし、同時に教えていただいたTagを利用する方法の方が使いやすいので、 こちらをメインに使っていきそうです。 ありがとうございました。

その他の回答 (1)

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.1

  .OnAction = "Jikkou(0)"   .OnAction = "Jikkou(1)" とか。

tktk1228
質問者

お礼

回答ありがとうございます。 エラーは出なかったし、引数として使えているようですが、 挙げたコードに組み込むと、なぜかメッセージボックスが2回でますね。 検索したところ関係ありそうな http://www.moug.net/faq/viewtopic.php?t=28150 を見つけたので読んでみます。

関連する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

  • めっちゃ困ってます

    ソフトを使おうとしたのですがいきなりつまづきました。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

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

    エクセルを開いた時のツールバーで、 「ファイル」を選択すると「新規作成」などのメニューが出ますよね。 その中に「印刷範囲」というメニューがあり、 これにカーソルを合わせると更に右に「印刷範囲の設定」「印刷範囲のクリア」というメニューが出てきます。 この、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 という記述で実現できました。

  • 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 ショートカットメニュー追加

    Excel-VBA ショートカットメニュー追加 マウス右クリックでのショートカットメニュー「テストA、テストB、テストC」を最上段に追加(挿入)したい、 CommandBarControls.Add メソッド 構文:式.Add(Type, Id, Parameter, Before, Temporary) これのBeforeを定義すれば良さそうに思えるのですが、成功しません!? 正しい記述事例を教えて下さい。 参考(現状):下記は最後(末尾)にメニューが追加されてしまう状態です。 Public Sub ShortCutMenuAdd() Dim newMenu As CommandBarControls Set newMenu = Application.CommandBars("Cell").Controls newMenu.Add Type:=msoControlButton, Temporary:=True newMenu(newMenu.Count).Caption = "テストA" newMenu(newMenu.Count).OnAction = "mymsgA" newMenu(newMenu.Count).BeginGroup = True newMenu.Add Type:=msoControlButton, Temporary:=True newMenu(newMenu.Count).Caption = "テストB" newMenu(newMenu.Count).OnAction = "mymsgB" newMenu.Add Type:=msoControlButton, Temporary:=True newMenu(newMenu.Count).Caption = "テストC" newMenu(newMenu.Count).OnAction = "mymsgC" Set newMenu = Nothing 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 おわかりになる方がいらっしゃいましたら教えて下さい。

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

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

  • Excel2007互換モードでの右クリックロジック

    100件程度の実績のあるソフトですが、あるお客様のみ不思議な現象が発生しています。 そのお客様はWindowsXP & Excel2007の組み合わせで、ソフトは互換モードで動作しています。 Option Compare Text Option Explicit Sub migi_del() Dim icbc Application.CommandBars("cell").Reset For Each icbc In Application.CommandBars("cell").Controls icbc.Delete Next icbc End Sub Sub migi_add() Dim icbc Application.CommandBars("cell").Reset For Each icbc In Application.CommandBars("cell").Controls icbc.Delete Next icbc With Application.CommandBars("cell").Controls _ .Add(Type:=msoControlButton, Temporary:=True) .Caption = "Message!" .OnAction = "aaa" End With End Sub Sub migi_addTag() Dim icbc Application.CommandBars("cell").Reset For Each icbc In Application.CommandBars("cell").Controls icbc.Delete Next icbc With Application.CommandBars("cell").Controls _ .Add(Type:=msoControlButton, Temporary:=True) .Caption = "Message!" .OnAction = "aaa" .Tag = "aaa" End With End Sub Sub migi_Rest() Dim icbc Application.CommandBars("cell").Reset End Sub Sub aaa() MsgBox "OK" End Sub Sub Sample() Application.CommandBars("Row").Reset Application.CommandBars("Column").Reset End Sub の何れの操作を行っても、右クリックは標準のものが表示されてしまいます。 WindowsXP & Excel2007の組み合わせの他のお客様ではこのような現象は出ていません。 何方か理由をご存知の方はいらっしゃいませんか?

専門家に質問してみよう