본문 바로가기
카테고리 없음

[VBA] Pause and Resume 구현

by 일등미노왕국 2024. 6. 30.

오늘은  Doevents를 이용한 일시정지 및 재개를 구현해보려고 한다.

 

보통 우리는 Do문이나 반복문을 멈추기 위해서 Ctrl + Pause를 눌러서 코드 진행을 멈추기도 하는데 VBA를 잘 모르는 사람들은 잘못하게 되면 [응답없음]의 세계로 빠져버리게 된다. 

 

Excel VBA로 구현한 매크로 제어 시스템 상세 분석

  이 시스템은 매크로의 시작, 중지, 일시정지, 재개 기능을 제공하며, 사용자 인터페이스와 상호작용하는 방식으로 설계되었다.

 

1. 모듈 수준 변수 선언 

2. 메인 실행 함수: RunMacrosInSequence()

이 함수는 매크로의 주요 로직을 담당한다.

2.1 변수 초기화 및 설정

 

여기서는 필요한 변수들을 초기화하고 설정한다. 특히 btn1과 btn2는 시트 상의 버튼 도형을 참조하며, rngX는 B6 셀을 참조한다. StopExecution과 PauseExecution 플래그는 초기에 False로 설정한다.

2.2 버튼 상태에 따른 동작

함수는 버튼의 현재 텍스트에 따라 다르게 동작한다:

  1. "Start" 상태:
    • 버튼 텍스트를 "Stop"으로 변경하고 색상을 빨간색으로 설정
    • 메인 실행 루프 시작
  2. "Stop" 상태:
    • 버튼 텍스트를 "Start"로 변경하고 색상을 파란색으로 설정
    • 매크로 실행 중지 및 B6 셀 값 초기화
  3. "Pause" 상태:
    • 버튼 텍스트를 "Resume"으로 변경
    • 매크로 실행 일시 정지
  4. "Resume" 상태:
    • 버튼 텍스트를 "Pause"로 변경
    • 매크로 실행 재개

2.3 메인 실행 루프

 

이 루프는 매크로의 핵심 로직이다:

  • 외부 Do While 루프는 StopExecution이 True가 될 때까지 계속된다.
  • 내부 For 루프는 1부터 100000까지 카운트한다.
  • 각 반복마다 StopExecution과 PauseExecution 상태를 확인한다.
  • PauseExecution이 True일 경우, 내부 Do While 루프에서 대기한다.
  • rngX = i는 현재 카운터 값을 B6 셀에 표시한다.
  • DoEvents는 각 반복마다 사용자 입력을 처리할 수 있게 한다.

3. 보조 함수들

3.1 StopMacroExecution()

이 함수는 StopExecution 플래그를 True로 설정하여 매크로 실행을 중지한다.

3.2 PauseMacroExecution()

이 함수는 PauseExecution 플래그를 True로 설정하고 사용자에게 일시 정지 상태를 알린다.

3.3 ResumeMacroExecution()

이 함수는 PauseExecution 플래그를 False로 설정하여 매크로 실행을 재개한다.

 

더보기
Option Explicit
' 모듈 수준 변수 선언
Public StopExecution As Boolean    ' 실행 중지 플래그
Public PauseExecution As Boolean   ' 실행 일시중지 플래그
Public shp As Shape                ' 현재 작업 중인 도형 객체
Public shpText As TextFrame        ' 도형의 텍스트 프레임

Sub RunMacrosInSequence()
    Dim i As Long                  ' 루프 카운터
    Dim btn1 As Shape: Set btn1 = ActiveSheet.Shapes("btn1")    ' "btn1" 도형 참조
    Dim btn2 As Shape: Set btn2 = ActiveSheet.Shapes("btn2")    ' "btn2" 도형 참조
    Dim rngX As Range: Set rngX = [b6]    ' B6 셀 참조
    
    ' 실행 중지 및 일시중지 플래그 초기화
    StopExecution = False
    PauseExecution = False
    
    ' 호출된 도형을 가져옴
    Set shp = ActiveSheet.Shapes(Application.Caller)
    Set shpText = shp.TextFrame
    
    If shpText.Characters.Text = "Start" Then
        ' 도형의 텍스트를 "Stop"으로 설정하고 색상 변경
        btn2.TextFrame.Characters.Text = "Pause"
        shpText.Characters.Text = "Stop"
        shpText.Characters.Font.Color = vbRed
       
        ' 메인 실행 루프
        Do While Not StopExecution
            For i = 1 To 100000
                If StopExecution Then Exit For ' 루프 내에서 중지 여부 확인
                
                ' 일시중지 상태 확인 및 처리
                Do While PauseExecution
                    DoEvents ' 일시중지 상태에서 사용자 입력 처리
                    If StopExecution Then Exit Do ' 일시중지 중 중지 명령 확인
                Loop
                
                If StopExecution Then Exit For ' 일시중지 후 중지 명령 처리
                
                rngX = i  ' B6 셀에 현재 카운터 값 표시
                
                DoEvents  ' 사용자 입력 처리를 위해 제어권 반환
          
            Next i
        Loop
        
        MsgBox "매크로 실행이 중지되었습니다.", vbInformation
    
    ElseIf shpText.Characters.Text = "Stop" Then
        ' Stop 버튼 클릭 시 처리
        btn2.TextFrame.Characters.Text = "Pause"
        shpText.Characters.Text = "Start"
        shpText.Characters.Font.Color = vbBlue
        Call StopMacroExecution ' 매크로 실행 중지
        rngX = 0  ' B6 셀 값 초기화
    
    ElseIf shpText.Characters.Text = "Pause" Then
        ' Pause 버튼 클릭 시 처리
        If btn1.TextFrame.Characters.Text = "Start" Then Exit Sub
        shpText.Characters.Text = "Resume"
        Call PauseMacroExecution
    
    ElseIf shpText.Characters.Text = "Resume" Then
        ' Resume 버튼 클릭 시 처리
        shpText.Characters.Text = "Pause"
        Call ResumeMacroExecution
    
    End If
End Sub

' 실행을 중지하는 매크로
Sub StopMacroExecution()
    StopExecution = True
    ' MsgBox "매크로 실행이 곧 중지됩니다. 현재 실행 중인 작업이 완료된 후 중지됩니다.", vbInformation
End Sub

' 실행을 일시중지하는 매크로
Sub PauseMacroExecution()
    PauseExecution = True
    MsgBox "매크로 실행이 일시중지되었습니다. 재개하려면 [ Resume ] 버튼을 누르세요.", vbInformation
End Sub

' 실행을 재개하는 매크로
Sub ResumeMacroExecution()
    PauseExecution = False
    ' MsgBox "매크로 실행이 재개되었습니다.", vbInformation
End Sub

결론

이 코드는 Excel VBA를 사용하여 복잡한 매크로 제어 시스템을 구현한 좋은 예시다. 사용자 인터페이스와 상호작용하면서 매크로의 실행을 세밀하게 제어할 수 있다. 특히 DoEvents를 사용하여 긴 실행 중에도 사용자 입력을 처리할 수 있게 한 점이 인상적이다.

이러한 접근 방식은 장시간 실행되는 매크로나 사용자와의 상호작용이 필요한 복잡한 Excel 작업에 매우 유용할 수 있다.


오늘도 맛있는 코드 냠냠

 

테스트.xlsm
0.02MB

댓글