2014-04-21 2 views
0

귀하가 제공 할 수있는 명확성에 대해 미리 감사드립니다. SHEET2의 VBA 코드의 맨 아래에 많은 모듈과 워크 시트와 Excel 통합 문서에서 '28'스택 공간이 부족합니다. Worksheet_Change 및 Application.ScreenUpdating

이 서브 루틴이 :

Private Sub Worksheet_Change(ByVal Target As Range) 

Dim TargetCells As Range 

Set TargetCells = Range("B1000:B1029") 

If Not Application.Intersect(TargetCells, Range(Target.Address)) Is Nothing Then 
    Call SpecificSubRoutine 
End If 

End Sub 

이 코드의 나의 이해는 어떤을 위해 전체 시트를 시계이다 변경. ANYTHING이 변경되면 시트의 아무 곳에서나 If 문을 실행합니다. 시트에 변경된 내용이 지정된 TargetCells 범위를 벗어나는 경우 If 문이 실패하지만이 Sub는 시트에서 아무 때나 변경되는 If 문을 계속 유효하게하려고합니다.

이제 내 문제가 스택 오버 플로우라고 추측 할 수 있습니다. (런타임 오류 '28': 스택 공간이 부족합니다) 시트에 변경 사항이 TargetCells 범위 안에 사항이있는 경우 Worksheet_Change 하위 실행은,이 세포를 채 웁니다 SpecificSubRoutine를 호출 할 때마다

Worksheet_Change 서브를 트리거 매번 SpecificSubRoutine은 모든 셀을 채 웁니다. 물론 Worksheet_Change Sub를 트리거하는 셀을 채우는 다른 모듈을 호출합니다 (SpecificSubRoutine)

좋지 않습니다.

또한, 응용 프로그램 전체 서브 루틴의 대부분은 즉시 Application.ScreenUpdating = True 실행 후, 나는 생각이 한 번에 호출 시간 Worksheet_Change의 수를 제한 할 실수하는 Application.ScreenUpdating = False/Application.ScreenUpdating = True에 싸여있다. 중요성의

참고 :어느 SpecificSubRoutine 않으며 의해 호출 된 서브 루틴의이 TargetCells 범위 내에서 세포를 채 웁니다. 나는 확실히 그 희미한 아니에요 ... 여기

내 질문은 :

  1. Worksheet_Change 서브를 트리거 무엇의 범위를 좁힐 수있는 방법이 있나요되도록 TargetCells 범위 트리거 만 변경 그것? (시트의 변경된 부분이 아닌)
  2. 내가 실수로 Application.ScreenUpdating이 할 것이라고 생각한 것을 할 수있는 방법이 있습니까? (거의 모든 단계에서 변경 사항을 트리거하는 것과 달리 시트 전체를 하나의 일괄 업데이트로 변경)
  3. 또한 호기심 때문에 Worksheet_Change에는 전체 시트 대신 2 개의 특정 범위를 감시하는 방법이 있습니다 ?)이 작업을 수행하는 방법을 아는 것이 무엇보다 중요하며이 시트의 모든 문제를 해결할 가능성이 높습니다.

내 직감 SpecificSubRoutine의 마지막 부분에 End을 추가하는 것입니다, 또는 말에/IT에 의해 호출 된 서브 루틴의 모든하지만 난 그냥이 Worksheet_Change 여러 통해 반복을 회피합니다 확실하지 않다 번, Application.ScreenUpdating 이후 내가 생각했던 것처럼 일괄 업데이 트되지 않습니다.

아이디어가 있으십니까?

+1

Worksheet_Change'과'Application.EnableEvents'의 beggining에 = 'FALSE'를 Application.EnableEvents 추가 = True' 결국 –

+0

@simoco, 이것은 훌륭한 포인터입니다. 감사! –

답변

1

1 부 : 아니요 - 이벤트 처리기가 시트의 모든 변경 사항에 응답합니다. 변경 사항에 응답하는 방식의 필터링은 처리기 자체에서 발생해야합니다.

제 2 부 : @simoco

3 부 (과 통합 simoco의 제안) 응답은 :

Private Sub Worksheet_Change(ByVal Target As Range) 

    Application.EnableEvents=False 

    If Not Application.Intersect(Me.Range("B1000:B1029"), Target) Is Nothing Then 
     Call SpecificSubRoutine 
    End If 

    If Not Application.Intersect(Me.Range("D1000:D1029"), Target) Is Nothing Then 
     Call SomeOtherSpecificSubRoutine 
    End If 

    Application.EnableEvents=True 

End Sub 
+0

여분의 마감 괄호를 제외하고,이 기능은 내가 원하는대로 작동합니다. 감사합니다. Tim. 범위를위한 이벤트 핸들러를 선언 할 방법이 있을지 궁금하다. 예를 들어, 'Worksheet_Change' 대신에'A1_Change'를 쓰면된다. –

+1

그건 내 대답의 "파트 1"에서 다룹니다. –

+0

나는이 사이트에서 얻는 모든 응답을 완전히 소중히 생각하기 때문에 "part 1"을 읽었습니다. VBA에 대해 잘 알고있는 사람에게는 충분히 이해할 만하다고 생각 합니다만, "그 변화에 대응하는 방법을 필터링하는 것은 핸들러 자체에서 발생해야합니다"는 말이되지 않습니다. 당신은'ByVal Target As Range' 부분을 특정 범위를보기 위해 변경하는 것에 대해 이야기하고 있습니까? 저는 현재 이벤트 핸들러에 대해 공부하고 있습니다. 따라서 이것이 개방형 질문이라면, 곧 내 대답을 찾을 수있을 것입니다. –

관련 문제