Private Sub Workbook_AddinInstall()
Dim MainMenu As Object
Call Workbook_AddinUninstall
Set MainMenu = Application.CommandBars("Worksheet Menu Bar").Controls("ツール(&T)").Controls.Add
With MainMenu
.Caption = "更新_全シート名列挙"
.OnAction = "gRefreshWorksheetList"
End With
Set MainMenu = Application.CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup)
MainMenu.Caption = "全シート(&A)"
Call gRefreshWorksheetList
End Sub
Private Sub Workbook_AddinUninstall()
On Error Resume Next
With Application.CommandBars("Worksheet Menu Bar")
.Controls("全シート(&A)").Delete
.Controls("ツール(&T)").Controls("更新_全シート名列挙").Delete
End With
End Sub
次に標準モジュールを追加して、以下を入力します。
Public Sub gRefreshWorksheetList()
Dim target As Object
Dim MainMenu As Object
Dim SubMenu As Object
Dim wscnt As Integer
Set MainMenu = Application.CommandBars("Worksheet Menu Bar").Controls("全シート(&A)")
For Each target In MainMenu.Controls
target.Delete
Next
wscnt = 0
For Each target In ActiveWorkbook.Worksheets
Set SubMenu = MainMenu.Controls.Add
With SubMenu
.Caption = target.Name
.OnAction = "gActiveWorksheet" & Format$(wscnt, "00")
End With
wscnt = wscnt + 1
Next
Set MainMenu = Nothing
Set SubMenu = Nothing
End Sub
Public Sub gActiveWorksheet00()
Dim target As Worksheet
Dim wscnt As Integer
wscnt = 0
For Each target In ActiveWorkbook.Worksheets
If Format$(wscnt, "00") = "00" Then
target.Activate
Exit For
End If
wscnt = wscnt + 1
Next
End Sub
Public Sub gActiveWorksheet01()
Dim target As Worksheet
Dim wscnt As Integer
wscnt = 0
For Each target In ActiveWorkbook.Worksheets
If Format$(wscnt, "00") = "01" Then
target.Activate
Exit For
End If
wscnt = wscnt + 1
Next
End Sub
Public Sub gActiveWorksheet02()
Dim target As Worksheet
Dim wscnt As Integer
wscnt = 0
For Each target In ActiveWorkbook.Worksheets
If Format$(wscnt, "00") = "02" Then
target.Activate
Exit For
End If
wscnt = wscnt + 1
Next
End Sub
Public Sub gActiveWorksheet03()
Dim target As Worksheet
Dim wscnt As Integer
wscnt = 0
For Each target In ActiveWorkbook.Worksheets
If Format$(wscnt, "00") = "03" Then
target.Activate
Exit For
End If
wscnt = wscnt + 1
Next
End Sub
Public Sub gActiveWorksheet04()
Dim target As Worksheet
Dim wscnt As Integer
wscnt = 0
For Each target In ActiveWorkbook.Worksheets
If Format$(wscnt, "00") = "04" Then
target.Activate
Exit For
End If
wscnt = wscnt + 1
Next
End Sub
Public Sub gActiveWorksheet05()
Dim target As Worksheet
Dim wscnt As Integer
wscnt = 0
For Each target In ActiveWorkbook.Worksheets
If Format$(wscnt, "00") = "05" Then
target.Activate
Exit For
End If
wscnt = wscnt + 1
Next
End Sub
Public Sub gActiveWorksheet06()
Dim target As Worksheet
Dim wscnt As Integer
wscnt = 0
For Each target In ActiveWorkbook.Worksheets
If Format$(wscnt, "00") = "06" Then
target.Activate
Exit For
End If
wscnt = wscnt + 1
Next
End Sub
Public Sub gActiveWorksheet07()
Dim target As Worksheet
Dim wscnt As Integer
wscnt = 0
For Each target In ActiveWorkbook.Worksheets
If Format$(wscnt, "00") = "07" Then
target.Activate
Exit For
End If
wscnt = wscnt + 1
Next
End Sub
Public Sub gActiveWorksheet08()
Dim target As Worksheet
Dim wscnt As Integer
wscnt = 0
For Each target In ActiveWorkbook.Worksheets
If Format$(wscnt, "00") = "08" Then
target.Activate
Exit For
End If
wscnt = wscnt + 1
Next
End Sub
Public Sub gActiveWorksheet09()
Dim target As Worksheet
Dim wscnt As Integer
wscnt = 0
For Each target In ActiveWorkbook.Worksheets
If Format$(wscnt, "00") = "09" Then
target.Activate
Exit For
End If
wscnt = wscnt + 1
Next
End Sub
Dim target As Worksheet Dim wscnt As Integer
各種変数の宣言です。
For Each target In ActiveWorkbook.Worksheets If Format$(wscnt, "00") = "XX" Then target.Activate Exit For End If Next
呼ばれたプロシージャがWorksheetsコレクションの何番目に位置しているかを判定して、
そのワークシートをアクティブにし、ループを抜けています。
■Workbook_AddinInstall()
Dim MainMenu As Object
オブジェクト変数の宣言です。
Call Workbook_AddinUninstall
アドインを外す処理を呼んでいるのですが、追加してもいないのに何故外すか?というと
ソースの記述ミスがあった場合、メニュー項目が残ったまま中断してアドインが外れてしまうことがあります。
そのままソースを修正・アドイン追加をすると同じメニュー項目が複数表示されてしまいます。
これを防ぐために追加前にアドインを外す処理を呼んでいます。
Set MainMenu = Application.CommandBars("Worksheet Menu Bar").Controls("ツール(&T)").Controls.Add
メニューバーのツール(&T)の一番下に項目を1個追加します。
.Caption = "更新_全シート名列挙"
メニューに表示される文字列を設定します。
.OnAction = "gRefreshWorksheetList"
ワークシート名リストを更新する処理が書いてあるプロシージャ名を設定します。
Set MainMenu = Application.CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup)
メニューバーに項目を1個追加します。
MainMenu.Caption = "全シート(&A)"
メニューに表示される文字列を設定します。
Call gRefreshWorksheetList
ワークシート名リストを更新する処理を呼んでいます。
■Workbook_AddinUninstall()
On Error Resume Next
メニュー項目が追加されていない状態でココが呼ばれたときのためのエラー処理です。
.Controls("全シート(&A)").Delete
.Controls("ツール(&T)").Controls("更新_全シート名列挙").Delete
メニューバーから「全シート(&A)」を削除、ツール配下から「更新_全シート名列挙」を削除します。
■gRefreshWorksheetList()
Dim target As Object
Dim MainMenu As Object
Dim SubMenu As Object
Dim wscnt As Integer
各種変数の宣言です。
Set MainMenu = Application.CommandBars("Worksheet Menu Bar").Controls("全シート(&A)")
アドイン追加時に追加されたメニューオブジェクトを取得しています。
For Each target In MainMenu.Controls
target.Delete
Next
既存のワークシート名リストを削除します。
For Each target In ActiveWorkbook.Worksheets
WorksheetsコレクションからWorksheetオブジェクトを順次取り出します。
Set SubMenu = MainMenu.Controls.Add
任意のワークシートにジャンプするためのメニュー項目を追加します。
.Caption = target.Name
.OnAction = "gActiveWorksheet" & Format$(wscnt, "00")
メニュー項目にワークシート名を設定し、それがクリックされたときに呼び出すプロシージャを指定します。
Set MainMenu = Nothing
Set SubMenu = Nothing
変数に設定されたオブジェクトを解放しています。
これは書かなくても動作しますが書いた方がいいです。
■gActiveWorksheetXX()
このプロシージャは10個必要です。
プロシージャ名末尾の「XX」に2桁数字(00〜09)をそれぞれ入れてあります。
5行下にある「XX」にも同じ数字を入れます。
Dim target As Worksheet
Dim wscnt As Integer
各種変数の宣言です。
For Each target In ActiveWorkbook.Worksheets
If Format$(wscnt, "00") = "XX" Then
target.Activate
Exit For
End If
Next
呼ばれたプロシージャがWorksheetsコレクションの何番目に位置しているかを判定して、
そのワークシートをアクティブにし、ループを抜けています。
100までのワークシート数に対応しようとするなら、上記プロシージャが100個(0〜99)必要になります。
ワークシート数がいくつであろうと1つのプロシージャで全てに対応出来ないのか?という疑問になると思いますが
メニュー項目クリック時、クリックされたメニュー名を取得出来ないため、このような処理にせざるを得ません。