見出し画像

AppleScriptTaskを利用したUTF8形式CSVファイルの出力方法

Excel VBAのSaveAS関数にxlCSVUTF8が追加され、簡単にUTF8形式のCSVファイルを作成することが可能になりました。ただしExcel for Macでは動作が不安定であり、事実上使用できない状態です。

WindowsであればcreateObjectを利用することで簡単に実現できますが、 Macの場合はそうはいきません。この記事ではMac標準のスクリプトであるAppleScriptを使ってUTF8形式のCSVファイルを作成する方法を紹介していきます。

この記事の内容は筆者が開発・運営しているアプリForMeのブログであるforme-note内の複数の記事をまとめ、図表を追加したものです。

まず、AppleScriptとAppleScriptTaskについて説明しますがすでに既知の方は具体的な手順からお読みください。

Applescriptとは?

OSX時代からMacの標準スクリプトとして不動の地位を誇るスクリプト言語です。作成にはスクリプトエディタから行います。自然言語系のスクリプトであり、英文に近い構造をしています。長きに渡り、Excel for MacはAppleScriptを介してExcelの自動化などを行ってきました。

AppleScriptTaskとは?

Excel2016 for Macから導入されたExcel VBAからAppleScriptを利用するためのAPIです。前のモデルである Excel 2011 for MacではMacScriptと呼ばれる APIの引数にインライン化されたAppleScriptを渡すことでVBAからAppleScriptを制御していましたが、セキュリティ意識の向上から、所定のスクリプトフォルダに保存されたAppleScriptをAppleScriptTaskで呼び出して利用する形に変更されました。

AppleScriptTask("使用するAppleScriptファイル名","関数名","引数となる文字列")

AppleScriptTaskは上記のように使用します。使用するAppleScriptファイル名は拡張子がなくても問題ありません。(筆者は念の為つけますが。)引数は文字列のみで、返り値も文字列のみです。文字列を受け取る場合は通常のVBAのMsgboxやInputboxのような形で記述します。

Dim res as String

res = AppleScriptTask("sample.applescript","test","")

独特な使い方として返り値が無い場合でもVariant型の関数とセットで使用する必要があります。

Dim anchor as Variant

anchor = AppleScriptTask("sample.applescript","test","")

これを怠るとVBEが構文エラーとして処理してしまいます。また、Windowsでも使用される場合は以下のように条件分岐をつける必要があります。

On Error GoTo 256

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以降の処理(AppleScriptTaskをここで使用する)
         #end if
    end if
end if

AppleScriptTaskでは引数、返り値が文字列のみなので配列を利用する際はsplit関数などを利用する必要があります。尚、スクリプトが無いなどのエラーは特別なものは用意されていないようです。

VBAとAppleScriptの関係

Windows版ExcelのcreateObject関数のMac版がAppleScriptTaskとなります。VBAとAppleScript、Excelの関係は以下の図のようになっています。


VBAとAppleScriptの関係図

実際はVBAから実行したAppleScriptが直接Excelのシートを操作することもあります。VBAでAppleScriptTaskを使う強みはcreateObject関数の代替だけでなく、ファイル権限の確認ダイアログを気にしなくて良いというものがあります。

Excel2016 for Mac以降Excelから、はじめてアクセスするファイルは以下の図のようなダイアログが表示され、アクセス権限の譲渡をユーザーがしなくてはならなくなっています。


ファイル権限の確認ダイアログ図

Excelのマクロを組む際、所定のフォルダのCSVファイルをを読み込む等の作業を行うケースがあると思いますがその時、はじめてアクセスするファイルがあった場合は権限譲渡ダイアログでマクロが止まってしまいます。それを避けるためには、処理の前に明示的にアクセス権限の譲渡ダイアログを表示させるか、AppleScriptを使うかのどちらかを選ぶしかありません。

このアクセス権限譲渡ダイアログは結構癖があり、LoadPicture関数などでは表示されず、ただエラーが表示されるだけです。画像パスの場合は必ず、明示的にアクセス権限譲渡ダイアログを表示させなくてはなりません。

Sub requestFilesPermission(ByRef files() As String)
    Dim fileAccessGranted As Boolean
    Dim filePermissionCandidates

    filePermissionCandidates = files()
    fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates)
End Sub

具体的な手順

ではここから具体的な手順に入っていきます。AppleScriptTaskを使うまでの流れは以下のようになります。

AppleScriptTaskを使うまでの流れ図

通常は白枠の部分の手順で行いますが、フォルダ操作や配布時の手間を考え、今回は青色の部分であるインストールスクリプトの自動作成と実行を行っていきます。この方法であれば、自動作成されたスクリプトを実行するだ
けで煩雑なフォルダ操作や配布時の複数ファイルの問題点を解決できます。

ここから先は

7,773字 / 7画像

¥ 300

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?