適材適所

パソコン作業の自動化・効率化のための情報を発信するブログ(VBA,PowerShellなど)

Excel VBAでマクロからの変更のみ許可しているシートでマクロによるHyperLinkの削除ができない件

マクロからのシートの編集を許可しているはずなのに

とある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

このプログラムを実行後にシートを編集しようとすると・・・

f:id:shinmai_papa:20191119203943p:plain

このように、警告ウィンドウが出てきます。

これで、一見、マクロからの全ての操作が許可されたように見えるのですが、どうやら、マクロ禁止されている(それともバグ?)操作があるようです。

シートを保護した状態でハイパーリンクを削除できない!!

その禁止されている操作というのが、「マクロでハイパーリンクを削除する」というものです。

例として、こんな感じのプログラムを実行してみます。

マクロからの編集は有効にしつつ、シートに保護をかけて、セルにハイパーリンクを設定します。

その後、そのハイパーリンクを削除するというなんてことはない、プログラムです。

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

これを実行してみると・・・。

f:id:shinmai_papa:20191119203947p:plain

こんなウィンドウがでてきます。

Ooops。なぜ??

マクロからの編集が許可されているのではないのか??

まぁ、プログラムでハイパーリンクを削除する場面は少ないので影響も小さいのですが・・・。

こんなこともあるよねということで、ハイパーリンクの削除は保護中はできないよ!!という話でした。

最後までお読みいただき、ありがとうございました。