HOME > エクセルVBA > サンプル > SameName

SameName


【ファイル名】A.xlaとB.xla
【バージョン】Ver 1.0.0
【作成日】2018年10月10日
【動作確認】Windows 10
【必要なソフト】Microsoft Excel 2010 (97-2003アドインとして作成)
【ダウンロード】SameName.zip
【説明】複数のアドインで同じ名前のプロシージャがあると、後からロードしたアドインのプロシージャは、既にロードしたプロシージャを実行する場合があります。
アドイン(拡張子が.xla)のプロシージャーは、ファイル名を指定して呼び出してください。マクロ有効ブック(拡張子が.xls)では必要ありません。
同じ名前のプロシージャでも正しく実行するためにCommandBarControlオブジェクトのOnActionプロパティは、プロシージャの前にファイル名を指定します。
ファイル名の後ろに半角の感嘆符(!)とプロシージャ名にします。
同じファイルに複数の同名のプロシージャがある場合は、ファイル名の後ろに半角の感嘆符(!)、モジュールの後に半角のピリオド(.)、とプロシージャ名にします。
例.「A.xla」ファイルの「Module1」モジュールの「Sub2」プロシージャ
      A.xla!Sub2 (ファイル名を指定した場合)
      A.xla!Module1.Sub2 (ファイルとモジュール名を指定した場合)
※注 ファイル名を変更するとプロシージャが実行されなくなります。

確認方法
1.ファイルのA.xlaを開いてメニューを実行し、メッセージの"A.xla"を確認します。
2.Excelを終了します。
3.ファイルのB.xlaを開いてメニューを実行し、メッセージの"B.xla"を確認します。
4.Excelを実行したまま、ファイルのA.xlaを開きます。
5.「A.xla Menu」の「Sub1」メニューを実行します。(Excel 2007以降は「アドイン」タブに表示されます)
A.xlaとB.xla
メッセージが"A.xla Sub1"ではなく、"B.xla Sub1"と表示されます。(onAction="Sub1")
メッセージ

6.「A.xla Menu」の「Sub2」メニューを実行すると、メッセージが"A.xla Sub2"と正しく表示されます。(onAction="A.xla!Sub2")
メッセージ

A.xlaファイルのModule1モジュール
Option Explicit       ' 変数は明示的に宣言しなければいけない
Option Private Module ' プロジェクトの外部からモジュールの内容が参照できない
Option Compare Binary ' 文字列比較はバイナリ文字コード
Option Base 0         ' 配列の添字の既定値を 0 に設定

Const csMenu As String = "A.xla Menu" ' メニューの名前
'======================================================================================
' Sub1
'======================================================================================
Private Sub Sub1()
  MsgBox Prompt:="A.xla Sub1", Buttons:=vbInformation, Title:=ThisWorkbook.Name
End Sub
'======================================================================================
' Sub2
'======================================================================================
Private Sub Sub2()
  MsgBox Prompt:="A.xla Sub2", Buttons:=vbInformation, Title:=ThisWorkbook.Name
End Sub
'======================================================================================
' メニューの作成
'======================================================================================
Private Sub CreateMenu()
  On Error Resume Next
  With Application.CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup, Temporary:=True)
    With .Controls.Add(Type:=msoControlButton, Temporary:=True)
      .Caption = "Sub1"
      .FaceId = 71
      .OnAction = "Sub1"
    End With

    With .Controls.Add(Type:=msoControlButton, Temporary:=True)
      .Caption = "Sub2"
      .FaceId = 72
      .OnAction = "A.xla!Sub2" ' アドインのファイル名も指定
    End With

    .Caption = csMenu
    .Visible = True
  End With
  On Error GoTo 0
End Sub
'======================================================================================
' メニューの削除
'======================================================================================
Private Sub DeleteMenu()
  On Error Resume Next
  Application.CommandBars("Worksheet Menu Bar").Controls(csMenu).Delete
  On Error GoTo 0
End Sub
'===========================================================
' 初期処理
'===========================================================
Sub Auto_Open()
  Call DeleteMenu ' メニューの削除
  Call CreateMenu ' メニューの追加
End Sub
'===========================================================
' 終了処理
'===========================================================
Sub Auto_Close()
  Call DeleteMenu ' メニューの削除
End Sub


B.xlaファイルのModule1モジュール
Option Explicit       ' 変数は明示的に宣言しなければいけない
Option Private Module ' プロジェクトの外部からモジュールの内容が参照できない
Option Compare Binary ' 文字列比較はバイナリ文字コード
Option Base 0         ' 配列の添字の既定値を 0 に設定

Const csMenu As String = "B.xla Menu" ' メニューの名前
'======================================================================================
' Sub1
'======================================================================================
Private Sub Sub1()
  MsgBox Prompt:="B.xla Sub1", Buttons:=vbInformation, Title:=ThisWorkbook.Name
End Sub
'======================================================================================
' Sub2
'======================================================================================
Private Sub Sub2()
  MsgBox Prompt:="B.xla Sub2", Buttons:=vbInformation, Title:=ThisWorkbook.Name
End Sub
'======================================================================================
' メニューの作成
'======================================================================================
Private Sub CreateMenu()
  On Error Resume Next
  With Application.CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup, Temporary:=True)
    With .Controls.Add(Type:=msoControlButton, Temporary:=True)
      .Caption = "Sub1"
      .FaceId = 71
      .OnAction = "Sub1"
    End With

    With .Controls.Add(Type:=msoControlButton, Temporary:=True)
      .Caption = "Sub2"
      .FaceId = 72
      .OnAction = "Sub2"
    End With

    .Caption = csMenu
    .Visible = True
  End With
  On Error GoTo 0
End Sub
'======================================================================================
' メニューの削除
'======================================================================================
Private Sub DeleteMenu()
  On Error Resume Next
  Application.CommandBars("Worksheet Menu Bar").Controls(csMenu).Delete
  On Error GoTo 0
End Sub
'===========================================================
' 初期処理
'===========================================================
Sub Auto_Open()
  Call DeleteMenu ' メニューの削除
  Call CreateMenu ' メニューの追加
End Sub
'===========================================================
' 終了処理
'===========================================================
Sub Auto_Close()
  Call DeleteMenu ' メニューの削除
End Sub

このページの上