我有一个 Excel 宏,要求用户选择两个“csv”文件,并且它必须在 MacOS 和 Windows 上运行。我研究了如何在 Mac 上使用 AppleScript 来实现此目的,但它没有按预期工作。这是我在脚本编辑器中测试的脚本“ChooseFiles.scpt”:
SelectFiles("csv")
on SelectFiles(fileType)
set fileNames to choose file with prompt "Please select before and after treatment csv files:" of type {fileType} with multiple selections allowed
return fileNames
end SelectFiles
选择两个文件的结果是有效的,尽管我不认识格式:
Result:
{alias "Untitled:Users:billw:Documents:Testing:CSV:01_06_2024_RowSur385589.csv",
alias "Untitled:Users:billw:Documents:Testing:CSV:11_04_2023_RowSur1823781.csv"}
这就是我在 VBA 代码中使用脚本的方式。 SelectedCSV 未使用 Dim 语句声明。
SelectedCSV = AppleScriptTask("ChooseFiles.scpt", "SelectFiles", "csv")
如果我只选择一个文件,SelectedCSV 包含 Variant/String 类型的有效文件名:
File:///Users/billw/Documents/Testing/CSV/01_06_2024_RowSur385589.csv
但是,当我选择两个文件时,SelectedCSV 仅包含一个空字符串。测试脚本的两个文件的列表似乎是某种数组。请告诉我需要在脚本本身或 Excel VBA 代码中修复什么,以便我得到两个文件而不是空字符串。
有2个问题:
要解决这个问题,您需要 2 个步骤:您需要强制 AppleScript 发回一个字符串(而不是列表)并强制 AppleScript 将 Finder 文件路径显式转换为 Unix 文件路径。 要将列表转换为字符串,我只需连接文件路径分隔符,但使用 ascii char 10。当返回到 VBA 时,您必须使用 Split 将该字符串转换为数组。
这是 AppleSrcipt:
on SelectFiles(fileType)
set fileNames to choose file with prompt "Please select before and after treatment csv files:" of type {fileType} with multiple selections allowed
set myList to {}
repeat with aFile in fileNames
set end of myList to POSIX path of aFile
end repeat
set text item delimiters to {ASCII character 10}
return myList as text
end SelectFiles
这是 VBA:
Sub Macro()
myscriptresult = AppleScriptTask("selectcvs.scpt", "SelectFiles", "csv")
myArray = Split(myscriptresult, Chr(10))
End Sub
警告:数组中的每一项都是文件的 Unix 路径,但只能从文件夹 /Users/...开始。在 VBA 中,您必须添加“File://”才能获取完整路径。