見出し画像

ExcelVBA:ボタン名に表示されたシートにジャンプする【ChatGPTレビュー付】


概要

シートがたくさんあるファイルで、「各シートにジャンプできるボタンがあればいいな」と思ったので、VBAコードを書いて実装してみました。

例えば、「シート1」と書いてあるボタンを押すと…
「シート1」にジャンプできる!(他のシート2,3でも同じ動きをする)

ジャンプボタンの設定

VBAコードはさておいて、ボタンの設定をします。
使うのは以下のポイント。

  • CELL関数の「filename」を使って、シート名が変わってもコードを変えずに済む

  • テキストボックスや図形と同じように、マクロボタン(フォームの方)に表示される文字列もセルアドレスとリンクさせられる

■CELL関数を使ってシート名を取得

CELL関数でシート名を表示させるやり方は、いろんなサイトで紹介されているので、そちらを見るほうが分かりやすいです。

ジャンプしたいシート名をCELL関数を使って表示

■ボタンにシート名を紐づける

「開発」タブのコントロールにある工具箱のようなアイコンから、「ボタン(フォームコントロール)」をクリックします。

「フォームコントロール」の方から選ぶこと!

シート上の適当なところを左クリックし、左クリックを押したまま適当なサイズまで枠を広げて、クリックを離すとボタンがつくられます。

ボタンのサイズや場所は後で変更可能なので、適当でOK

マクロを実行するためのボタンなので、マクロ設定ウィンドウが出ますが、今は気にせずそのまま「OK」で閉じます。

何も設定せず「OK」を押して大丈夫

そうすると、「ボタン●●(数字)」みたいな名前でマクロボタンが追加されます。

ここで表示されるボタンの名前(テキスト)は気にしない

ボタンが選択状態(〇で囲まれてる)なので、このまま数式バーを選択して、「=」と打ち込んだ後、CELL関数でシート名を表示しているセルを指定します。

数式バーに「=$B$4」みたいな形でセル番地を指定している

そして「Enter」キーを押すと!
マクロボタンにシート名「シート1」が表示されます!

B4セルに入力されているシート名が、マクロボタンにも表示されている

試しに、「シート1」のシート名を変更してみます。

「シート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

■ざっくり解説

  1. 「Application.Caller」でクリックしたボタンオブジェクトの名前を取得

  2. アクティブシート上のボタンオブジェクトのうち、1.の名前のものを取得

  3. ボタンオブジェクトのキャプション(表示されている文字列)を取得

  4. それをシート名として、そのシートをアクティブにする

Application.Callerは、VBAを呼び出した方法についての情報を返します。
ボタンから呼ばれた時は、そのボタン名がString型で返されます。
ユーザー定義関数として呼ばれた場合は、数式を入れたセルがRangeオブジェクトで渡されます。

ボタンに表示されているテキストを取得(Application.Caller)
https://excel-ubara.com/excelvba5/EXCELVBA253.html

■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」のジャンプボタンも用意したいですが、また開発タブからコントロールを…ってやるのは面倒ですね。

最初に作ったボタンをコピーしましょう!

ボタンをコピーして貼り付け(配置は後でいくらでも調整できるので適当でもOK)

ボタンの選択方法は何でもいいですが、「右クリック」して、表示されるメニューは選択せずに数式バーをクリックします。
そして、セルのアドレスを書き換えます。

ボタンを選択し、数式バーで別のシート名のセルのアドレスに変える

「Enter」を押すと…
選択したボタンの表示がちゃんと変わりました!

ちゃんとB5セルの「シート2」を表示している!

もちろん、この「シート2」ボタンをクリックすれば、「シート2」にジャンプすることができます!

シート2に無事ジャンプ!

まとめ

最初の設定さえしてしまえば、あとはほぼコピペでボタン量産OK、シート名が変わっても融通が利く、などやりやすくまとめられたかなあと思います。

この仕組み自体を使うことはなくても、

「この挙動があれば、もしかしたらウチの●●に活かせるかも!?」

というきっかけになったらとっても嬉しいです。


それでは~ノシノシノシ