ネットから入手したブックでマクロが使えない件


最初にお断りしておきます。本稿は「2022/09/20現在の情報」です。テーマは次のとおり。

メールに添付されて受信したブックや、
インターネットのサイトからダウンロードしたブックなどで、
ブック内にマクロが含まれていると、そのマクロを起動することができません。
そうしたブックでマクロを有効にする方法をご紹介します。

これ、schooで質問されたのですが、案の定みなさん困っているようです。実はこの仕様変更、過去に二転三転しています。

  • ネットから受信したブックは強制的にマクロ使えないようにします!
  • やっぱ、やめます。マクロは今までどおり使えますからご安心を!
  • ああ、やめるのやめます。これからはマクロ使えませんから!(今ここ)

ということなので、本稿でご紹介する解決策や、そもそもこうした仕様自体も、今後どうなるか分かりません。

まずは、動作を確認してみましょう。マクロが含まれたブックが、メールの添付ファイルとして送られてきました。そのブックをダウンロードしてからExcelで開きます。

マクロの有無にかかわらず、ネットから受信したブックを開くと、最初は「保護ビュー」で開かれます。これは、Excel 2010からの仕様です。その当時、仕組みを調べたら、Excelを"表示専用"で起動して、そちらのExcelで開いているようでした。ユーザーが「編集を有効にする」ボタンをクリックすると、あらためて通常のExcelを起動して、読み込み直します。もちろん「保護ビュー」ではマクロが使えませんし、それどころか、Excelのほとんどの機能が使用不可になります。さて、ここで「編集を有効にする」ボタンをクリックしてみます。

仕様が変更されたのは、ここです。アラート部分には、次のように記載されています。

見慣れないアラートに驚いた方も多いことでしょう。ここで「詳細を表示」ボタンをクリックすると、MicrosoftのWebページが開くのですが、まったく役に立ちませんので、クリックしないことをお勧めします。

いずれにしても、こうなってしまうと、このブックを開いたままの状態で、マクロを有効にする手段はありません。たぶん、ないと思います。Excelの隅々まで調べたわけではありませんが、そもそもの目的が"マクロを無効にする"ことなのですから、それを簡単な方法で解除できる穴を作っておくとは考えにくいです。さあ、困りました。これでは仕事になりません。

そもそも、なぜダウンロードしたファイルだと分かるのか

ちょっと不思議に思いませんか?PCの中には、数多くのファイルが存在しています。そんな中で「あ、これ、ダウンロードしたファイルっすよね!」って、なぜExcelは分かるのでしょうか?実は、すべてのファイルには、それが「ダウンロードされたものかどうか」を表す印が付けられているんです。もちろん、その印をつけているのはWindowsです。Excelは、その印をチェックして動作を切り替えています。ちなみに、こういう仕様になったのは、今となっては懐かしい Windows XP の SP2 からです。このへんの仕組みを詳しく知りたい方向けに、もう少し難しい仕組みを解説すると、その印とは、NTFSの代替データストリーム(ADS:Alternate Data Stream)に記述された

[ZoneTransfer]
ZoneId=3

という値です。調べたところ、最近のファイルでは、ZoneIdの後に、どこからどんな風にダウンロードしたのかという情報も書かれていました。よく分からない方は、聞かなかったことにしてください。

さて、各ファイルに、そうした印が付けられているかどうかは、エクスプローラで確認できます。ダウンロードしたファイルを右クリックして[ファイルのプロパティ]を開いてください。

ダウンロードしたファイル(つまり、印のついたファイル)では、表示されるダイアログボックスの下に「セキュリティ」という記述が追加されます。Excelは、こうした印を調べて、マクロの挙動を変えています。

さて、この「セキュリティ」には、[許可する]チェックボックスが用意されています。そう、実はここで変更できるんです。ユーザーが自分の責任で「このファイルは安全ですよ、心配ありませんよ」という意味で[許可する]チェックボックスをオンにすると、先の印は削除されて、通常のファイルと同じ扱いになります。

[許可する]チェックボックスをオンにして[OK]ボタンをクリックすると、今後このファイルでは「セキュリティ」が表示されません。このブックをExcelで開くと、次のようになります。

「保護ビュー」にはなりません。もちろんマクロが含まれているのですから、最初に開いたときには「コンテンツの有効化」ボタンが表示されます。これは、一般的な動作ですね。ここで「コンテンツの有効化」ボタンをクリックすると、2回目からは何もしないでマクロが有効になります。

一括解除は難しい

任意のファイルに ZoneId が記録されているかどうかを確認するには、上記のように[ファイルのプロパティ]ダイアログボックスを開くのが最も簡単な方法のひとつです。ほかにも、コマンドラインで表示したり、メモ帳に表示したり、PowerShellを使う手などもあります。確認するだけなら、VBAでも簡単です。

Sub Macro1()
    With CreateObject("Scripting.FileSystemObject")
        With .GetFile("C:\Work\Sample1.xlsm:Zone.Identifier").OpenAsTextStream
            MsgBox .ReadAll
            .Close
        End With
    End With
End Sub

ZoneId が記述されていないとエラーになります。

それじゃ!ということで、すでにダウンロードしている複数のファイルに対して、一気に ZoneId を削除するにはどうしたらいいかと。そう考える人もいるでしょう。あれこれ調べてみましたが、これはかなり難しいです。いくつか方法はありますが、少なくとも「VBAがよく分かりません」というレベルだったり、何でも安易に「ネットからコードをコピペすれば何とかなる」なんて考えているレベルでは、おそらく無理でしょう。ダイアログボックスでの手動操作とはいえ、一度やればいいだけの話なのですから、ひとつずつ手動でやってください。これ以降は、ダウンロードしたときに処理すればいいのですから、それほど手間にはならないでしょう。