Roy가 통합 문서를 열 때 Shift 키를 누르고 있으면 Excel은 Workbook_Open 이벤트를 포함하여 일반적으로 실행되는 “자동”매크로의 실행을 무시합니다. 그는 통합 문서를 닫을 때 Excel이 Workbook_BeforeClose 이벤트를 우회하도록하는 똑같이 쉬운 방법이 있는지 궁금합니다.

똑같이 쉬운 방법은 없습니다. 그렇다고해서 할 수 없다는 의미는 아니지만 “똑같이 쉽다”는 것은 일반적으로 “내장 된 것, 눌러야 할 키 또는 만들려는 설정”을 의미합니다. BeforeClose 이벤트를 우회하는 이러한 키 및 설정은 Excel에 기본 제공되지 않습니다.

할 수있는 작업은 특정 조건이 충족되면 이벤트 처리기 내의 코드가 무시되도록 BeforeClose 이벤트를 프로그래밍하는 방법을 조정하는 것입니다. 쉬운 방법은 특정 워크 시트 셀이 선택된 경우 다음과 같은 방식으로 코드를 무시하는 것입니다.

Private Sub Workbook_BeforeClose(Cancel As Boolean)

If ActiveCell.Address = "$Z$27" Then Exit Sub     '     ' Your normal code here...

' End Sub

이 경우 활성 셀 (BeforeClose 이벤트가 트리거 될 때 선택한 셀)이 Z27 셀이되면 이벤트 핸들러의 일반 코드를 건너 뜁니다. 다른 셀이 선택되어 있으면 건너 뛰지 않습니다. (나는 난해하고 모호하기 때문에 의도적으로 Z27 셀을 선택했습니다. 물론 원하는 다른 셀을 반영하도록 코드를 변경할 수 있습니다.)

Shift 키를 누르고 있는지 확인하는 데 문제가있는 경우 Windows API를 사용하여 수행 할 수 있습니다. 여기에는 모듈의 선언 영역에 일부 코드를 추가하는 것이 포함됩니다. 이것은 일반 모듈이 될 수 있습니다. ThisWorkbook 코드 창에있을 필요는 없습니다. 절차를 선언하기 전에 선언 영역에 있는지 확인하기 만하면됩니다.

#If VBA7 Then     Declare PtrSafe Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer #Else     Declare Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer #End If

#If VBA7 조건부 지시문이 사용되므로 Excel 2010 이상을 사용하는 경우 올바른 선언 구문이 사용되므로 프로그램의 32 비트 또는 64 비트 버전에서 오류가 발생하지 않습니다.

이제 BeforeClose 이벤트 핸들러 내에서 다음을 수행 할 수 있습니다.

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Const VSHIFT = &H10     Const SHIFTED = &H80

If GetKeyState(VSHIFT) And SHIFTED Then Exit Sub     '     ' Your normal code here...

' End Sub

BeforeClose 이벤트가 트리거 될 때 Shift 키를 누르고 있으면 BeforeClose 코드를 건너 뜁니다. Shift 키를 언제 누르고 있어야하는지 또는 충분히 길게 누르고 있는지 파악하기가 다소 어려울 수 있습니다. 이러한 이유로 셀을 선택하고 통합 문서를 닫은 다음 잊어 버릴 수 있으므로 “ActiveCell 확인”방식을 더 선호하는 경향이 있습니다.

_ExcelTips_는 비용 효율적인 Microsoft Excel 교육을위한 소스입니다.

이 팁 (2628)은 Microsoft Excel 2007, 2010, 2013 및 2016에 적용됩니다.