VBA 워크시트 변경 이벤트 바이패스?
스프레드시트를 수정하고 있습니다.프로그래머는 시트를 바꿀 때 각 시트에 대해 매크로를 만들었습니다.이것은 새로운 정보가 추가될 때 시트 세부 정보를 컬러로 조정하기 때문에 좋습니다. 그래서 저는 이 기능을 유지하고 싶습니다.
저는 데이터를 정렬하고 신규 직원을 제거 및 추가할 수 있는 매크로를 작성했습니다. 이는 변경 이벤트 매크로와 충돌하며 둘 다 작동할 경우 매크로에 오류가 발생합니다.
Q. 매크로가 실행되는 동안 워크시트 변경 이벤트를 무시하고 매크로가 완료되면 다시 제자리에 두는 방법이 있습니까?
여기 변경 이벤트 코드가 있습니다.
Private Sub Worksheet_Change(ByVal target As Excel.Range, skip_update As Boolean)
If skip_update = False Then
Call PaintCell(target)
End If
End Sub
워크시트 또는 범위를 참조할 때 매크로에서 오류가 발생합니다.
내 생각에 당신은 그것을 원할 것입니다.EnableEvents
의 재산.Application
물건.설정할 때EnableEvents
False로 설정하면 코드가 수행하는 모든 이벤트가 트리거되지 않고 다른 이벤트 코드도 실행되지 않습니다.예를 들어 코드가 셀을 변경하면 일반적으로 변경 이벤트 또는 시트 변경 이벤트가 트리거됩니다.하지만, 이렇게 구성하면,
Application.EnableEvents = False
Sheet1.Range("A1").Value = "new"
Application.EnableEvents = True
그러면 A1을 변경하면 이벤트가 트리거되지 않습니다.
때로는 코드가 이벤트 코드를 트리거하는 것이 유리하지만 때로는 그렇지 않습니다.사용하다EnableEvents
당신이 그것을 예방하고 싶을 때.
이것은 @Dick Kusleika의 답변에 대한 중요한 수정입니다.
EnableEvents 설정을 해제할 때는 EnableEvents를 다시 설정하는 오류 처리를 포함하는 것이 좋습니다.그렇지 않은 경우 스크립트가 오류를 발생시키면 이벤트 사용을 수동으로 다시 설정할 때까지 변경 이벤트 트리거(스크립트)가 작동을 중지합니다.
이상적인 경우 변경 이벤트를 다시 트리거한 코드 바로 앞에 다음 줄을 배치합니다.첫 번째 줄은 VBA에 오류가 발생하면 "enableEventsOn"이라는 레이블로 이동하도록 지시합니다.두 번째 줄은 변경 이벤트를 바이패스합니다.
On Error Goto enableEventsOn:
Application.EnableEvents = False
그런 다음 변경 이벤트를 다시 트리거한 코드 바로 뒤에 이 코드를 배치합니다.이렇게 하면 변경 이벤트 트리거가 다시 활성화되고 스크립트에 일반 오류 처리가 반환됩니다.
Application.EnableEvents = True
On Error Goto 0
마지막으로 스크립트 끝에 이 코드를 배치합니다.위에 언급된 라벨입니다."On Error Got to enableEventsOn:"과 "On Error Got to 0" 사이에 오류가 발생하면 스크립트가 여기로 이동하고 EnableEvents를 다시 설정하여 다음에 워크시트를 변경할 때 스크립트를 시작할 준비가 됩니다.
EnableEventsOn:
Application.EnableEvents = True
제 생각에는 너무 위험합니다.
"skip_update"라는 변수를 사용합니다. 이 변수는 각 매크로의 시작 부분에서 "True"로 설정되고 종료되면 false로 설정됩니다.
예:
dim skip_update as Boolean = False
sub auto_macro_when_modify()
if skip_update == True then
exit sub ' NO CHANGE !
end if
end sub
sub other_macro
skip_update = True
' ( do stuff)
skip_update = False
end sub
이벤트 루틴의 변경을 트리거하는 항목을 수행하는 동안 CTRL 키를 누른 상태로 둘 수 있습니다.주어진 열에서 선택한 범위의 값을 합하는 루틴이 있습니다.커서를 1행에서 5행으로 끌어서 강조 표시하면 해당 행의 합계가 클립보드에 저장됩니다.이 열의 셀에 입력하면 루틴이 트리거됩니다.열에 있는 셀에서 의도한 작업이나 항목을 수행하는 동안 CTRL 키를 누른 상태로 있으면 루틴이 시작되지 않습니다.더 복잡한 ChangeEvent 시나리오에서는 작동하지 않을 수 있습니다.
언급URL : https://stackoverflow.com/questions/15761530/vba-worksheet-change-event-bypass
'programing' 카테고리의 다른 글
ASP.NET MVC용 RadioButtonListFor를 구현한 사람이 있습니까? (0) | 2023.06.13 |
---|---|
사용자 지정 게시물 유형 슬러그 충돌 (0) | 2023.06.13 |
Oracle SQL에서: 현재 날짜와 시간을 표에 어떻게 삽입합니까? (0) | 2023.06.13 |
Oracle에서 현재까지의 문자열(밀리초) (0) | 2023.06.13 |
Python pathlib은 존재하지 않는 디렉토리를 만듭니다. (0) | 2023.06.13 |