Cocoa AppleScript フォルダ階層(子フォルダ)対応 フォルダ内の全ファイル名を取得 AppleScript [05]
](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFKKPHdzUYAVI0QJfTM-OeRGJO5vfo1g1pkL0FqZ48Smi9F1ppRumUtPmUZKaJRpje1X0l9uhn7DU3ElWN_K4NBre4nqSK04Q-JmZTgrIuOcEmtWQpYFKaLj_bkPXzgen010aZ4E-oSaY/s320/20210922_02.png)
AppleScript [05] Cocoa AppleScript 版 フォルダ階層(子フォルダ)対応 フォルダ内の全ファイル名を取得!
「拡張子」だけではなく、 ファイル名に対し「 contains キーワード + 拡張子 」又は「 正規表現 」にて 抽出可能 に!
Cocoa AppleScript は 従来の Vanilla AppleScript と比較して、 10〜100倍ほど高速!
通称 Cocoa AS を正式には AppleScriptObjC ( ASOC ) 、Object Pascal で実装した "Macintosh System9" 以前とは異なり Objective-C で実装した macOS10 以降のAPI を Cocoa と呼ぶ。
・ "Finder" 利用から Cocoaの "NSFileManager" 、また "list" 利用の一部を ソート(並び替え)や「正規表現も含めたフィルタ」機能を持つ "NSArray" に変更!
・( "Finder" 利用の ) Vanilla AS は低速なだけで、ソート(並び)順とか細かい事を意識することなく カスタマイズが簡単(つまり、初心者向け!)
・Cocoa は本来 Objective-C や Swift 用部品のため、その知識が少しは無いと(ヘッダファイルを読めないと...) Vanilla から Cocoa 変換は大変! Vanilla と違い(無償では)エラー発生場所が判らず!
(注) AppleScript にて、フォルダ選択ダイアログ あるいは ファイル選択ダイアログ を利用します!
2021/09/20 Ver. 3.0「Cocoa AppleScript 初版」に改良!
→ AppleScript は "filePath.scpt" ファイル内のコード全て、VBAコードも全て「差替」が必要です。(インターフェースの追加や一部変更あり)
【Cocoa AS】 AppleScript [05] Cocoa AppleScript 版 フォルダ階層(子フォルダ)対応 フォルダ内の全ファイル名を取得!
まず、Excel メニューバーの [ヘルプ] - [更新プログラムのチェック] にて、適用されていないアップデートがあれば行ってください。
VBA の AppleScriptTask コマンド パラメータの注意点
ファイルパスと区別するため フォルダパス指定には 末尾に必ず / を付加 してください! フォルダフルパス なら 先頭と末尾が必ず / となります。
OneDrive や iCloud、Dropbox、Box 等のサービスをブラウザ利用でなくフォルダにリンクしている場合も(リンク)パスが判れば指定可能ですが、https:// が先頭に付いたり ネットワーク経由のアクセスのためとんでも無く時間がかかりますので ローカルPC(Mac本体内の高速なSSDやHDDドライブ)上のフォルダパスを指定してください。
初版 Cocoa AppleScript コードの全置換(一部はVanilla AS記述)
(1) 以前に 作成したExcelファイルをマクロを有効にして開き、続いて VBEウィンドウ を開く。
(2) ~/ライブラリ/Application Scripts/com.microsoft.Excel/ フォルダ内に保存した filePath.scpt をダブルクリック等で("スクリプトエディタ"アプリにて)開き、 ファイル内の全AppleScriptコードを以下のコードで置換し、 コンパイル後に ファイルを保存 したら "スクリプトエディタ"アプリは終了してください。
上記の操作方法がよく解らない方は、 以前の投稿 をお読みください。
VBA、AppleScript 両方のコードに コメントをたくさん記述しておいたので、宜しければ ご覧ください!
2021/09/20 Ver. 3.0「Cocoa AppleScript 初版」に改良!
→ AppleScript は "filePath.scpt" ファイル内のコード全て、VBAコードも全て「差替」が必要です。(インターフェースの追加や一部変更あり)
全置換となるため 以下の全AppleScriptコードを コピー&ペースト(貼り付け)後、 コンパイル後に ファイルを保存 してください。 同じく全置換となる VBAコード は「次章」に記載します。
AppleScript "filePath.scpt" をダウンロード可能にしました。 Download Here
( ダウンロードしてダブルクリックすると、 "スクリプトエディタ.app" を起動! )
上記リンクを右クリックして「リンク先のファイルをダウンロード」等を選択してダウンロード可能。
( "Google Chrome" ブラウザの場合、上記リンクを右クリックして「名前を付けてリンク先を保存」を選択してダウンロード )
(注) [ Unicode(UTF-8) 、改行コードは LF ] ファイル置き場として、筆者の旧ブログを利用
ちなみに、 ret で始まる AppleScript の ハンドラー (VBAのプロシージャ相当の呼び出し単位)は Cocoa AS で主処理が実装されていますので、カスタマイズは慎重にお願いします。 その他の ハンドラー も Cocoa AS 実装の部分が判るように記述 しています。 Vanilla AS 部分はカスタマイズが楽で「 AppleScriptTask コマンド経由の呼び出し」ではなく、「 filePath.scpt をダブルクリック後に起動される スクリプトエディタ.app にて実行」すれば( Vanilla AS 部分の場合 )エラー発生箇所が判ります。 先頭部分の on test() から end test 内にサンプルのデバッグ用コードを記述済みのため、変更後に [command]+[K] でコンパイル、 test() の実行は [command]+[R] で可能です。 動作に問題が無い場合は [command]+[S] にて保存を忘れないように!
VBA だけでなく AppleScript コードも テキスト保存が可能なため、変更前に [command]+[A] にて全選択後 [command]+[C] でコピー してテキストエディタ等に [command]+[V] にてペースト(貼り付け)しておけば元に戻せます。 カスタマイズ作業前に filePath.scpt と AppleScriptTaskコマンドを記述したExcelファイル を ローカルPC上か クラウド領域にバックアップしておくと なお良いでしょう。
![AppleScript[05] Png02](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFKKPHdzUYAVI0QJfTM-OeRGJO5vfo1g1pkL0FqZ48Smi9F1ppRumUtPmUZKaJRpje1X0l9uhn7DU3ElWN_K4NBre4nqSK04Q-JmZTgrIuOcEmtWQpYFKaLj_bkPXzgen010aZ4E-oSaY/s0/20210922_02.png)
【VBA I/F】 AppleScript [05] Cocoa AppleScript 版 フォルダ階層(子フォルダ)対応 フォルダ内の全ファイル名を取得!
VBAコード の全置換は、以降のコードを順番にコピー&ペースト(貼り付け)
Option Explicit
Sub DispArray(list As Variant, Optional isCrLf As Boolean = False)
Dim i As Long
For i = LBound(list) To UBound(list) '配列の全要素を取得
If (isCrLf) Then
Debug.Print list(i) '区切り文字 vbCrLf だとFormat付き表示が乱れるため
Else
'1行ずつ、「イミディエイト」ウィンドウへ Debug.Print 表示
Debug.Print ("list[" & Format(i, "000") & "]= " & list(i))
End If
Next
End Sub
Sub GetClipBoard() 'クリップボードに格納したテキストデータを取得&表示
Dim list() As String '「パスorファイル名」格納用として「文字列の配列」を定義
Dim ClipBoard As Variant
Dim dataObj As MSForms.DataObject 'VBAがクリップボードとやり取りをするための「橋渡し役」
ClipBoard = Application.ClipboardFormats
If ClipBoard(1) = True Then
MsgBox "クリップボードは空です。", vbExclamation
Set ClipBoard = Nothing
Exit Sub
Else 'クリップボード形式は「UTF-8 CrLf テキストデータ」のため、テキストエディタにも貼付可能
ActiveSheet.Cells.Clear 'アクティブシートの全データクリア
ActiveSheet.Paste Destination:=Range("A1") ' A1,A2,A3, ... の順にペースト
On Error GoTo myError ' マクロVBAを中断せず再実行すると、動作するため
Set dataObj = New MSForms.DataObject 'DataObjectインスタンスを生成
With dataObj
.GetFromClipboard 'クリップボードからDataObjectにデータを取り込む
list = Split(.GetText, vbCrLf) '.GetText:DataObjectのデータ、区切り文字 vbCrLf
End With 'Excelのセル内改行コードは vbLf のため、区切り文字 vbLf は利用不可!
Call DispArray(list, True)
Erase list '配列の初期化
Set dataObj = Nothing 'DataObjectインスタンスのメモリを開放
End If
Set ClipBoard = Nothing
Exit Sub
myError:
Application.Wait Now() + TimeValue("00:00:03") '3秒間の停止
Resume 0 ' エラーが起きたステートメントを再実行
End Sub
Sub test11()
' 選択したフォルダ階層(子フォルダを含む)に含まれるフォルダフルパスと全ファイル名を取得
' パラメータ[1] プロンプト文字列:""なら、AppleScriptコード設定の初期値
' パラメータ[2] 初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
' POSIXフルパス指定のため、先頭と末尾に / が必要 ex) "/Users/username/Downloads/"
' 実行結果[0〜n] (子フォルダを含む)フォルダのフルパス あるいは (拡張子付きの)ファイル名
Dim scriptResult As String ' AppleScript 実行結果 (文字列)、区切り文字 LF
Dim scriptParam As String ' AppleScript パラメータ(文字列)、区切り文字 LF
Dim list() As String ' 「パスorファイル名」格納用として「文字列の配列」を定義
' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
' パラメータの区切り文字には、Macの改行コード(vbLf)を指定
' scriptParam = "フォルダ選択!" & vbLf & "/Users/username/"
scriptParam = "" & vbLf & ""
scriptResult = AppleScriptTask("filePath.scpt", "getFileListOfChildFolders", scriptParam)
If scriptResult <> "" Then '「キャンセル」ボタン押下時も、空文字列が返る
list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
Call DispArray(list) '実行結果(文字列)の表示
Erase list '配列の初期化
Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
End If
Rem OneDrive 等 Cloud環境下で動作させると、以下パスが https://〜 となるため注意!
Rem Debug.Print "*****"
Rem Debug.Print ActiveWorkbook.Path & Application.PathSeparator & ActiveWorkbook.Name
End Sub
Sub test12()
' 選択したフォルダ階層(子フォルダを含む)に含まれるフォルダフルパスと全ファイル名を取得
' パラメータ[1] プロンプト文字列:""なら、AppleScriptコード設定の初期値
' パラメータ[2] 初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
' POSIXフルパス指定のため、先頭と末尾に / が必要 ex) "/Users/username/Downloads/"
' パラメータ[3] ファイル拡張子の指定:"css" のように 1つだけ指定(2つめ以降は無視)
' 実行結果[0〜n] (子フォルダを含む)フォルダのフルパス あるいは (拡張子なしの)ファイル名
Dim scriptResult As String ' AppleScript 実行結果 (文字列)、区切り文字 LF
Dim scriptParam As String ' AppleScript パラメータ(文字列)、区切り文字 LF
Dim list() As String ' 「パスorファイル名」格納用として「文字列の配列」を定義
' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
' パラメータの区切り文字には、Macの改行コード(vbLf)を指定
' scriptParam = "フォルダ選択!" & vbLf & "/Users/username/" & vbLf & LCase("css")
scriptParam = "" & vbLf & "" & vbLf & LCase("css")
scriptResult = AppleScriptTask("filePath.scpt", "getFileListOfChildFoldersByExt", _
scriptParam)
If scriptResult <> "" Then '「キャンセル」ボタン押下時も、空文字列が返る
list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
Call DispArray(list) '実行結果(文字列)の表示
Erase list '配列の初期化
Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
End If
End Sub
Sub test13()
' 選択したフォルダ階層(子フォルダを含む)に含まれるフォルダフルパスと全ファイル名を取得
' パラメータ[1] プロンプト文字列:""なら、AppleScriptコード設定の初期値
' パラメータ[2] 初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
' POSIXフルパス指定のため、先頭と末尾に / が必要 ex) "/Users/username/Downloads/"
' パラメータ[3〜n]ファイル拡張子の指定:"css" "html"のように 複数指定可(1つでもOK)
' 実行結果[0〜n] (子フォルダを含む)フォルダのフルパス あるいは (拡張子付きの)ファイル名
Dim scriptResult As String ' AppleScript 実行結果 (文字列)、区切り文字 LF
Dim scriptParam As String ' AppleScript パラメータ(文字列)、区切り文字 LF
Dim list() As String ' 「パスorファイル名」格納用として「文字列の配列」を定義
' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
' パラメータの区切り文字には、Macの改行コード(vbLf)を指定
' scriptParam = "フォルダ選択!" & vbLf & "/Users/username/" & vbLf & LCase("css")
scriptParam = "" & vbLf & "" & vbLf & LCase("css") & vbLf & LCase("js")
scriptResult = AppleScriptTask("filePath.scpt", "getFileListOfChildFoldersByExts", _
scriptParam)
If scriptResult <> "" Then '「キャンセル」ボタン押下時も、空文字列が返る
list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
Call DispArray(list) '実行結果(文字列)の表示
Erase list '配列の初期化
Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
End If
End Sub
Sub test14()
' 選択したフォルダ階層(子フォルダを含む)に含まれるフォルダフルパスと全ファイル名を取得
' パラメータ[1] プロンプト文字列:""なら、AppleScriptコード設定の初期値
' パラメータ[2] 初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
' POSIXフルパス指定のため、先頭と末尾に / が必要 ex) "/Users/username/Downloads/"
' パラメータ[3] keyString [fileNameExt contains keyString] ファイル名が keyStr を含む
' パラメータ[4〜n]ファイル拡張子の指定:"css" "html"のように 複数指定可(1つでもOK)
' 実行結果[0〜n] (子フォルダを含む)フォルダのフルパス あるいは ファイル名
Dim scriptResult As String ' AppleScript 実行結果 (文字列)、区切り文字 LF
Dim scriptParam As String ' AppleScript パラメータ(文字列)、区切り文字 LF
Dim list() As String ' 「パスorファイル名」格納用として「文字列の配列」を定義
' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
' パラメータの区切り文字には、Macの改行コード(vbLf)を指定
' scriptParam = "フォルダ選択!" & vbLf & "/Users/username/" & vbLf & LCase("css")
scriptParam = "" & vbLf & "" & vbLf & "light" & vbLf & LCase("css") & vbLf & LCase("js")
scriptResult = AppleScriptTask("filePath.scpt", "getFileListOfChildFoldersByExtsAndKey", _
scriptParam)
If scriptResult <> "" Then '「キャンセル」ボタン押下時も、空文字列が返る
list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
Call DispArray(list) '実行結果(文字列)の表示
Erase list '配列の初期化
Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
End If
End Sub
![AppleScript[05] Png01](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLMcSfiS78lFcab8XgOYVaTQSVWxYzO8mDhWi3Qp1BM7lQHXfYBmZfLgqIDOhH6qUMLYdcnp94DxsDzz-xMlfR4pcPWS_p1kAuF3Oygn7_lpl9Tr5Ivp1fTEJGVQcSt4VVy61CnNEr_h8/s0/20210922_01.png)
Sub test15()
' 選択したフォルダ階層(子フォルダを含む)に含まれるフォルダフルパスと全ファイル名を取得
' パラメータ[1] プロンプト文字列:""なら、AppleScriptコード設定の初期値
' パラメータ[2] 初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
' POSIXフルパス指定のため、先頭と末尾に / が必要 ex) "/Users/username/Downloads/"
' パラメータ[3] 正規表現[文字列]: グループ化して利用するため、前後を ( ) で括ること!
' ex) "(^(a).*\\.(css|js)+$)" <= ファイル名が「 a で始まり、末尾が .css 又は .js 」
' ex) "(.*light.*\\.(css|js)+$)" <= 「末尾が .css 又は .js で、light の文字列を含む」
' 「拡張子を含むファイル名」を正規表現にて抽出 [注]エスケープシーケンスのため「 . ピリオド」は
' 通常 \\. 表記ですが、NSPredicate に問題があるため \\\\. つまり\4つ連続でないとエラーの場合あり!
' 実行結果[0〜n] (子フォルダを含む)フォルダのフルパス あるいは (拡張子付きの)ファイル名
' (注) 最終結果を正規表現で単純抽出のため、該当ファイルZEROでも フォルダフルパスのみの行が出来てしまう
' つまり、ファイル無しでフォルダフルパスの行のみが出来る場合があるため、VBAで除外して頂きたい!
Dim scriptResult As String ' AppleScript 実行結果 (文字列)、区切り文字 LF
Dim scriptParam As String ' AppleScript パラメータ(文字列)、区切り文字 LF
Dim list() As String ' 「パスorファイル名」格納用として「文字列の配列」を定義
' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
' パラメータの区切り文字には、Macの改行コード(vbLf)を指定
' scriptParam = "フォルダ選択!" & vbLf & "/Users/username/" & vbLf & "(.*light.*\\.(css|js)+$)"
' ファイル名が「 a で始まり、末尾が .css 又は .js 」(注)vbeではバックスラッシュが ¥ 表示
scriptParam = "" & vbLf & "" & vbLf & "(^(a).*\\.(css|js)+$)"
scriptResult = AppleScriptTask("filePath.scpt", "getFileListOfChildFoldersByRegExp", scriptParam)
If scriptResult <> "" Then '「キャンセル」ボタン押下時も、空文字列が返る
list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
Call DispArray(list) '実行結果(文字列)の表示
Erase list '配列の初期化
Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
End If
End Sub
![AppleScript[05] Png03](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikAIn3rCVPvTQpvZOaUPkEgybv5dFLt4CImkk2SXMQHg1F80O2X5COyBf_y0LxQNmbQCGNaZXvSsEoKv-xZd2LF4Sd_h4QeWReloCPA6h9NtXDS8H6UMkRRGJZbv6IueCl9zQDLYvnLTI/s0/20210922_03.png)
Sub test16()
' 選択したフォルダ階層(子フォルダを含む)に含まれるファイルのフルパスを取得
' パラメータ[1] プロンプト文字列:""なら、AppleScriptコード設定の初期値
' パラメータ[2] 初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
' POSIXフルパス指定のため、先頭と末尾に / が必要 ex) "/Users/username/Downloads/"
' 実行結果[0〜n] フォルダ階層(子フォルダを含む)に含まれるファイルの フルパス
Dim scriptResult As String ' AppleScript 実行結果 (文字列)、区切り文字 LF
Dim scriptParam As String ' AppleScript パラメータ(文字列)、区切り文字 LF
Dim list() As String ' 「パスorファイル名」格納用として「文字列の配列」を定義
' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
' パラメータの区切り文字には、Macの改行コード(vbLf)を指定
' scriptParam = "フォルダ選択!" & vbLf & "/Users/username/"
scriptParam = "" & vbLf & ""
scriptResult = AppleScriptTask("filePath.scpt", "getPathListOfChildFolders", scriptParam)
If scriptResult <> "" Then '「キャンセル」ボタン押下時も、空文字列が返る
list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
Call DispArray(list) '実行結果(文字列)の表示
Erase list '配列の初期化
Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
End If
End Sub
Sub test17()
' 選択したフォルダ階層(子フォルダを含む)に含まれるファイルのフルパスを取得
' パラメータ[1] プロンプト文字列:""なら、AppleScriptコード設定の初期値
' パラメータ[2] 初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
' POSIXフルパス指定のため、先頭と末尾に / が必要 ex) "/Users/username/Downloads/"
' パラメータ[3〜n]ファイル拡張子の指定:"css" "html"のように 複数指定可(拡張子1つでもOK)
' 実行結果[0〜n] フォルダ階層(子フォルダを含む)に含まれるファイルの フルパス
Dim scriptResult As String ' AppleScript 実行結果 (文字列)、区切り文字 LF
Dim scriptParam As String ' AppleScript パラメータ(文字列)、区切り文字 LF
Dim list() As String ' 「パスorファイル名」格納用として「文字列の配列」を定義
' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
' パラメータの区切り文字には、Macの改行コード(vbLf)を指定
' scriptParam = "フォルダ選択!" & vbLf & "/Users/username/" & vbLf & LCase("css")
scriptParam = "" & vbLf & "" & vbLf & LCase("css") & vbLf & LCase("js")
scriptResult = AppleScriptTask("filePath.scpt", "getPathListOfChildFoldersByExts", scriptParam)
If scriptResult <> "" Then '「キャンセル」ボタン押下時も、空文字列が返る
list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
Call DispArray(list) '実行結果(文字列)の表示
Erase list '配列の初期化
Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
End If
End Sub
Sub test21()
' 「拡張子指定なし」選択フォルダの(POSIX)パス名+「(拡張子付きの)全ファイル名」を取得
' ( フォルダやファイル名に 漢字が含まれても 問題無し )
' パラメータ[1] プロンプト文字列:""なら、AppleScriptコード設定の初期値
' パラメータ[2] 初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
' POSIXフルパス指定のため、先頭と末尾に / が必要 ex) "/Users/username/Downloads/"
' 注. list(0) 「ディレクトリの(POSIX)パス」を格納
' list(1〜n) 「ファイル名(拡張子あり)」を格納
Dim scriptResult As String ' AppleScript 実行結果 (文字列)、区切り文字 LF
Dim scriptParam As String ' AppleScript パラメータ(文字列)、区切り文字 LF
Dim list() As String ' 「パスorファイル名」格納用として「文字列の配列」を定義
' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
' パラメータの区切り文字には、Macの改行コード(vbLf)を指定
' scriptParam = "フォルダ選択!" & vbLf & "/Users/username/"
scriptParam = "" & vbLf & ""
scriptResult = AppleScriptTask("filePath.scpt", "getFileListOfFolder", scriptParam)
If scriptResult <> "" Then '「キャンセル」ボタン押下時も、空文字列が返る
list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
Call DispArray(list) '実行結果(文字列)の表示
Erase list '配列の初期化
Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
End If
End Sub
Sub test22()
' 選択フォルダの(POSIX)パス名+「(拡張子なしの)全ファイル名」を取得
' パラメータ[1] プロンプト文字列:""なら、AppleScriptコード設定の初期値
' パラメータ[2] 初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
' POSIXフルパス指定のため、先頭と末尾に / が必要 ex) "/Users/username/Downloads/"
' パラメータ[3] ファイル拡張子の指定:"css" のように 1つだけ指定する(2つめ以降は無視)
' 実行結果[0] 指定フォルダ(ディレクトリ)の POSIXフルパス
' 実行結果[1〜n] (拡張子なしの)ファイル名
Dim scriptResult As String ' AppleScript 実行結果 (文字列)、区切り文字 LF
Dim scriptParam As String ' AppleScript パラメータ(文字列)、区切り文字 LF
Dim list() As String ' 「パスorファイル名」格納用として「文字列の配列」を定義
' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
' パラメータの区切り文字には、Macの改行コード(vbLf)を指定
' scriptParam = "フォルダ選択!" & vbLf & "/Users/username/" & vbLf & LCase("css")
scriptParam = "" & vbLf & "" & vbLf & LCase("css")
scriptResult = AppleScriptTask("filePath.scpt", "getFileListOfFolderByExt", scriptParam)
If scriptResult <> "" Then '「キャンセル」ボタン押下時も、空文字列が返る
list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
Call DispArray(list) '実行結果(文字列)の表示
Erase list '配列の初期化
Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
End If
End Sub
Sub test23()
' 選択フォルダの(POSIX)パス名+「(拡張子付きの)全ファイル名」を取得
' パラメータ[1] プロンプト文字列:""なら、AppleScriptコード設定の初期値
' パラメータ[2] 初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
' POSIXフルパス指定のため、先頭と末尾に / が必要 ex) "/Users/username/Downloads/"
' パラメータ[3〜n]ファイル拡張子の指定:"css" "html"のように 複数指定可(1つでもOK)
' 実行結果[0] 指定フォルダ(ディレクトリ)の POSIXフルパス
' 実行結果[1〜n] (拡張子付きの)ファイル名
Dim scriptResult As String ' AppleScript 実行結果 (文字列)、区切り文字 LF
Dim scriptParam As String ' AppleScript パラメータ(文字列)、区切り文字 LF
Dim list() As String ' 「パスorファイル名」格納用として「文字列の配列」を定義
' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
' パラメータの区切り文字には、Macの改行コード(vbLf)を指定
' scriptParam = "フォルダ選択!" & vbLf & "/Users/username/" & vbLf & LCase("css")
scriptParam = "" & vbLf & "" & vbLf & LCase("css") & vbLf & LCase("js")
scriptResult = AppleScriptTask("filePath.scpt", "getFileListOfFolderByExts", scriptParam)
If scriptResult <> "" Then '「キャンセル」ボタン押下時も、空文字列が返る
list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
Call DispArray(list) '実行結果(文字列)の表示
Erase list '配列の初期化
Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
End If
End Sub
Sub test24()
' 選択フォルダの(POSIX)パス名+「(拡張子付きの)全ファイル名」を取得
' パラメータ[1] プロンプト文字列:""なら、AppleScriptコード設定の初期値
' パラメータ[2] 初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
' POSIXフルパス指定のため、先頭と末尾に / が必要 ex) "/Users/username/Downloads/"
' パラメータ[3] keyString [fileNameExt contains keyString] ファイル名に keyString を含む
' パラメータ[4〜n]ファイル拡張子の指定:"css" "html"のように 複数指定可(1つでもOK)
' 実行結果[0] 指定フォルダ(ディレクトリ)の POSIXフルパス
' 実行結果[1〜n] (拡張子付きの)ファイル名
Dim scriptResult As String ' AppleScript 実行結果 (文字列)、区切り文字 LF
Dim scriptParam As String ' AppleScript パラメータ(文字列)、区切り文字 LF
Dim list() As String ' 「パスorファイル名」格納用として「文字列の配列」を定義
' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
' パラメータの区切り文字には、Macの改行コード(vbLf)を指定
' scriptParam = "フォルダ選択!" & vbLf & "/Users/username/" & vbLf & "Key" & vbLf & LCase("css")
scriptParam = "" & vbLf & "" & vbLf & "light" & vbLf & LCase("css") & vbLf & LCase("js")
scriptResult = AppleScriptTask("filePath.scpt", "getFileListOfFolderByExtsAndKey", scriptParam)
If scriptResult <> "" Then '「キャンセル」ボタン押下時も、空文字列が返る
list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
Call DispArray(list) '実行結果(文字列)の表示
Erase list '配列の初期化
Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
End If
End Sub
Sub test25()
' 選択フォルダの(POSIX)パス名+「(拡張子付きの)全ファイル名」を取得
' パラメータ[1] プロンプト文字列:""なら、AppleScriptコード設定の初期値
' パラメータ[2] 初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
' POSIXフルパス指定のため、先頭と末尾に / が必要 ex) "/Users/username/Downloads/"
' パラメータ[3] 正規表現[文字列]: グループ化して利用するため、前後を ( ) で括ること!
' ex) "(^(a).*\\.(css|js)+$)" <= ファイル名が「 a で始まり、末尾が .css 又は .js 」
' ex) "(.*light.*\\.(css|js)+$)" <= 「末尾が .css 又は .js で、light の文字列を含む」
' 「拡張子を含むファイル名」を正規表現にて抽出 [注]エスケープシーケンスのため「 . ピリオド」は
' 通常 \\. 表記ですが、NSPredicate に問題があるため \\\\. つまり\4つ連続でないとエラーの場合あり!
' 実行結果[0] 指定フォルダ(ディレクトリ)の POSIXフルパス
' 実行結果[1〜n] (拡張子付きの)ファイル名
Dim scriptResult As String ' AppleScript 実行結果 (文字列)、区切り文字 LF
Dim scriptParam As String ' AppleScript パラメータ(文字列)、区切り文字 LF
Dim list() As String ' 「パスorファイル名」格納用として「文字列の配列」を定義
' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
' パラメータの区切り文字には、Macの改行コード(vbLf)を指定
' scriptParam = "フォルダ選択!" & vbLf & "/Users/username/" & vbLf & "(.*light.*\\.(css|js)+$)"
' ファイル名が「 a で始まり、末尾が .css 又は .js 」(注)vbeではバックスラッシュが ¥ 表示
scriptParam = "" & vbLf & "" & vbLf & "(^(a).*\\.(css|js)+$)"
scriptResult = AppleScriptTask("filePath.scpt", "getFileListOfFolderByRegExp", scriptParam)
If scriptResult <> "" Then '「キャンセル」ボタン押下時も、空文字列が返る
list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
Call DispArray(list) '実行結果(文字列)の表示
Erase list '配列の初期化
Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
End If
End Sub
Sub test31()
'「単一」ファイル選択ダイアログで、フルパスを取得(拡張子限定あり)
' パラメータ[1] プロンプト文字列:""なら、AppleScriptコード設定の初期値
' パラメータ[2] 初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
' POSIXフルパス指定のため、先頭と末尾に / が必要 ex) "/Users/username/Downloads/"
' パラメータ[3〜n]ファイル拡張子:"css" "html"のように 複数限定可(厳密だと、UTIを4つまで)
' 厳密には「拡張子ではなくUTI限定」のため、無効だと全ファイルが選択可能となる!
' 注. list(0) 「ディレクトリの(POSIX)フルパス」を格納
' list(1) 「ファイル名(拡張子あり)」を格納
Dim scriptResult As String ' AppleScript 実行結果 (文字列)、区切り文字 LF
Dim scriptParam As String ' AppleScript パラメータ(文字列)、区切り文字 LF
Dim list() As String ' 「フルパス」格納用として「文字列の配列」を定義
' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
' パラメータの区切り文字には、Macの改行コード(vbLf)を指定
' scriptParam = "単一ファイル選択!" & vbLf & "/Users/username/" & vbLf & LCase("xml")
scriptParam = "" & vbLf & "" & vbLf & LCase("css") & vbLf & LCase("js")
scriptResult = AppleScriptTask("filePath.scpt", "getFilePath", scriptParam)
If scriptResult <> "" Then '「キャンセル」ボタン押下時も、空文字列が返る
list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
Call DispArray(list) '実行結果(文字列)の表示
Erase list '配列の初期化
Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
End If
End Sub
Sub test32()
'「複数」ファイル選択ダイアログで、フルパスを取得(拡張子限定あり)
' パラメータ[1] プロンプト文字列:""なら、AppleScriptコード設定の初期値
' パラメータ[2] 初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
' POSIXフルパス指定のため、先頭と末尾に / が必要 ex) "/Users/username/Downloads/"
' パラメータ[3〜n]ファイル拡張子:"css" "html"のように 複数限定可(厳密だと、UTIを4つまで)
' 厳密には「拡張子ではなくUTI限定」のため、無効だと全ファイルが選択可能となる!
' 注. list(0) 「ディレクトリの(POSIX)フルパス」を格納
' list(1〜n) 「ファイル名(拡張子あり)」を格納
Dim scriptResult As String ' AppleScript 実行結果 (文字列)、区切り文字 LF
Dim scriptParam As String ' AppleScript パラメータ(文字列)、区切り文字 LF
Dim list() As String ' 「フルパス」格納用として「文字列の配列」を定義
' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
' パラメータの区切り文字には、Macの改行コード(vbLf)を指定
' scriptParam = "複数ファイル選択!" & vbLf & "/Users/username/" & vbLf & LCase("xml")
scriptParam = "" & vbLf & "" & vbLf & LCase("css") & vbLf & LCase("js")
scriptResult = AppleScriptTask("filePath.scpt", "getMultiFilePath", scriptParam)
If scriptResult <> "" Then '「キャンセル」ボタン押下時も、空文字列が返る
list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
Call DispArray(list) '実行結果(文字列)の表示
Erase list '配列の初期化
Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
End If
End Sub
[command] + [Q] にてまず VBE を終了し、Excel のウィンドウ内を選択して [command] + [Q] にて Excel も終了させます。 「作業中のブック」を保存するか確認のダイアログ画面が表示された場合は 「保存」しましょう。 「自動保存」済みの場合、保存するかどうかの確認ダイアログ画面は表示されません。
AppleScriptTask コマンドの結果文字列(エラーがあれば、空文字 "" を返す)だけでなく、クリップボードにも同じ内容(改行コードは異なる)をセットしているため、必要があれば「片方のみ」に変更してください。
AppleScript から VBA に数百ファイル以上結果が返されるのであれば、大量データが渡されるオーバーヘッドも含め、クリップボードのみの利用(結果文字列は、正常終了/異常終了のみ判れば良い)がオススメです。 また、バックグラウンド処理前提の場合は 相互で クリップボードの中身を消してしまう可能性 があるため、結果文字列のみの利用が良いでしょう。
1日2時間くらい1.5ヶ月 AppleScript を勉強した成果として、今回の記事を書きました。 Cocoa AppleScript に関しては初心者のため、不具合があればコメント等で教えて頂けると嬉しいです。
Cocoa API を直利用したコード(Windows APIを直利用するようなもの)に書き替えたら、全件読み込み処理1回だけなら100倍程速くなる感じ。 ただ、並び順が不定のため "Finder" と同等の並び順にするだけで2回ソート(並び替え)処理が必要だったりしますが、それでも10倍以上の速度が出ます。 Vanilla 以上に Cocoa AppleScript は(プログラマーとして)敷居が高いため、C言語を経験した人でないとカスタマイズもできないのではと筆者は思います。 幸い、筆者は Objective-C の経験があったので... Cocoa だとエラー発生箇所も全く判らずデバッグが大変なため、有料の Script Debugger 必須だそうです!(買い切り100ドルで、メジャーアップデートなら半額の50ドル) ちなみに、VBA が組める人であれば Vanilla AppleScript のカスタマイズなら可能かと...
最後に、カスタマイズ無しで利用するだけなら 最低10倍は高速な Cocoa AppleScript は有用だと思います。 100% Cocoa 対応 AppleScript コードに変わるわけではないため、 Vanilla 部分のカスタマイズは問題無くできるはずです。
最後まで読んでいただき、ありがとうございます。 また、お越しくださいませ。
// アタル