LoginSignup
8
6

More than 5 years have passed since last update.

VBAからのAppleScript呼び出し

Posted at

動かないマクロ

私はずっとWindowsを使っていて、最近Macを使い始めました。
これまで書類のチェックにExcelマクロを使っていたのですが、
Excel for Mac(2016)だと一部動かない箇所がありました。

  • Application.FileDialog
  • FileSystemObject

他にもあるのかもしれませんが、今のところこの2つ。
解決策をググってみると、
動かない箇所をAppleScriptで代替してね、ということのようでした。

以下の形式で、VBAからAppleScriptを呼び出せました。
MacScript(AppleScript文字列)

…が、下記ページによると、この関数は廃止されたとのこと。
https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/macscript-function
代わりに「AppleScriptTask」という関数を使うのが良いようです。
…う〜ん。時間ないので、次回直すとして、今回はMacScript関数を使っちゃいます。

AppleScript

AppleScriptとは?

Appleが開発したスクリプト言語。
Windowsのバッチファイルに近い役割だけれど、
それよりわかりやすく高性能、と感じました。

私の習得方法

基本、ヘルプを頼りにしました。
Macに標準でインストールされている「スクリプトエディタ」を起動し、
ヘルプ > AppleScriptヘルプを表示 で概要が掴めました。

詳細なリファレンスは、
ヘルプ > AppleScript Language Guide を表示 で。
こちらは全部英語なので、わからない単語が出てきたら都度3本指タップで意味を調べました。

できあがったコード

    'Mac用
    If Application.OperatingSystem Like "*Mac*" Then
        Dim macscr As String
        macscr = "" & _
        "try" & vbCrLf & _
        "set slctFolder to choose folder with prompt ""ディレクトリを選択してください""" & vbCrLf & _
        "return slctFolder" & vbCrLf & _
        "end try"

        fPath = MacScript(macscr)
        ws.Cells(5, 2).Value = fPath
        Exit Sub
    End If

    'Windows用
    With Application.FileDialog(msoFileDialogFolderPicker)
        .InitialFileName = "C:"

        If .Show = -1 Then  'ファイルダイアログ表示
            ' [ OK ] ボタンが押された場合
            fPath = .SelectedItems(1)
            'フォルダパスを表示
            ws.Cells(5, 2).Value = fPath
        End If
    End With

少し解説

最初のif文はMacであることを判別するためのものです。

If Application.OperatingSystem Like "*Mac*" Then

汚いですが、以下がAppleScript部分です。
末尾の & vbCrLf & _ が鬱陶しいですが、改行を入れないとエラーになってしまうため入れています。

        macscr = "" & _
        "try" & vbCrLf & _
        "set slctFolder to choose folder with prompt ""ディレクトリを選択してください""" & vbCrLf & _
        "return slctFolder" & vbCrLf & _
        "end try"

try〜end[try]

エラーをキャッチするためのもの。フォルダの選択をせずにキャンセルするとエラーが発生するのでこれで回避。

set 変数名 to 値

変数に値をセットする。

choose folder [with prompt]

フォルダ選択ダイアログを表示する。

今回解決したこと

Application.FileDialogで行っていたことはAppleScriptで代替できました。
FileSystemObjectの方はまだです。
フォルダ内のファイルを全て取得してコレクション変数に入れるために使っていますので、
それの代替処理を作るのが次のステップです。

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6