2019年4月1日月曜日

Excel 2010以降での便利マクロの挙動について

いや、「便利マクロ」って何だよって話ですが。

例えばちょっとした汎用マクロだとか、CSVをLine Input&Split関数+配列で読み込むマクロなんかをファイルを開く時にショートカットキー登録しておくとすこぶる便利なわけで、そういうのを「便利マクロ」と言っているんです、個人的に(知るか!)。

※2019.4.3追記

Sub wariate()
 with Application
  .MacroOptions Macro:="Sheet1.Hoge", ShortcutKey:="j"
  .StatusBar = "[Ctrl]+[J]で「Hoge」マクロが走りますよ!"
 End With
End Sub

例えばこう言うプロシージャを標準モジュールに作成する(Sheet1には「Hoge」プロシージャがあること前提で)と、Ctrlキー使いのショートカットが登録できるわけです。


さて、仕事上、Office関係やなんやかやのファイルもなるべく共有フォルダに保存する必要があって、そういった場合にOffice2010以降ではそれらを「インターネットから保存されたファイル」=危険性のあるファイルと認識して、一旦読み取り専用で開くんです。ほら、「編集を有効にしますか?」とかいうメッセージが出ることありませんか。その場合、先述の便利マクロが使えないんです。

正確にいうと便利マクロがということではなく、ショートカットキー登録するためのコードを呼び出すWorkbook_Openイベントがブロックされてしまうということなんですが。

対策としては


  1. Excelのセキュリティレベルを下げる
  1. ファイルを安全なものとして登録する
  1. 対象のファイルを独立したインスタンスで開く


というものがあるんですが、はい、もうわかりますね。明らかに最後のが具体的すぎますね。この場合の正解です。
とは言え一応説明しておきますと、上2つは管理者権限が必要なので、設定ができないんですね。だから、個人で自宅ファイルサーバとかにブックを置いてる場合なんかはアリです。ですが、上司を介してSEに申請して、ケースによっては上長の承認が必要なんて事になると、むしろ「そのファイルは、そのコードは本当に業務に必要なのか?」みたいなことを言われる可能性まで出てきます。自分が楽するためにやってるのにそんな事言われたらたまったもんじゃありませんので、ここはMicrosoftが「仕様です」と言っている3番の方法を使うべきでしょう。独立したインスタンスってのはExcelの中で「別の宇宙を作る」みたいな感じなので、他のExcelから勝手にコードを実行したりできないので確かに安全なんです。(Ctrl+Tabで切り替えられなくて、アプリケーションを切り替えるAlt+Tabで切り替えなきゃいけない;コピペができない;わかりにくいなー)

そのためにどうしたらいいかと言いますと、コマンドラインもしくはVBScriptからShellで起動すればよい。具体的には

Option Explicit
Dim objExcelApp, strPath
Const Bookname="C:¥hoge.xlsm"

Set objExcelApp = CreateObject("Excel.Application")

With WScript
strPath = Replace(.ScriptFullName, .ScriptName, "")
End With

With objExcelApp
.Workbooks.Open BookName, False, False
.Vidible = True
End With

Set objExcelApp = Nothing

みたいなコードを書いて”.vbs”で保存し、デスクトップなどに作成したショートカットのプロパティにそのファイルのパスを登録する、ということです。これでものぐさし放題!

て言うか毎月、毎週、なんなら毎日PC上で実行する作業を自動化するのを許可しない脳筋職場環境がおかしいんですけどね。これで国際競争力とか何とかどの口が言ってんだ、NIPPON!て感じですが。