こんな現象があるなんて気づかなかった。 今まで作ってきた数多くの表は大丈夫だったろうか。。。

Microsoft サポート情報

Excel でハイパーリンクを設定した後に並べ替えるとリンク先が変更される
https://support.microsoft.com/ja-jp/help/410238

今まで数多くの表を作ってきたが、その中にこの条件を満たしてしまっている物はなかっただろうか・・・あったんじゃないかなぁ。

紙をスキャンして作った PDF ファイルを管理するために Excel で管理表を作り、各行に PDF ファイルへのハイパーリンクを仕込むケース、きっとあるよね。

既にハイパーリンクが設定されている Excel の表で並び替えをすると、ハイパーリンクが解除されたり、どこか別のセルに移っちゃったりと、それはもう滅茶苦茶になるらしい。
上記のサポート情報ページにある再現手順セクションにある結果がエグイこと。

原因は開示されてないよ

再現手順と回避策までは書いてあるけれど、原因までは説明されていない。
「マイクロソフト製品の問題として認識している」 とまでは書いてある。

ちょっと考えてみた。

VBA のオブジェクト モデルで考えると、一つの Excel ファイルである Workbook オブジェクトは、複数のワークシートを表す Worksheets コレクションを持っている。
Worksheets コレクションは、1枚のワークシートを表す Worksheet オブジェクトの集合体。
単体の Worksheet オブジェクトは、複数のセルを表す Cells コレクションを持っている。
Cells コレクションは一つのセルを表す Range オブジェクトの集合体。(ちょっと違うけど)

現在のブックの一番左側のシートのセル A10 の文字を変更するには
ThisWorkbook.Worksheets(1).Cells(10,1).Value = "hoge"
てな風に書く。(もちろん Range でやる場合もあるけれど)
セルにハイパーリンクを設定する場合も、作り手の感覚的には 「とあるセルにハイパーリンクを設定する」 って感じなので、
ThisWorkbook.Worksheets(1).Cells(10,1).SetHyperlink(アドレス, 表示文字列)
みたいに想像するけれど実際は違うらしい。(使ったことないので今回初めて知った)
ThisWorkbook.Worksheets(1).Hyperlinks.Add(セル番地, アドレス, 表示文字)
みたいな感じなんだと。(実際はもう少し引数があるけど)

びっくりポイントがいくつか。

  • ハイパーリンクはセルのプロパティからではなく、シートごとの Hyperlinks コレクションから操作する
  • Hyperlink オブジェクトは 「どこのセルで使われているのか」 を保持する Range というプロパティを持っている
  • Hyperlink オブジェクトは 「セルに表示する文字列 (クリックする対象の文字列)」 を保持する TextToDisplay というプロパティを持っている

あらやだ、セルの子分じゃないじゃん。 完全に独立してるじゃん。 というかセルに表示する文字まで握っちゃってるじゃん。
これを踏まえると、セル側の都合で並び替えをしちゃうと Hyperlink が追従 (各ハイパーリンクが持つ Range プロパティの値をソート後のセル番地に変更する) してないんじゃないかな、なんて想像をしちゃうのだが、先のサポートページの再現ドラマではもっとえげつない結果になっているので予想は外れているようだ。
というか、Excel 2016 で試してみたら正常に並び替えができてたし。
Excel 2010 では再現するが、Excel 2016 では解消済みってことか。
「最新のバージョンにしてください」 の一言で解決する話かよ。
もちろんそんな事を軽々しく言えればの話だが。