워크시트_변경 하위 절차 중에 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
시트 이름은 필요하지 않습니다.시트 코드 모듈에서 무자격 범위 참조는 해당 시트를 참조합니다.그렇긴 하지만, 다음을 사용하는 것이 더 명확합니다.
Me
예선의다른 시트를 사용하려는 경우 해당 시트로 범위 참조를 한정합니다.사용자가 작업할 수 있습니다.
Worksheet_Change
이벤트, 항상 전환Off
셀에 데이터를 쓰는 경우 이벤트가 발생합니다.코드가 변경 이벤트를 다시 트리거하지 않고 가능한 무한 루프로 들어가지 않도록 하기 위해 필요합니다.이벤트를 끌 때마다 오류 처리를 사용하여 다시 켜십시오. 그렇지 않으면 오류가 발생하면 다음 번에 코드가 실행되지 않습니다.
사용해 보세요.
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
'programing' 카테고리의 다른 글
MVC3에서 Azure Blob 파일 다운로드하기 (0) | 2023.04.28 |
---|---|
레이블에 "_" 문자가 표시되지 않음 (0) | 2023.04.28 |
도커가 있는 Ubuntu WSL을 찾을 수 없습니다. (0) | 2023.04.28 |
Azure 가상 시스템 간의 공유 드라이브 (0) | 2023.04.28 |
Azure Git에 대한 인증 실패 (0) | 2023.04.28 |