programing

워크시트_변경 하위 절차 중에 MS Excel이 충돌하고 닫히는 이유는 무엇입니까?

powerit 2023. 4. 28. 21:43
반응형

워크시트_변경 하위 절차 중에 MS Excel이 충돌하고 닫히는 이유는 무엇입니까?

엑셀 시트에서 VBA 코드를 실행할 때 엑셀 크래시 문제가 있습니다.
워크시트 변경에 다음 공식을 추가하려고 합니다.

Private Sub Worksheet_Change(ByVal Target As Range)
   Worksheets("testpage").Range("A1:A8").Formula = "=B1+C1"
End Sub

이 코드를 실행하면 "excel에 문제가 발생하여 닫아야 합니다"라는 메시지가 표시되고 excel이 닫힙니다.

여기에 이미지 설명 입력

의 코드를 실행하면Worksheet_Activate()절차, 잘 작동하고 충돌하지 않습니다.

Private Sub Worksheet_Activate()
   Worksheets("testpage").Range("A1:A8").Formula = "=B1+C1"
End Sub

하지만 저는 그것이 정말 필요합니다.Worksheet_Change()절차.

사용 중에 유사한 충돌을 경험한 사람이 있습니까?Worksheet_Change()이벤트와 이 문제를 해결하기 위한 올바른 방향을 가리킬 수 있는 사람이 있습니까?

사용할 때 이것을 추천합니다.Worksheet_Change

  1. 시트 이름은 필요하지 않습니다.시트 코드 모듈에서 무자격 범위 참조는 해당 시트를 참조합니다.그렇긴 하지만, 다음을 사용하는 것이 더 명확합니다.Me예선의다른 시트를 사용하려는 경우 해당 시트로 범위 참조를 한정합니다.

  2. 사용자가 작업할 수 있습니다.Worksheet_Change이벤트, 항상 전환Off셀에 데이터를 쓰는 경우 이벤트가 발생합니다.코드가 변경 이벤트를 다시 트리거하지 않고 가능한 무한 루프로 들어가지 않도록 하기 위해 필요합니다.

  3. 이벤트를 끌 때마다 오류 처리를 사용하여 다시 켜십시오. 그렇지 않으면 오류가 발생하면 다음 번에 코드가 실행되지 않습니다.

사용해 보세요.

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Whoa
    
    Application.EnableEvents = False
    
    Me.Range("A1:A8").Formula = "=B1+C1"
    
Letscontinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume Letscontinue
End Sub

이 이벤트를 사용할 때 알아야 할 몇 가지 다른 사항이 있습니다.

둘 이상의 셀이 변경되었을 때 코드가 실행되지 않도록 하려면 작은 체크 표시

Private Sub Worksheet_Change(ByVal Target As Range)
    '~~> For Excel 2003
    If Target.Cells.Count > 1 Then Exit Sub
    
    '
    '~~> Rest of code
    '
End Sub

CountLarge다음과 같은 이유로 Excel 2007 이후에 도입되었습니다.Target.Cells.Count반환합니다.Long총 셀 수 증가로 인해 Excel 2007에서 오류가 발생할 수 있는 값입니다.

Private Sub Worksheet_Change(ByVal Target As Range)
    '~~> For Excel 2007
    If Target.Cells.CountLarge > 1 Then Exit Sub
    '
    '~~> Rest of code
    '
End Sub

변경된 모든 셀에서 작업하려면 이 코드를 사용합니다.

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim aCell As Range
    
    For Each aCell In Target.Cells
        With aCell
            '~~> Do Something
        End With
    Next
End Sub

특정 셀의 변화를 탐지하려면 다음을 사용합니다.Intersect예를 들어 셀에서 변경이 발생한 경우A1그러면 아래 코드가 실행됩니다.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("A1")) Is Nothing Then
        MsgBox "Cell A1 was changed"
        '~~> Your code here
    End If
End Sub

특정 범위 집합의 변경을 탐지하려면 다음을 사용합니다.Intersect다시. 예를 들어, 범위에 변화가 발생하는 경우A1:A10그러면 아래 코드가 실행됩니다.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("A1:A10")) Is Nothing Then
        MsgBox "one or more Cells in A1:A10 range was changed"
        '~~> Your code here
    End If
End Sub

참고: 이전에 오류가 발생하여 위의 내용을 변경한 경우 코드가 여전히 작동하지 않으면 이벤트가 재설정되지 않았을 수 있습니다.에서Immediate Window,유형Application.EnableEvents = True키를 누릅니다.이렇게 하면 재설정됩니다.True Immediate Window바로 가기 G키 + 를 눌러 시작합니다.Immediate Window.

여기에 이미지 설명 입력

VBA 기능이 아닌 Excel이 충돌했습니다.
이벤트는 비활성화되지 않았으며 통화 스택은 OnChange 이벤트의 무한 루프로 채워졌습니다.
이러한 유형의 오류를 찾는 데 도움이 되는 약간의 조언: 이벤트의 첫 번째 줄에 중단점을 설정한 다음 F8을 눌러 단계적으로 실행합니다.

또한 이 솔루션은 좋습니다.

Option Explicit
Private Busy As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Busy Then
        Busy = True
        Range("A1:A8").Formula = "=B1+C1"
        Busy = False
    End If
End Sub

언급URL : https://stackoverflow.com/questions/13860894/why-ms-excel-crashes-and-closes-during-worksheet-change-sub-procedure

반응형