2016-06-30 1 views
0

이것은 실제로 코드에 특정한 질문이 아니지만 호기심을 만족시키기위한 것 (향후 문제는 피하십시오)이므로 SO가 적합하다고 생각했습니다.Application.ScreenUpdating in Subroutine within Subroutine

내 질문의 근거는 다음과 같습니다. VBA는 Application.ScreenUpdating과 서브 루틴 내에서 호출되는 서브 루틴과 같은 다른 호출을 어떻게 처리합니까?

예를 들어 설명하기 위해 나는 매우 빠르게 액티브 시트의 데이터를 가져 와서 같은 이름의 "숨겨진 시트"에 복사하는 방법을 사용했습니다 (이 기능을 사용하여 사용자에게 제공합니다). 서브 루틴의 동작을 취소하기 위해 일반적인 방법을 사용할 수 없으므로 "실행 취소"매크로). BackupData에서 ScreenUpdating을 False 및 True로 전환하면 최종 사용자가 작업을 완전히 숨길 수 있습니다. 질문의 문제는 사용자에게 매크로 실행에 대한 무료 액세스 권한을 부여하지만 ScreenUpdating 속성을 토글하는 다른 매크로에서도 호출하도록 선택했기 때문에 발생합니다.

그래서, BackupData 경우에 따라서 나머지를 떠나 BackupData 호출이 True 재정에 "외부"루틴의 호출을 속성을 설정하는 것, 매크로 False로 ScreenUpdating 속성을 전환했다고 후 매크로 내에서 호출 해당 매크로를 화면 업데이트로 실행하려면?

지금 당연히이 문제에 대한 많은 쉬운 해결책이 있다는 것을 알고 있습니다. 만약 ScreenUpdating이 이미 거짓인지를 확인한 다음 그 값이 참이라면에 부울 값을 저장할 수 있습니다. 또는 BackupData을 실행 한 후에 ScreenUpdating = False 호출을 반복하거나 심지어 동일한 서브를 BackupData에 쓸 수도 있습니다. 이 매크로에서 실행되는 값을 토글하지는 않지만이 문제의 요점은 그 해결책을 찾는 것이 아닙니다.

내 생각에 이것은 VBA가 중첩 된 서브 루틴 호출과 함께 작동하는 방법에 대한 질문이지만 VBA가이 문제를 저에게 처리 할 것인지 또는 궁금한 점이 있을지에 대한 확실한 답을 얻을 수 있습니다. afforred 해결 방법 중 하나를 사용해야하는 경우.

TL, 나는 이미 일한 많은 옵션이 있기 때문에 DR

나는, 해결 솔루션을 찾고 있지 않다. 나는 누군가가 VBA가 이러한 종류의 호출 (정확히 ScreenUpdating 속성뿐만 아니라 다른 응용 프로그램 속성에도 해당되지 않음)을 정확히 처리하는지 궁금해합니다.

+0

가장 일반적인 추측은 전체 응용 프로그램을 참조하는 '응용 프로그램'이라는 단어입니까? 그래서 모든 통합 문서, 모든 하위 또는 부모 루틴에 적용되는 응용 프로그램 수준의 메서드를 호출하기 때문에 범위를 지정하는 것이 중요하지 않습니다. –

답변

3

Application.ScreenUpdating는 애플리케이션의 설정 및/활성화 설정하고 반환하기에 전체적으로 비활성화된다. 그런 다음, 서브 루틴에서 False를 설정하면

귀하의 가정이 점에서 올바른지 루틴 호출을 다시 다음이 True 호출자에게 범위를 반환하기 전에, ScreenUpdating가 호출의 나머지 다음 True 인 설정 거짓으로 설정 BackupData을 서브 루틴.

글로벌 스코프가있는 변수로 생각하십시오. 그것이 설정된 곳마다, 그 값은 세계적으로 설정됩니다.이 값은 프로그램 인스턴스에서 열려있는 모든 통합 문서에 대한 부모 개체 인 Application 수준에 대해 전체적으로 설정됩니다 (이 경우 excel.exe). 설정은 인스턴스의 모든 통합 문서에 영향을줍니다. 다른 excel.exe 프로세스가 실행 중이면 해당 인스턴스의 통합 문서에는 영향을주지 않습니다.

+0

감사합니다. Dave. 글로벌 범위를 가지고있는 것으로 생각하면 그것을 보는 좋은 방법입니다. SO가 허용하는 경우이 솔루션을 올바르게 표시 할 것입니다. – RGA

+0

전역 변수가 아닌 다른 통합 문서에도 영향을 미치기 때문에 전역 변수가 아닙니다. –

+0

동의 - 설명하려고 했으므로 (아마도 명확하지 않을 수 있습니다), 이는 'Workbooks'객체의 부모 인 'Application'의 전역 설정입니다. 따라서 'Excel.exe'인스턴스 내에있는 모든 통합 문서에 적용됩니다. 두 번째 'Excel.exe' 인스턴스가 열려 있으면 다른 인스턴스의 설정에 영향을주지 않습니다. – Dave

2

이것은 이와 같이 간단한 사용법입니다. screenupdating을 false로 설정하는 것보다 화면 업데이트의 이전 상태를 간단하게 저장할 수 있으며 screenupdating을 다시 설정하지 않으면 백업에서 복구됩니다. 따라서 화면이 이미 FALSE로 업데이트 된 경우 FALSE가됩니다.

Dim previousScreenUpdating as boolean 
previousScreenUpdating = application.screenUpdating 

application.screenUpdating = false 

// your code 

application.screenUpdating = previousScreenUpdating 
+0

내 질문을 전체적으로 읽으면 이미 이것을 해결책으로 제안했습니다. 아마도 SO는 질문을하기에 적합한 장소가 아니지만 해결 방법이 아니라 VBA의 기본 관행에 대한 답을 찾고 있습니다 – RGA