執筆:EugeneAmnis
GetOpenFilename
ExcelVBAにはGetOpenFilenameというユーザーに任意のファイルを選択させることのできるAPIがあります。このAPIを使うことでExcel上で任意のファイル処理をスムーズに行うことができる訳です。ファイルタイプと複数選択にも対応することでユーザーの作業負担軽減に貢献しています。Windows版では。
Mac版では使用可能ではありますが、ファイルタイプの指定も複数選択にも対応していません。因みにファイルタイプの指定ではエラーが発生し、複数選択は指定しても操作できない状態になっています。(Shift or Ctrl or command)
AppleScriptで代替機能を作成
現在、様々なプラットフォームで使用されるExcelにおいて互換性がないのは困りますね。特にVBAで簡易ツールを作成されている方たちにとっては頭の痛い問題になりかねません。そこでいつもの流れですがAppleScriptを利用して、Windows、Mac両OSで使用できるユニバーサルVBAに変えていきましょう。
実装
具体的な実装に入ります。まずAppleScriptでGetOpenFilenameと同じ動きをするものをコーディングします。入力するコードは以下になります。
AppleScript(applescriptファイル)
on msf(typ)
tell application "Finder"
activate
try
set fs to choose file with prompt "MultipleSelectFiles" of type typ with multiple selections allowed without invisibles
return fs as text
on error number err_num
false
end try
end tell
end msf
次にコーディングしたものを任意の名前(英名.applescriptを推奨)で~/LibraryApplication Scripts/com.microsoft.Excel/に保存すると、AppleScriptTask関数で利用できます。
VBA
GetOpenFilename代替コードは以下です。
Option Explicit
Sub MultipleFileChoose()
Dim datas As Variant, res As String
If Not Application.OperatingSystem Like "*Mac*" Then //Windows版
datas = Application.GetOpenFilename(FileFilter:="CSV Files (*.csv), *.csv", MultiSelect:=True)
Else
#If MAC_OFFICE_VERSION >= 15 Then //Mac版(2016以上)
datas = AppleScriptTask("MultipleSelectFiles.applescript", "msf", "csv") //成功でも配列ではなく文字列で返ってくる。
res = Replace(datas, ".csv", ".csv,") //AppleScriptでは区切り文字設定が厄介なため選択したファイルパスがすべて連結した状態で返ってくるようにしてあるので拡張子をコンマ付きに変更する。
datas = Split(res) //配列に戻す。
#End If
End If
If IsArray(datas) Then //配列であれば表示する。
res = Join(datas)
MsgBox (Replace(res, ",", vbCrLf))
End If
End Sub
今回はSubで定義していますが、Functionで定義してコーディングした方が汎用性が高くなります。
実行結果
Windows版
Mac版
これで両OSで使用できるようになりました。

この状態では配布の際に2つのファイル(applescriptとxlsm)とMac版では特別な操作が必要になります。Excelワンパッケージ化に興味のある方はこの記事を参考にしてください。