ExcelVBA:ボタン名に表示されたシートにジャンプする【ChatGPTレビュー付】
概要
シートがたくさんあるファイルで、「各シートにジャンプできるボタンがあればいいな」と思ったので、VBAコードを書いて実装してみました。
ジャンプボタンの設定
VBAコードはさておいて、ボタンの設定をします。
使うのは以下のポイント。
CELL関数の「filename」を使って、シート名が変わってもコードを変えずに済む
テキストボックスや図形と同じように、マクロボタン(フォームの方)に表示される文字列もセルアドレスとリンクさせられる
■CELL関数を使ってシート名を取得
CELL関数でシート名を表示させるやり方は、いろんなサイトで紹介されているので、そちらを見るほうが分かりやすいです。
■ボタンにシート名を紐づける
「開発」タブのコントロールにある工具箱のようなアイコンから、「ボタン(フォームコントロール)」をクリックします。
シート上の適当なところを左クリックし、左クリックを押したまま適当なサイズまで枠を広げて、クリックを離すとボタンがつくられます。
マクロを実行するためのボタンなので、マクロ設定ウィンドウが出ますが、今は気にせずそのまま「OK」で閉じます。
そうすると、「ボタン●●(数字)」みたいな名前でマクロボタンが追加されます。
ボタンが選択状態(〇で囲まれてる)なので、このまま数式バーを選択して、「=」と打ち込んだ後、CELL関数でシート名を表示しているセルを指定します。
そして「Enter」キーを押すと!
マクロボタンにシート名「シート1」が表示されます!
試しに、「シート1」のシート名を変更してみます。
ちゃんとCELL関数を設定したセルの値と、そこに紐づけたボタンの表示も変更されました!
この仕組みを使って、VBAコードを書いていきます。
VBAコード
せっかくなので、自分で書いたコードをChatGPTにコードレビューしてもらいました。
■自分で書いたコード
Public Sub シートを選択_ボタン名参照()
If IsError(Application.Caller) Then Exit Sub
'操作シートのボタンのキャプション名=シート名とする
Dim sh As Worksheet: Set sh = ThisWorkbook.activeSheet
Dim btn As Button: Set btn = sh.Buttons(Application.Caller)
Dim shTarget As Worksheet: Set shTarget = ThisWorkbook.Worksheets(btn.Caption)
With shTarget
If .Visible <> xlSheetVisible Then .Visible = xlSheetVisible
.Activate
.Range("A1").Activate
End With
End Sub
■ざっくり解説
「Application.Caller」でクリックしたボタンオブジェクトの名前を取得
アクティブシート上のボタンオブジェクトのうち、1.の名前のものを取得
ボタンオブジェクトのキャプション(表示されている文字列)を取得
それをシート名として、そのシートをアクティブにする
■ChatGPTによるコードレビュー
Public Sub ボタン名でシート選択()
' プロシージャがボタンから呼び出されていない場合、終了する
If IsError(Application.Caller) Then Exit Sub
' アクティブなワークシートとプロシージャを呼び出したボタンを指定
Dim activeSheet As Worksheet
Set activeSheet = ThisWorkbook.activeSheet
Dim callingButton As Button
Set callingButton = activeSheet.Buttons(Application.Caller)
' ボタンのキャプションと同名のワークシートが存在するかチェック
On Error Resume Next
Dim targetSheet As Worksheet
Set targetSheet = ThisWorkbook.Worksheets(callingButton.Caption)
On Error GoTo 0
' キャプション名のワークシートが存在しない場合、エラーメッセージを表示してプロシージャを終了
If targetSheet Is Nothing Then
MsgBox "'" & callingButton.Caption & "'という名前のワークシートは存在しません。", vbExclamation
Exit Sub
End If
' ワークシートを表示・アクティブ化し、セルA1を選択
With targetSheet
If .Visible <> xlSheetVisible Then .Visible = xlSheetVisible
.Activate
.Range("A1").Select
End With
End Sub
■レビューのポイント
エラーハンドリング: IsError(Application.Caller)によりボタン以外からの呼び出しをチェックしていますが、更に詳細なエラーハンドリングを実装するとより良いと思います。たとえば、シートが存在しない場合やボタンのキャプションが空の場合など、それらの状況をキャッチして適切なエラーメッセージを表示するとよりユーザーフレンドリーです。
コメント: コードには何をするかのコメントがないため、他の人がこのコードを見た時に何をするのか理解するのが難しくなる可能性があります。また、関数名も英語であることが一般的であり、他のプログラマーにとっては理解しやすいです。
変数名: sh, btn, shTargetという名前は少し抽象的です。もっと具体的な名前を使用すると、コードの可読性が向上します。
ジャンプボタンとVBAコードの紐づけ
■ボタンにマクロを登録
ChatGPTにコードをいい感じに直してもらったので、この「ボタン名でシート選択」プロシージャをマクロボタンに登録しましょう。
ボタンを右クリックし、「マクロの登録(N)」を選択します。
「ボタン名でシート選択」を探して選択し、「OK」を押します。
これでマクロの登録は完了です。
ただし、ボタンが選択状態(〇で囲まれている)だとクリックしてもマクロ実行されないので、シートの適当なところをクリックして選択状態を解除します。
そしてボタンをクリックしてみると…
ちゃんと「名前を変更1」シートにジャンプすることができました!
■マクロボタンの複製
せっかくなので「シート2」「シート3」のジャンプボタンも用意したいですが、また開発タブからコントロールを…ってやるのは面倒ですね。
最初に作ったボタンをコピーしましょう!
ボタンの選択方法は何でもいいですが、「右クリック」して、表示されるメニューは選択せずに数式バーをクリックします。
そして、セルのアドレスを書き換えます。
「Enter」を押すと…
選択したボタンの表示がちゃんと変わりました!
もちろん、この「シート2」ボタンをクリックすれば、「シート2」にジャンプすることができます!
まとめ
最初の設定さえしてしまえば、あとはほぼコピペでボタン量産OK、シート名が変わっても融通が利く、などやりやすくまとめられたかなあと思います。
この仕組み自体を使うことはなくても、
「この挙動があれば、もしかしたらウチの●●に活かせるかも!?」
というきっかけになったらとっても嬉しいです。
それでは~ノシノシノシ