programing

VBA 워크시트 변경 이벤트 바이패스?

oldcodes 2023. 6. 13. 22:47
반응형

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물건.설정할 때EnableEventsFalse로 설정하면 코드가 수행하는 모든 이벤트가 트리거되지 않고 다른 이벤트 코드도 실행되지 않습니다.예를 들어 코드가 셀을 변경하면 일반적으로 변경 이벤트 또는 시트 변경 이벤트가 트리거됩니다.하지만, 이렇게 구성하면,

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

반응형