컴퓨터 공부/엑셀 & VBA

[엑셀vba] batch 파일을 만들어서 실행시키자!

도 박사 2020. 11. 19. 16:21
반응형

텍스트 파일 쓰기와 같은 방법으로 

 

배치(batch) 파일을 만들어보자

 

배치 파일은 cmd 명령어를 이용한 프로그래밍이라 할 수 있다.

 

간단히 ping 보내는 파일을 만들어보겠다.


1. 파일 생성 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Option Explicit
Sub Create_Batch_File()
 
    Dim FILE_Path As String
       
    FILE_Path = "C:\Users\S-PC-01\Desktop\test\ping.bat"
    
    Open FILE_Path For Output As #1
    
        Print #1"ping -t 8.8.8.8"
 
    Close #1
 
End Sub
cs

1) FILE_Path 변수에 파일확장자를 포함한 경로와 이름 모두 넣어준다.

 

2) Open FILE_Path For Output As #1  : FILE_Path 파일에 저장을 시작하겠단 의미(?) 

   * Output: 출력할 때 사용

   * Input: 읽어올 때 사용

 

3) Print #1, "ping -t 8.8.8.8" : 쌍따옴표 안에 파일에 출력할 내용 작성

 

4) Close #1 , 파일을 닫아주는 역할. 이 녀석이 없다면 파일이 계속 열려있는 상태임


2. 실행

실행 전 폴더에는 아무것도 없다
코드 실행 후 배치 파일 생성 완료!

 

?? 오류 인가?? 핑이 안가고 뭐 이런 경우가..

이게 왜 그런고하니 vba로 생성된 배치 파일로 ping 보낼땐 관리자 권한으로 실행되어야 했다..

 

혹시나 관리자 권한으로 실행해본 것이 저 오류의 원인을 알 수 있게해줬다.

 

그래서 핑은 넘어가고 다른 명령어들로 테스트를 해봤다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Option Explicit
Sub Create_Batch_File()
 
    Dim FILE_Path As String
       
    FILE_Path = "C:\Users\S-PC-01\Desktop\test\ping.bat"
    
    Open FILE_Path For Output As #1
        
        Print #1"@echo off"
        Print #1"hostname"
        Print #1"pause"
 
    Close #1
 
End Sub
cs

@echo off : 사용된 명령어는 보여주지 않고 명령어의 실행 결과만 보여줌

컴퓨터의 이름을 출력하는 명령어로 변경하고

Pause를 넣어둠으로써 자동으로 창이 꺼지지 않게 했다.

 

@echo off 있는 경우
@echo off 없는 경우

hostname, ipconfig, net share, net user 등 사용해본 결과 결과를 정상적으로 출력해줬다.

 

관리자 권한이 필요한 명령어를 제외하고 많은 명령어들을 제어할 수 있었다.


3.  생성된 파일 실행

 

위 코드에 한 줄만 작성하면 응용프로그램 실행을 할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Option Explicit
Sub Create_Batch_File()
 
    Dim FILE_Path As String
    Dim PID
    FILE_Path = "C:\Users\S-PC-01\Desktop\test\ping.bat"
    
    Open FILE_Path For Output As #1
        
        Print #1"ipconfig"
        Print #1"net user"
        Print #1"net share"
        Print #1"net accounts"
        
        Print #1"pause"
 
    Close #1
 
    PID = Shell(FILE_Path, vbNormalNoFocus)
    
End Sub
cs

두 줄 추가한 듯;;

 

Dim PID  :변수 선언

 

PID = Shell(FILE_Path, vbNormalNoFocus) :파일 실행

 

shell(파일경로+이름+확장자, 창 활성화 옵션)

shell의 두번째 파라미터에는 6가지 옵션이 있다.

1) vbhide  / 백그라운드로 실행 (작업표시줄에 표시 안됨)

2) vbMaxmizedFocus / 최대화 창으로 실행 (활성화o)

3) vbMinimizedFocus /최소화 창으로 실행(활성화o)

4) vbMinimizedNoFocus /최소화 창으로 실행 (활성화 x)

5) vbNormalFocus / 중간 크기로 실행 (활성화o)

6) vbNormalNoFocus / 중간 크기로 실행 (활성화 x)

 

활성화 o,x의 차이점은 다음 그림에서 볼 수 있다.

 

 

MinimizedNoFocus 활성화x

 

MinimizedFocus 활성화o

그리고 변수를 넣어준 이유는 Shell 함수가 그렇게 생겨먹은 놈이라서 어쩔수 없었다

 

Shell 함수는 실행 하고 마지막에 실행된 프로그램의 PID 값을 뱉어내는데

 

이걸 담아두기 위한 곳이 필요한 듯 하다

 

그냥 변수 암거나 넣어주면 된다.


 

반응형