執筆:EugeneAmnis
Excel 2019 for Mac の VBA について
Excel 2016 for Mac の VBA は前バージョンの Excel 2011 for Mac と大きく変更となり、多くのユーザーが振り回されました。今回は Excel 2019 for Mac の VBA が Windows10 バージョンとどう違うのかを以前執筆したExcel 2016 for Mac の VBA についてを軸に見ていきたいと思います。
前回の検証内容
前回、Excel 2016 for Mac の VBA は前バージョンの Excel 2011 for Mac の違いの中で主に言及していたのは以下の6つでした。
- VBA内のAppleScript禁止
- 言語判定の変更
- Name ステートメントの対応
- パスセパレーターの変更
- ファイルアクセス権の確認
- PrintOutの違い
今回はこの中でも 1. VBA内のAppleScript禁止 3. Name ステートメントの対応 6. PrintOutの違いと OpenFileName(ファイルチューザー) 、 Application.FileDialog(msoFileDialogFolderPicker)(フォルダチューザー) 、 dir関数の挙動を見ていきたいと思います。
今回の検証内容
- VBA内のAppleScript禁止
- OpenFileName(ファイルチューザー)
- Application.FileDialog(msoFileDialogFolderPicker)(フォルダチューザー)
- Name ステートメントの対応
- PrintOutの違い
- dir関数
検証内容の結果
先に各OSの検証結果を記します。結果の後でテストコードを表記します。
Windows10
Windows10では 1.MacScript関数のみがエラーが発生しました。当然ですがその他は問題無く動いています。もし、Mac版でも利用される恐れのあるVBAの場合は必ず OS で分岐をしないといけない事がわかります。
1.MacScript関数のエラー内容は以下の通りです。
MacOS catalina
MacOS catalinaでは 1.VBA内のAppleScript禁止, 3.Application.FileDialog(msoFileDialogFolderPicker)(フォルダチューザー) が完全に使用不能で、2.OpenFileName(ファイルチューザー) はワイルドカードを用いなければ使用可能でした。
MacScript関数は Excel 2016 for Mac から使用不能でしたので、AppleScriptTaskへ移行する事が肝要のようです。意外にもワイルドカード付きの dir 関数が利用できるようになっていました。ここ最近では一番の吉報ではないでしょうか。
ただし、外部ファイルにアクセスする場合は最初にアクセス権を付与する必要があります。完全な自動化は少し無理があるかもしれません。
尚、1.MacScript関数は成功すると Excel 2011 for Mac では以下のように選択したフォルダのパスを返します。
VBA
ファイルチューザー(指定なし)
Sub OpenFilename()
ActiveCell.value = Application.GetOpenFilename()
End Sub
ファイルチューザー(指定あり)
Sub CsvChooser()
ActiveCell.value = Application.GetOpenFilename(FileFilter:="CSV Files (*.csv), *.csv")
End Sub
フォルダチューザー
Sub FolderDialog()
With Application.FileDialog(msoFileDialogFolderPicker)
.AllowMultiSelect = False
If .Show = True Then
ActiveCell.value = .SelectedItems(1)
Else
ActiveCell.value = "False"
End If
End With
End Sub
Nameステートメント
Sub FileMove()
Dim file As String
Dim dir As String
file = Range("B2").value
dir = Range("B3").value & Application.PathSeparator & "sample.csv"
Name file As dir
End Sub
dir関数
Sub dirTest()
Dim buf As String, i As Integer
buf = dir(Range("B3") & Application.PathSeparator & "*.csv")
i = 10
Do While buf <> ""
Cells(i, 2).value = buf
buf = dir()
i = i + 1
Loop
End Sub
印刷(ActiveWindow)
Sub Printout_window()
ActiveWindow.SelectedSheets.Printout From:=1, To:=1, Copies:=1
End Sub
印刷(ThisWorkbook)
Sub PrintOut_thisworkbook()
ThisWorkbook.ActiveSheet.Printout
End Sub
MacScript関数
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
Excel 2019 for Mac で使用不能なものは他にユーザーフォームの作成、編集ができないなどがあります。
Excel 2019 for Mac で AppleScript は不要になるかなとも思っていましたが、中々そうは行かないようです。私が配布している FormeCollector2 では AppleScript を出力する機能を付けています。所定の位置に保存してもらう必要がありますが、別でAppleScript インストール支援アプリ FormeVBAassist.app(MIT LICENSE) を配布して、インストール作業の支援をしています。
頭の痛い問題ではありますが Office 2019 からライセンスが変わり、ひとつのライセンスで Windows版と Mac版を利用する事が可能になった以上、VBAプログラマーは今まで以上に互換性に気をつける必要があるようです。