サイト管理人Blog

cloudfreeで「さぁ始めましょう♪」

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

おぉ、こんなのもあるんですね。

投稿へのコメントは コチラ(掲示板) へお願いします。

サイト管理人Blog