#Excel 2019 for Mac OS判定とAppleScriptTask利用方法
Excel 2019 からライセンス体系が変わり、永続版のWindows版とMac版両方をインストールする事が可能になりました。また Office365 でも同じようにインストールが可能になっています。OS の垣根を越えてアプリが使えるようになるのは素晴らしい事ですが、 VBAプログラマーの悩みが増えることも事実です。
Windows版のCreateObjectが全て使えないのは勿論、セキュリティ関連のダイアログにより操作性が失われる事も考慮しなくてはなりません。これらの問題を回避するのはAppleScriptを使用するしかありません。
##OS判定方法
OS事に処理を変える以上、判定方法が必要になります。私が開発しているAndroid ハンディターミナルアプリ Formeではデータの管理の為にWindowsとMac両OSに対応したエクセルファイルFormeCollector2.xlsmをインクルードしています。そこで利用しているコードがこちらです。
If Not Application.OperatingSystem Like "*Mac*" Then
Windowsの処理
else
If val(Application.Version) < 15 Then
Excel2011 for Macの処理
else
#If MAC_OFFICE_VERSION >= 15 Then
Excel2016 for Mac以降の処理
#end if
end if
end if
Mac版ではExcel2011とExcel2016以降の判定分けをMAC_OFFICE_VERSIONで行っていますが、Excel2016以降のみを対応している場合は不要です。尚、コードが冗長になっていますが安定性重視でこのような形になっています。
実際に利用される際は独自関数にする事をお勧めします。私自身はいつかやろうと思いながら、ここまで放置していますが・・・。
##以前の方法 : MacScript関数
Excel2011ではVBA内にAppleScriptをインラインで記述し、MacScript関数で実行する事ができましたが、Excel2016以降、セキュリティ上の観点から廃止されました。Excel2019で実行するとエラーにはなりませんが、常にFALSEが帰ってきます。
Sub MacScriptTest()
//フォルダ選択ダイアログ(選択したフォルダの絶対パスが返ってくる)
Dim str As String
Dim appscript As String
appscript = "tell application ""Finder""" & vbNewLine & "try" & vbNewLine & "choose folder with prompt ""formeCSVmodule""" _
& vbNewLine & "on error number err_num" & vbNewLine & "False" & vbNewLine & "end try" & vbNewLine & "end tell"
str = MacScript(appscript)
If str <> "False" Then
ActiveCell.value = Replace(str, "alias ", "")
Else
ActiveCell.value = "False"
End If
End Sub
Excel2019結果
Excel2011結果
尚、Windows版で実行するとエラーが発生します。OS判定は必ず必要です。
##AppleScriptTaskの使い方
利用するまでの手順は主に2段階となります。
- スクリプトファイルを ~/Library/Application Scripts/com.microsoft.Excel/に保存する。
- VBA内でAppleScriptTaskからスクリプトファイルを呼び出す。
1.が特に厄介です。ライブラリーフォルダは通常操作ではみる事ができないので、ターミナルか Finder > 移動(optionを押して) から移動する必要があります。
配布の点ではかなりハードルが高くなります。次の2.VBA内でAppleScriptTaskからスクリプトファイルを呼び出すはそこまで難しくありません。
Sub ASTaskTest()
Dim dirpath As String
dirpath = AppleScriptTask("AppleScriptファイル名(拡張子不要)", "スクリプト名", "引数")
End Sub
もし存在しないAppleScriptファイルを呼び出した場合エラーが発生します。これもWindows版ではエラーが発生するのでOS判定は必ず必要です。
FormeCollector2.xlsmではスクリプトファイルがない場合は自動的に作成するようになっています。VBAではライブラリーフォルダにアクセスできないので、移動はユーザーにしてもらう必要があるのが難点ですが、別にインストールアプリを配布するなどして工夫しています。