Excel 2019 for Mac VBAでAppleScriptをインストールする

#Excel 2019 for Mac VBAでAppleScriptをインストールする

Excel 2016 for MacからVBA内で[AppleScript](https://qiita.com/EugenesWorks/items/f802a8680836de951ab8)を利用する際は~/Library/com.microsoft.Excel/内に使用するスクリプトファイルを保存する必要があります。個人で使うならまだしも、セキュリティ的には歓迎ですが配布する場合はVBAでアクセスできないフォルダなのでユーザーの手間が増えてしまい、良いとは言えません。

(以降、AppleScriptとスクリプトを兼用していきます。どちらも同じAppleScriptを表しています。)

今回はまず、VBAで~/Library/com.microsoft.Excel/内にスクリプトファイルを保存するスクリプトファイルを任意の場所に保存し、ユーザーにそのスクリプトファイルを実行してもらい、~/Library/com.microsoft.Excel/にスクリプトファイルを保存しようという魂胆です。

##スクリプトファイルインストール用AppleScriptコード

~~~
set root to (path to home folder) as string
set mkEdir to root & "Library:Application Scripts:"
set tgtpath to root & "Library:Application Scripts:com.microsoft.Excel:"
set mkas to tgtpath & "test.applescript"

set asval to "on fc()" & linefeed & "tell application \"Finder\"" & linefeed & "try" & linefeed & "choose folder with prompt \"formeCSVmodule\"" & linefeed & "on error number err_num" & linefeed & "False" & linefeed & "end try" & linefeed & "end tell" & linefeed & "end fc"

tell application "Finder"
  if not (exists tgtpath) then
   make new folder at mkEdir with properties {name:"com.microsoft.Excel"}
  end if
end tell

try
  set tfile to open for access file mkas with write permission
  set eof of tfile to 0
  write asval to tfile
end try

close access tfile

tell application "Finder"
  open tgtpath
end tell
~~~

フォルダチューザーダイアログ用のAppleSciptコードです。
この・・・を実行し、~/Library/com.microsoft.Excel/内にスクリプトファイルを保存します。最後に~/Library/com.microsoft.Excelを開きます。

##VBAコード

~~~
Sub VBA2AppleScript1()

Dim root As String
Dim path1 As String
Dim appscript As String

root = "/Users/Shared"

path1 = root & Application.PathSeparator & "as2vbaTest.applescript"

applescript = "set root to (path to home folder) as string" & vbNewLine _
& "set mkEdir to root & " & Chr(34) & "Library:Application Scripts:" & Chr(34) & vbNewLine _
& "set tgtpath to root & " & Chr(34) & "Library:Application Scripts:com.microsoft.Excel:" & Chr(34) & vbNewLine _
& "set mkas to tgtpath & " & Chr(34) & "test.applescript" & Chr(34) & vbNewLine _
& vbNewLine _
& "set asval to " & Chr(34) & "on fc()" & Chr(34) & " & linefeed & " & Chr(34) & "tell application " & Chr(92) & Chr(34) & "Finder" & Chr(92) & Chr(34) & Chr(34) & " & linefeed & " & Chr(34) & "try" & Chr(34) & " & linefeed & " & Chr(34) & "choose folder with prompt " & Chr(92) & Chr(34) & "formeCSVmodule" & Chr(92) & Chr(34) & Chr(34) & " & linefeed & " & Chr(34) & "on error number err_num" & Chr(34) & " & linefeed & " & Chr(34) & "False" & Chr(34) & " & linefeed & " & Chr(34) & "end try" & Chr(34) & " & linefeed & " & Chr(34) & "end tell" & Chr(34) & " & linefeed & " & Chr(34) & "end fc" & Chr(34) & vbNewLine _
& vbNewLine _
& "tell application " & Chr(34) & "Finder" & Chr(34) & vbNewLine _
& "  if not (exists tgtpath) then" & vbNewLine _
& "   make new folder at mkEdir with properties {name:" & Chr(34) & "com.microsoft.Excel" & Chr(34) & "}" & vbNewLine _
& "  end if" & vbNewLine _
& "end tell" & vbNewLine _
& vbNewLine _
& "try" & vbNewLine _
& "  set tfile to open for access file mkas with write permission" & vbNewLine _
& "  set eof of tfile to 0" & vbNewLine _
& "  write asval to tfile" & vbNewLine _
& "end try" & vbNewLine _
& vbNewLine _
& "close access tfile" & vbNewLine _
& vbNewLine _
& "tell application " & Chr(34) & "Finder" & Chr(34) & vbNewLine _
& "  open tgtpath" & vbNewLine _
& "end tell"

Open path1 For Output As #2
    Print #2, applescript
Close #2

ActiveWorkbook.FollowHyperlink Address:=root

End Sub

'確認用

Sub VBA2AppleScript2()

    ActiveCell.value = AppleScriptTask("test.applescript", "fc", "")

End Sub
~~~

今回は共有フォルダに保存した後、作成したスクリプトファイルをダブルクリックしてもらいスクリプトエディタを起動します。何故ハイパーリンクを使わないかは後から説明します。

##結果

STEP1でスクリプトファイルを保存し、STEP2でAppleScriptTaskで確認をしています。

![vba2as1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965663/d856fee2-bc2d-ceef-253b-1ccf98a2a512.gif)


インストールに成功し、AppleScriptTaskで使用できることが確認できました。ただし、問題点も浮き彫りになりました。

##問題点

###1.AppleScriptコードのインラインがややこしい

今回は短いAppleScriptだったので、まだマシですが手動でするには限界があります。現在、コードをインライン化するツールを作成中です。

###2.作成したAppleScriptファイルを直接、ハイパーリンクで開けない

なぜか、実行不可でした。非同期のせいかと考え、Waitを利用したりしましたが今のところ原因不明です。