連絡先 Hikwareホーム
Hikware.Tech
自分用の覚え書きをそのまま公開。参考程度にどうぞ。

ハイパーリンクでのセル移動はデータを並べ替えるとおかしくなる

公開日 2024/03/03
最終更新 2024/03/03
  • ハイパーリンクを使ってシート内の他のセルに移動させる事はできるんだけど、テーブルの行を並べ替えたり行や列を増減させたりした際にリンク先のセルは追従しないので、関係ないセルへの移動になってしまって使い物にならない。なんとかならんの?

結論:たぶんなんともならない

 まあ仮に僕が Excel の開発チームだとして、これいい感じにリンク先のセルを追従させてよと言われたら無理ですと答えたくなるよ実際。単純なテーブルの行の並べ替え時くらいならともかく、ユーザーのやり得る事が多すぎて、リンク先セルをどこに変えるのが正解なのか、そもそも変えたいのかも判断しきれんもん。

 ちなみに、リンク先を C4 などのセルの直指定ではなく、セルに名前をつけてリンク先 にしてみたところ、行や列の増減によるセル位置の変化には対応できるようになったものの、並べ替えたらやっぱりダメだった。中途半端ねえ。
 まあ仮にこの方法で対応できたとしても、いちいちセルに名前を付ける手間がダルすぎて使わないと思うけど。

代替案:行にIDを振り、ハイパーリンクでそのIDの行に移動させる

 そこで 別件で編み出した、ハイパーリンクでのマクロ実行 の登場ですよ。移動したい行のIDをあらかじめハイパーリンクに仕込んでおいて、ハイパーリンクのクリック時に実行されるマクロでそのIDの行を探して移動させればいけるはず。具体的には以下。

  1. テーブルにID的な列が存在しないのなら追加して、全ての行に重複しないIDを振る。一度振ったIDは後で変えないこと!

  2. 移動させたいセルに右クリックでハイパーリンクを作成し、その ヒント設定 で例えば @JumpId:5 (ID が 5 の行にジャンプ)などの判別しやすい情報を仕込む。そして リンクのアドレスには ? とだけ記入。なぜヒント設定で仕込むのか、アドレスを ? にするのかは上記の別記事を参照。

  3. シートに FollowHyperlink イベントを実装し、クリックされたハイパーリンクの ヒントの文字列が "@JumpId:" から始まるならば指定IDの行にカーソルを移動 するようにマクロを組む。サンプルコードは後述。

サンプルコード

 FollowHyperlink イベントは標準モジュールに書いても動かないので、シートのモジュールに記述する。詳しくは 別記事 を参照。

 本題と関係ない細かい問題への対処や気配りは省略してます。

'ハイパーリンクのクリック時イベント
'Sub の雛形はシートモジュールのコードエディタで自動生成できる
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
    '全てのハイパーリンクのクリック時に呼ばれるので
    'ヒントの文字列にキーワードを仕込んで、一致する場合のみ処理を実行する
    If Target.ScreenTip Like "@JumpId:*" Then
        '9文字目以降が移動先のIDなので数値化して渡す
        JumpToIdRow Val(Mid(Target.ScreenTip, 9))
    End If
End Sub

'指定IDの行に移動
Private Sub JumpToIdRow(id As Long)
    'ID移動に対応するテーブル取得
    Dim table As ListObject
    Set table = ActiveSheet.ListObjects("テーブル名")

    'テーブルのID列の実データ部分
    Dim idList As Range
    Set idList = table.ListColumns("ID").DataBodyRange

    'ID列に指定のIDがあるか検索
    'もっとシンプルに書ける検索方法がありそうな気もするけど模索中
    Dim idRow As Range
    Set idRow = idList.Find(id, LookIn:=xlValues, LookAt:=xlWhole)
    If Not idRow Is Nothing Then
        'IDが見つかったら、その行を選択
        'この例ではC列(=3)に決め打ちしているが、その辺は適宜作り変える
        Cells(idRow.Row, 3).Select
    End If
End Sub