셸 명령이 완료될 때까지 기다립니다.
Excel VBA에서 다음과 같이 지정된 디렉토리에서 배치 파일을 실행하는 간단한 셸 명령을 실행하고 있습니다.
Dim strBatchName As String
strBatchName = "C:\folder\runbat.bat"
Shell strBatchName
일부 시스템에서는 배치 파일을 실행하는 데 시간이 오래 걸릴 수 있으며, 실행을 완료하기 위해 배치 파일에 종속된 진행 중인 VBA 코드가 있습니다.다음과 같이 대기 타이머를 설정할 수 있습니다.
Application.Wait Now + TimeSerial(0, 0, 5)
그러나 너무 느린 일부 컴퓨터에서는 작동하지 않을 수 있습니다.셸 실행이 완료될 때까지 나머지 VBA 코드를 진행하도록 Excel에게 체계적으로 지시할 수 있는 방법이 있습니까?
WScript 를 사용합니다.대신 셸을 사용합니다.waitOnReturn
옵션:
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1
wsh.Run "C:\folder\runbat.bat", windowStyle, waitOnReturn
(Shell이 완료될 때까지 기다린 후 셀 포맷 - 명령을 동기적으로 실행하는 아이디어)
다음 서브를 추가합니다.
Sub SyncShell(ByVal Cmd As String, ByVal WindowStyle As VbAppWinStyle)
VBA.CreateObject("WScript.Shell").Run Cmd, WindowStyle, True
End Sub
참조를 추가할 경우C:\Windows\system32\wshom.ocx
다음 항목도 사용할 수 있습니다.
Sub SyncShell(ByVal Cmd As String, ByVal WindowStyle As VbAppWinStyle)
Static wsh As New WshShell
wsh.Run Cmd, WindowStyle, True
End Sub
이 버전이 더 효율적일 것입니다.
배트 파일을 "C:\"에 저장합니다.WINDOWS\system32"로 동작하고 있는 코드 아래를 사용합니다.
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("runbat.bat", windowStyle, waitOnReturn)
If errorCode = 0 Then
'Insert your code here
Else
MsgBox "Program exited with error code " & errorCode & "."
End If
이게 내가 가지고 있던 거야VB
프로세스가 완료될 때까지 기다린 후 계속 진행합니다.나는 이것을 쓰지 않았고 신용을 받지 않는다.
다른 오픈 포럼에서 제공되어 매우 효과적입니다.
다음 선언이 필요합니다.RunShell
서브루틴:
Option Explicit
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const STATUS_PENDING = &H103&
'then in your subroutine where you need to shell:
RunShell (path and filename or command, as quoted text)
실행 명령어 괄호 변경으로 제안하신 내용은 VBA에서 정상적으로 동작했습니다.
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
wsh.Run "C:\folder\runbat.bat", windowStyle, waitOnReturn
셸을 객체에 링크하고 배치 작업을 통해 셸 개체(예: 셸 개체)를 종료하고 셸 개체 = 아무것도 없는 경우 VBA 코드가 계속되도록 합니다.
또는 VBA의 셸 명령에서 출력 값을 캡처할 수 있는지 확인하십시오.
새로운 wshell처럼 dim wsh
chdir "배치 파일 디렉토리"
wsh.run "배치 파일의 풀패스", vbnormalfocus, true
완료 아들
언급URL : https://stackoverflow.com/questions/15951837/wait-for-shell-command-to-complete
'programing' 카테고리의 다른 글
현재 PowerShell 프로세스가 32비트인지 64비트인지를 확인합니다. (0) | 2023.04.15 |
---|---|
로컬에서 일부 파일을 무시하도록 git을 설정하려면 어떻게 해야 합니까? (0) | 2023.04.10 |
C#에서는 문자열을 사용해야 합니까?[ Empty ]또는 [String]입니다.문자열을 초기화하려면 비워두시겠습니까? 아니면 " "? (0) | 2023.04.10 |
SQL Server: Null VS 빈 문자열 (0) | 2023.04.10 |
Swift에서 URL 인코딩 방법 (0) | 2023.04.10 |