prosource

Excel VBA를 통해 셸 개체 / 명령 실행 중 오류 발생

probook 2023. 9. 10. 12:23
반응형

Excel VBA를 통해 셸 개체 / 명령 실행 중 오류 발생

VB 코드를 통해 C++ 프로그램을 실행하고 있는데 로컬 컴퓨터와 비교하여 공유 드라이브에서 코드를 실행하는 데 문제가 있습니다.제 프로그램은 일련의 가정을 생성한 다음 C++ 모델을 통해 이러한 가정을 실행한 다음 모델 출력을 선택하여 VB 워크북에서 볼 수 있도록 준비합니다.

C 드라이브의 로컬 디렉토리에 워크북을 저장하면 아래 코드가 정상적으로 작동하지만 회사 공유 드라이브에 업로드하면 다음 오류가 발생합니다.

"Run-time error '-2147024894(80070002)':개체 'Run' 메서드IWSHShell3' 실패"

코드:

'---------------------------------------------------------
' SECTION III - RUN THE MODEL AS C++ EXECUTABLE
'---------------------------------------------------------
Dim ModelDirectoryPath As String
Dim ModelExecutableName As String
Dim ModelFullString As String

' First build the command string
Application.StatusBar = "Running C++ Model..."

ModelDirectoryPath = Range("ModelFilePath").value
ModelExecutableName = Range("ModelFileName").value
ModelFullString = ModelDirectoryPath & ModelExecutableName
ModelFullString = ModelFullString & " " & ScenarioCounter & " " & NumDeals _
                  & " " & ModelRunTimeStamp & " " & Settle_YYMMDD

' Run the program
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1
Dim errorCode As Integer

errorCode = wsh.Run(ModelFullString, windowStyle, waitOnReturn)

If errorCode = 0 Then
    ' MsgBox "C++ Model Completed without Errors."
Else
    MsgBox "Program exited with error code " & errorCode & "."
End If

Application.StatusBar = "C++ Model Complete"

무슨 생각 있어요?

오류는 공백이 있는 디렉토리에서 발생합니다.

C:\Users\myname\this is my folder\myexe.exe

간단한 해결 방법으로 효과를 얻을 수 있습니다.

wsh.Run(Chr(34) & YourFullPathDirectoryWithSpaces & "\myexe.exe" & Chr(34))

Chr(34)두 개의 따옴표입니다.

에 문제가 있었습니다..Run두 줄짜리 특성을 취했습니다.

Excel 2010/Win32에서 테스트했습니다.

동일한 문제, 대체 솔루션이 있는 경우:

wsh.CurrentDirectory = exePath
wsh.Run(exeName & " " & cmdArgs, windowStyle, waitOnReturn)

셸의 CurrentDirectory 속성을 설정하는 키포인트

전체적으로 공간을 포함한 디렉토리 구조 때문에 문제가 발생한다고 판단했습니다.로컬 대 공유 디렉토리와 관련된 문제는 없는 것 같습니다.

만약 누군가가 그 안에 공간이 있는 디렉토리를 쉽게 둘러볼 수 있는 해결책을 알고 있다면, 저에게 알려주세요!

실행 중인 프로그램/스크립트에 둘 이상의 인수가 전달될 때만 문제가 발생하는 것 같습니다.

두 번째 인수에 공백이 있는 파일 경로가 포함되어 있으면 필요한 """"이 있는 경우에도 오류가 발생합니다.

이 시점에서 해결책을 찾을 수 없습니다...

경로에 공백이 있을 때 세 개의 따옴표를 설명하는 이 훌륭한 참조를 찾았습니다.아래 부분은 아래로 내리거나 움직일 경우를 대비한 부분입니다.

만약 당신이 파일을 열고 싶었다면

c:\My Files\Text File.txt그리고 당신의 껍질은 이것을 감싸도록 요구했습니다."", 그러면 당신은 이렇게 줄을 쓸 겁니다.

PID = Shell("notepad ""c:\My Files\Text File.txt""", vbNormalFocus)

실제 명령/스크립트 이름에 대해 지정해야 하는 경로도 마찬가지입니다.이 예제에서는 배치 파일(TextParser.bat)을 호출하여 텍스트 파일(TextFile.txt)을 처리합니다.

PID = Shell("""c:\My Scripts\Text Parser.bat"" ""c:\My Files\Text File.txt""", vbNormalFocus)

그 모든 것"""조금 이상해 보이지만 제가 설명을 해드릴게요.처음과 마지막"호출할 프로그램을 지정하는 문자열의 시작과 끝을 표시합니다. 여기에는 사용할 매개 변수, 스위치 및 파일이 포함됩니다.

"""c:\My Scripts\Text Parser.bat"" ""c:\My Files\Text File.txt"""면을 하면."우리에게는 두 개의 개별 문자열로 구성된 프로그램 문자열 자체가 남게 되는데, 하나는 path\batch 파일을 위한 것이고, 다른 하나는 batch 파일이 사용할 path\file을 위한 것입니다.

""c:\My Scripts\Text Parser.bat"" ""c:\My Files\Text File.txt""게배중가f중e 중 하나."서로는은어은는서어s로tsdoen .

"c:\My Scripts\Text Parser.bat" "c:\My Files\Text File.txt"일반적으로 구분되는 두 개의 문자열처럼 보입니다.

이 스레드는 오래되었지만 같은 문제를 우연히 발견하고 해결책을 생각해 냈습니다.

해당 명령을 C의 배치 파일에 넣을 코드를 작성합니다.\Temp...Shell or Wscript 그런 식으로.셸은 소화 가능한 "C:\Temp\thing.bat"을 인수로 사용합니다.

저한테 매력적으로 작용했습니다.:)

언급URL : https://stackoverflow.com/questions/21267283/error-running-shell-object-commands-through-excel-vba

반응형