programing

Mac용 Office 2011의 VBA 셸 기능

javamemo 2023. 7. 9. 09:31
반응형

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 오류보다 문제 해결 중에 더 나은 통찰력을 제공할 수 있는 권장 사항입니다.

  1. AppleScript Editor를 사용하여 스크립트가 실제로 모든 사용자 및 사용되는 환경 변수로 작동하는지 확인합니다.

    1. Spotlight(스포트라이트)에서 "Applescript Editor(애플 스크립트 편집기)"가 표시될 때까지 입력한 다음 클릭합니다.
    2. 새 AppleScript Editor 파일 만들기
    3. 큰따옴표를 두 번 사용하지 않고 간단한 스크립트를 새 파일에 입력합니다(내 파일 읽기).

      do shell script "parseCsvAndOpen.sh"
      
    4. 스크립트의 "실행" 버튼을 누릅니다.
    5. AppleScript Editor에서 실행할 때까지 문제를 추적하고 변경한 후 "실행" 버튼을 반복합니다.
      • 여기서 좋은 소식은 StackOverflow 또는 Google로 돌아가서 도움을 받아야 할 경우 검색 범위가 좁다는 것입니다;-)
  2. 이제 AppleScript Editor에서 vba로 간단한 스크립트를 복사하고 여전히 작동하는지 확인합니다.

    1. 나는 맥스크립트 코드 뒤에 큰따옴표를 두 배로 묶을 수 있었습니다.

      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

반응형