マクロからのシートの編集を許可しているはずなのに
とあるVBAプログラムを作成していたところ、マクロによる編集を許可しているシート上からマクロでハイパーリンクを削除できない、というバグ?仕様?に遭遇したので書き残しておこうと思います。
検証した環境
Excel 2010
Excel 2019
シートの保護機能について
Excelのシートに、保護をかけることができるのは有名です。
シート保護機能を有効にすると、ユーザーとマクロによる編集からシートを保護することができます。
この保護機能、知る人ぞ知る機能として、ユーザーからの編集を保護しつつマクロからは編集可能とするオプションがあります。
VBAでこんな風に書きます。
Sheet1.Protect userinterfaceonly:=True
WorksheetsオブジェクトのProtectメソッドを使います。
このProtectメソッドには、実は引数がたくさんあり、柔軟に保護の範囲を決めることができるのです。
その中の「userinterfaceonly」という引数をTrueにしてあげます。
すると、ユーザーによる編集からシートをしっかり保護しながら、マクロによる編集には開かれた状態を作り出すことができるのです。
例として、こんなコードを書いてみます。
Sub sample() Sheet1.Protect userinterfaceonly:=True Dim i As Long Dim sh As Worksheet: Set sh = Sheet1 For i = 1 To 10 sh.Cells(i, 1) = i Next i End Sub
このプログラムを実行後にシートを編集しようとすると・・・
このように、警告ウィンドウが出てきます。
これで、一見、マクロからの全ての操作が許可されたように見えるのですが、どうやら、マクロ禁止されている(それともバグ?)操作があるようです。
シートを保護した状態でハイパーリンクを削除できない!!
その禁止されている操作というのが、「マクロでハイパーリンクを削除する」というものです。
例として、こんな感じのプログラムを実行してみます。
マクロからの編集は有効にしつつ、シートに保護をかけて、セルにハイパーリンクを設定します。
その後、そのハイパーリンクを削除するというなんてことはない、プログラムです。
Sub test() Sheet1.Protect userinterfaceonly:=True Dim i As Long Dim sh As Worksheet: Set sh = Sheet1 For i = 1 To 10 sh.Cells(i, 1) = i sh.Hyperlinks.Add sh.Cells(i, 1), "", "Sheet2!A" & i Next i For i = 1 To 10 sh.Cells(i, 1).Hyperlinks.Delete Next i End Sub
これを実行してみると・・・。
こんなウィンドウがでてきます。
Ooops。なぜ??
マクロからの編集が許可されているのではないのか??
まぁ、プログラムでハイパーリンクを削除する場面は少ないので影響も小さいのですが・・・。
こんなこともあるよねということで、ハイパーリンクの削除は保護中はできないよ!!という話でした。
最後までお読みいただき、ありがとうございました。