Office URI スキーマでExcelVBAマクロを走らせる
2023-11-05 記載
概要 : WebベースのコードからWindowsマシンをフル操作できるコードへとつなぐ試み
Keyword : Office URI スキーマ, Excel, VBA, マクロ, トラストセンター, ms-excel
クライアントの開発環境が整ってきたので、開発環境全体にわたっての自動処理を行う方法を考えます。
少し前にMicrosoftがVBScriptの将来打ち切りをアナウンスしたところなので、それならPowerShellでは?というのが一般的な見解だと予想されるところですが、当方Office2021をインストールしている関係でExcel-VBAに注目しました。魅力はOutlookとの連携が容易なこと。メールの読み書きも含めた自動処理の開発効率が高いです。PHPではこのあたり、OAuthや文字コードに足を引っ張られそうな気がします。(スキルが足りないからですが)
問題はブラウザからクライアントネイティブへどうつなぐか。CGIからshellへ、というあたり。キックできたとしてもそのときの実行ユーザーは誰?とか、そのあたり難しそうです。これもスキルが足りないからですが。
というようなことを考えて調べていたら「Office URI スキーマ」なるものがあると知りました。
Microsoft Ignite Office URI スキーマ
https://learn.microsoft.com/ja-jp/office/client-developer/office-uri-schemes
ブラウザからURLでExcelを開けるとのこと。
おぉ、ということは、マクロ付き.xlsmならWorkbook_Openにコードを書いておけば、VBAでできるあらゆる処理が、ブラウザから連携させることができる、ということではないでしょうか。
とりあえず試してみます。
It’s works.のフォルダ C:\pgm\Apache24\htdocs に test.xlsx を置きました。
ms-excel:ofv|u|<http://localhost/test.xlsx>
とすると。
「このファイルは制限付きサイトゾーンから入手したものです。
したがって、安全でないコンテンツからユーザーを保護するため、
Officeはこのファイルを開かずにブロックしました。」

あれこれ試行錯誤してURLを<>で括ってはダメだとわかりました。
ms-excel:ofv|http://localhost/test.xlsx
これでExcelを開けました。
viewではなくeditで開いてみます。
ms-excel:ofe|u|http://localhost/test.xlsx
開けましたがタイトルに[読み取り専用]とついています。
セルを編集してXボタンで閉じるとき、保存しますかと聞いてきたので
上書き保存したらちゃんと保存できてました。
ms-excel:ofv ならこれはできないのかなと思ってやってみたら、
ちゃんと(と言うべきか?)保存できました。
次はマクロ。
“mtest.xlsm”を配置してマクロはThisWorkbookモジュールに以下を記入。
Private Sub Workbook_Open()
MsgBox "Hello Macro !"
End Sub
ms-excel:ofe|u|http://localhost/mtest.xlsm
「セキュリティリスク
このファイルのソースが信頼できないため、
Microsoftによりマクロの実行がブロックされました。」

と赤通知が出て、実行できませんでした。
[詳細]をみるとインターネットのセキュリティを変えるとか、
さらにググるとこのあたり様々な対処法があるのですが、
あれこれやってもなかなか回避できず。
しかしついに実行できました。
あまりにあちこちいじったので、初期値がどうだったか、結局どこを変えたらよいのか、
自分でもわからなくなったほど。ということで、以下、たぶんですが。
トラストセンターのみです。
「ネットワークを信頼する」関係のチェックボックスで、
保護ビューのチェック2つを外し,信頼できるドキュメントのチェックをつけます。



それと信頼する場所に http://localhost/ を追加。
ここはファイルパスしか入れられないような印象ですが URL が設定できました。
説明「Office URI スキーマ( ms-excel:ofe| )の為に追加」はご自由に。
サブフォルダーでも動作。しかしタイトルに[読み取り専用]とつくのは.xlsxと同じ。
でもとりあえずマクロ発動。

あらかじめ開いておいて、ブレークポイントを置いて待ってみると
「申し訳ございません。同じ名前のブックを同時に開くことはできません。」
となりました。どうやらExcel自体が別のインスタンスのようです。

ならばと、MsgBox(“Hello Macro !”)のところで、Ctrl+Breakで止めたらそれは停止できました。
イミディエィトで
? ThisWorkbook.Path
http://localhost
おぉ、こんなのもあるんですね。