Mac용 Office 2011의 VBA 셸 기능
터미널 창에서 실행될 Mac용 Word 2011의 VBA 매크로에서 셸 스크립트를 실행하려고 합니다.셸 함수와 함수를 모두 사용해 보았지만, VBA 인터프리터는 두 경우 모두 스크립트를 찾을 수 없는 것 같습니다.
VBA 참조 문서에 따르면 다음이 작동해야 합니다.
RetVal = Shell("Macintosh HD:Applications:Calculator.app", vbNormalFocus)
그러면 런타임 오류 53 'File not found(파일을 찾을 수 없음)'가 발생합니다.
좋은 의견이라도 있나?
그Shell()
Mac에서 VBA 기능을 사용하려면 전체 경로가 HFS 스타일 경로(슬래시 대신 콜론 사용)로 필요한 것 같습니다.또한 Windows에서처럼 인수를 수락하지 않는 것 같습니다(인수가 추가된 경우 'Path not found(경로를 찾을 수 없음)' 오류 보고).
그MacScript()
: VBA 기같이사용수있습다니도할.MacScript("do shell script ""command""")
이것이 가장 간단한 선택사항일 가능성이 높고 제가 제안하고 싶은 것입니다.단점은 오버헤드가 상당히 많다는 것입니다(통화당 100-200ms).
다른 은 또다대은안입니다.system()
표준 C 라이브러리의 함수:
Private Declare Function system Lib "libc.dylib" (ByVal command As String) As Long
Sub RunSafari()
Dim result As Long
result = system("open -a Safari --args http://www.google.com")
Debug.Print Str(result)
End Sub
자세한 내용은 http://pubs.opengroup.org/onlinepubs/009604499/functions/system.html 을 참조하십시오.
system()
종료 코드만 반환합니다.명령에서출력가다사있수다습니용할음을면려져를 사용하면 .popen()
.
Private Declare Function popen Lib "libc.dylib" (ByVal command As String, ByVal mode As String) As Long
Private Declare Function pclose Lib "libc.dylib" (ByVal file As Long) As Long
Private Declare Function fread Lib "libc.dylib" (ByVal outStr As String, ByVal size As Long, ByVal items As Long, ByVal stream As Long) As Long
Private Declare Function feof Lib "libc.dylib" (ByVal file As Long) As Long
Function execShell(command As String, Optional ByRef exitCode As Long) As String
Dim file As Long
file = popen(command, "r")
If file = 0 Then
Exit Function
End If
While feof(file) = 0
Dim chunk As String
Dim read As Long
chunk = Space(50)
read = fread(chunk, 1, Len(chunk) - 1, file)
If read > 0 Then
chunk = Left$(chunk, read)
execShell = execShell & chunk
End If
Wend
exitCode = pclose(file)
End Function
Sub RunTest()
Dim result As String
Dim exitCode As Long
result = execShell("echo Hello World", exitCode)
Debug.Print "Result: """ & result & """"
Debug.Print "Exit Code: " & str(exitCode)
End Sub
참고로 다음 중 몇 가지는Long
위 예제의 인수는 포인터이므로 64비트 버전의 Mac Word가 출시되면 변경해야 합니다.
지금쯤이면 답을 찾으셨겠지만 전체 경로만 필요하시면 됩니다.
RetVal = Shell("Macintosh HD:Applications:Calculator.app:" & _
"Contents:MacOS:Calculator", vbNormalFocus)
또 다른 예는 다음과 같습니다.
RetVal = Shell("Macintosh HD:Users:brownj:Documents:" & _
"rnaseq:IGV_2.0.14:igv.sh", vbNormalFocus)
사용 권한으로 인해 AppleScript 환경과 사용자의 bash 환경 간의 차이로 인해 스크립트가 실패하는 문제가 발생합니다.이 Q&A는 제가 이 문제를 해결하는 데 도움이 되었습니다.스크립트가 작동하도록 하려면 경로 및 사용 권한 문제(스크립트 자체가 아니라 스크립트로 인해 발생하는 문제)를 해결해야 했습니다.
다음은 AppleScript Editor를 사용하기 전에 본 무의미한 Excel 오류보다 문제 해결 중에 더 나은 통찰력을 제공할 수 있는 권장 사항입니다.
AppleScript Editor를 사용하여 스크립트가 실제로 모든 사용자 및 사용되는 환경 변수로 작동하는지 확인합니다.
- Spotlight(스포트라이트)에서 "Applescript Editor(애플 스크립트 편집기)"가 표시될 때까지 입력한 다음 클릭합니다.
- 새 AppleScript Editor 파일 만들기
큰따옴표를 두 번 사용하지 않고 간단한 스크립트를 새 파일에 입력합니다(내 파일 읽기).
do shell script "parseCsvAndOpen.sh"
- 스크립트의 "실행" 버튼을 누릅니다.
- AppleScript Editor에서 실행할 때까지 문제를 추적하고 변경한 후 "실행" 버튼을 반복합니다.
- 여기서 좋은 소식은 StackOverflow 또는 Google로 돌아가서 도움을 받아야 할 경우 검색 범위가 좁다는 것입니다;-)
이제 AppleScript Editor에서 vba로 간단한 스크립트를 복사하고 여전히 작동하는지 확인합니다.
나는 맥스크립트 코드 뒤에 큰따옴표를 두 배로 묶을 수 있었습니다.
MacScript "do shell script ""parseCsvAndOpen.sh"""
그것은 정말로 하나, 둘, 그리고 세 개의 이중 따옴표입니다! (중따옴표 탈출)
64비트 Office를 사용하는 모든 사용자를 위해 32비트 및 64비트 버전과 호환되도록 Robert의 코드가 업데이트되었습니다.샌드박스의 변경으로 인해 libc에 대한 전체 경로가 선언에 사용되어야 합니다. 그렇지 않으면 OSX/Office never 버전에서 53 "File not found" 오류가 발생합니다.
#If Mac Then
#If VBA7 Then
' 64 bit Office:mac
Private Declare PtrSafe Function popen Lib "/usr/lib/libc.dylib" (ByVal command As String, ByVal mode As String) As LongPtr
Private Declare PtrSafe Function pclose Lib "/usr/lib/libc.dylib" (ByVal file As LongPtr) As Long
Private Declare PtrSafe Function fread Lib "/usr/lib/libc.dylib" (ByVal outStr As String, ByVal size As LongPtr, ByVal items As LongPtr, ByVal stream As LongPtr) As Long
Private Declare PtrSafe Function feof Lib "/usr/lib/libc.dylib" (ByVal file As LongPtr) As LongPtr
Private file As LongPtr
#Else
' 32 bit Office:mac
Private Declare Function popen Lib "libc.dylib" (ByVal command As String, ByVal mode As String) As Long
Private Declare Function pclose Lib "libc.dylib" (ByVal file As Long) As Long
Private Declare Function fread Lib "libc.dylib" (ByVal outStr As String, ByVal size As Long, ByVal items As Long, ByVal stream As Long) As Long
Private Declare Function feof Lib "libc.dylib" (ByVal file As Long) As Long
Private file As Long
#End If
Public Function execShell(command As String, Optional ByRef exitCode As Long) As String
file = popen(command, "r")
If file = 0 Then
Exit Function
End If
While feof(file) = 0
Dim chunk As String
Dim read As Long
chunk = SPACE(50)
read = fread(chunk, 1, Len(chunk) - 1, file)
If read > 0 Then
chunk = Left$(chunk, read)
execShell = execShell & chunk
End If
Wend
exitCode = pclose(file) ' 0 = success
End Function
#End If
논평을 하기에 충분한 포인트는 아니지만, 로빈 나이츠의 답변에 추가로 느껴보세요.물론 여전히 그에게 그리고 그를 위한 신용.
Excel 15.18(2015)의 경우open
에서 사용되는 통화system()
표준 C 라이브러리의 함수는 필요하지 않습니다.--args
키워드 더 이상:
Private Declare Function system Lib "libc.dylib" (ByVal command As String) As Long
Sub RunSafari()
Dim result As Long
result = system("open -a Safari http://www.google.com")
Debug.Print Str(result)
End Sub
이것은 잘 작동합니다.2011년에는 테스트하지 않았습니다.
언급URL : https://stackoverflow.com/questions/6136798/vba-shell-function-in-office-2011-for-mac
'programing' 카테고리의 다른 글
Oracle에서 AUTO_INCREMENT로 ID를 생성하는 방법은 무엇입니까? (0) | 2023.07.09 |
---|---|
sqlplus 원격 연결 제공 ORA-21561 (0) | 2023.07.09 |
django에서 그룹에 사용자 추가 (0) | 2023.07.09 |
(:임의)에 대한 코드 점화기의 라우팅 (0) | 2023.07.09 |
'JavaCompile' 유형 속성 'options.compilerArgumentProviders.apt$0.name '에 입력 또는 출력 주석이 없습니다.Gradle 7로 업그레이드한 후 오류 발생 (0) | 2023.07.09 |