ワークシート名一覧を表示し、任意のワークシートにジャンプするアドイン

ここでは使用頻度が高い、ワークシート名列挙&移動のアドインを作成します。(シート数10まで対応)
アドインの追加・削除の他に、ワークシート名リストを更新する処理、任意のワークシートにジャンプする処理が必要になります。
ThisWorkbookに以下の2つのプロシージャを入力します。
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
ここまで出来たらファイルを保存します。
ファイルタイプは、Excelアドイン(*.xla)
Excel2007以降ではマクロが別ファイルになってたような気がしますが
にゃたろーはExcel2007を持っていないため分かりません。
拡張子を除いた部分(ベース名)がアドイン名称になります。


【解説】
■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つのプロシージャで全てに対応出来ないのか?という疑問になると思いますが
メニュー項目クリック時、クリックされたメニュー名を取得出来ないため、このような処理にせざるを得ません。