VBA 속도 개선 기본: ScreenUpdating/Calculation 설정 주의점

VBA 코드를 작성하다 보면 예상보다 실행 속도가 느려 답답했던 경험, 다들 있으실 거예요. 특히 데이터 양이 많거나 복잡한 계산이 포함된 엑셀 파일에서 VBA 매크로를 돌릴 때, 몇 분씩 기다려야 하는 상황은 업무 효율을 크게 떨어뜨리죠. 하지만 걱정 마세요! VBA 코드의 속도를 마법처럼 향상시킬 수 있는 몇 가지 핵심 설정이 있답니다. 바로 `Application.ScreenUpdating`과 `Application.Calculation` 프로퍼티를 제대로 활용하는 것인데요. 이 두 가지 설정만 잘 이해하고 적용해도 코드 실행 속도를 눈에 띄게 개선할 수 있어요. 이번 글에서는 이 두 가지 설정의 원리와 주의점, 그리고 실질적인 활용법까지 꼼꼼하게 알려드릴게요. 여러분의 VBA 코드를 한층 더 빠르고 효율적으로 만들어 보세요!

 

[이미지1 위치]

🚀 VBA 속도 개선의 핵심: ScreenUpdating과 Calculation

VBA(Visual Basic for Applications)는 마이크로소프트 오피스 애플리케이션의 기능을 자동화하고 확장하는 강력한 도구예요. 엑셀에서 복잡한 데이터 처리, 반복 작업, 맞춤형 기능 구현 등 다양한 작업을 VBA로 자동화할 수 있죠. 하지만 VBA 코드의 실행 속도는 사용자 경험과 직결되는 중요한 요소예요. 특히 대규모 데이터를 다루거나 복잡한 논리를 수행하는 매크로의 경우, 실행 속도가 느리면 업무 효율이 크게 떨어질 수 있어요. 다행히 VBA는 코드 실행 속도를 획기적으로 개선할 수 있는 몇 가지 프로퍼티를 제공해요. 그중에서도 가장 기본적이면서도 강력한 효과를 발휘하는 것이 바로 `Application.ScreenUpdating`과 `Application.Calculation`이에요. 이 두 가지 설정은 VBA 코드가 실행되는 동안 엑셀의 화면 업데이트와 자동 계산 과정을 제어함으로써 불필요한 리소스 소모를 줄여줘요. 마치 자동차 경주에서 불필요한 부품을 제거하고 엔진 성능을 최적화하는 것과 같다고 할 수 있죠. 이러한 설정을 올바르게 이해하고 적용하면, 느렸던 VBA 코드가 눈에 띄게 빨라지는 것을 경험할 수 있답니다. VBA 성능 최적화의 첫걸음은 바로 이 두 가지 프로퍼티를 제대로 아는 것에서 시작해요.

 

VBA는 1990년대 초 마이크로소프트 오피스 95와 함께 처음 등장했어요. 이후 오피스 제품군이 발전하면서 VBA 엔진 자체도 꾸준히 개선되었지만, `ScreenUpdating`과 `Calculation`과 같은 성능 최적화 기법은 초기부터 지금까지 VBA 개발에서 가장 중요하게 여겨지는 기본 원리로 자리 잡고 있어요. 현대에 와서는 데이터의 양이 기하급수적으로 늘어나고, 기업 환경에서 엑셀을 활용한 복잡한 데이터 분석 및 보고 자동화 수요가 증가하면서 이 두 가지 설정의 중요성은 더욱 커지고 있어요. 단순히 코드를 실행하는 것을 넘어, 어떻게 하면 빠르고 효율적으로 실행할 수 있을지에 대한 고민은 모든 VBA 개발자에게 필수적인 역량이 되었답니다.

 

이 프로퍼티들은 엑셀의 내부적인 작동 방식을 조정하여 VBA 코드의 실행 속도를 높여주는데, 이는 사용자에게는 훨씬 빠르고 부드러운 매크로 실행 경험으로 돌아오게 돼요. 특히 수많은 셀을 조작하거나 복잡한 수식이 많은 통합 문서에서는 이 설정들의 효과가 극대화됩니다. 따라서 VBA 코드를 작성할 때 이 두 가지 설정을 어떻게 활용하고, 또 어떤 점을 주의해야 하는지 정확히 이해하는 것이 중요해요. 이러한 기본적인 성능 최적화 기법을 숙지하는 것은 VBA 개발자의 생산성을 높이는 데 매우 큰 도움이 될 거예요.

 

이 글에서는 `ScreenUpdating`과 `Calculation` 프로퍼티의 기본 개념부터 시작해서, 각 프로퍼티가 속도 향상에 어떻게 기여하는지, 그리고 가장 중요한 주의사항과 실제 코드 적용 예시까지 상세하게 다룰 거예요. 또한, 최신 동향과 전문가들의 의견까지 포함하여 VBA 성능 최적화에 대한 종합적인 정보를 제공할 예정이니, VBA 코드를 더 빠르게 만들고 싶은 분이라면 끝까지 주목해 주세요!

VBA 성능 최적화의 기본 원리

VBA 코드가 느리게 실행되는 주된 이유는 엑셀이 화면을 업데이트하고 수식을 계산하는 데 상당한 리소스를 소모하기 때문이에요. 코드 한 줄이 실행될 때마다 엑셀은 화면에 변경 사항을 표시하고, 관련된 수식들을 다시 계산해야 할 수 있어요. 특히 셀 값이 수백, 수천 개 이상 변경되거나 복잡한 수식이 많이 포함된 엑셀 파일에서는 이러한 과정이 반복되면서 눈에 띄는 시간 지연을 유발해요. `ScreenUpdating`과 `Calculation` 프로퍼티는 바로 이 두 가지 병목 현상을 효과적으로 관리하여 코드 실행 속도를 크게 향상시키는 역할을 해요. 이 설정들을 통해 엑셀의 불필요한 작업을 최소화하고, VBA 코드 자체의 연산에 집중하도록 유도하는 것이죠. 마치 조용한 환경에서 집중해서 일하는 것이 더 효율적인 것처럼, VBA 코드도 불필요한 방해 없이 실행될 때 가장 빠르게 작동할 수 있어요.

 

이러한 최적화 기법은 엑셀의 내부적인 작동 방식을 건드리는 것이기 때문에, 사용법을 정확히 알지 못하면 오히려 예상치 못한 문제를 일으킬 수도 있어요. 따라서 각 프로퍼티의 역할과 올바른 사용법, 그리고 가장 중요한 설정 복원 방법에 대해 정확히 이해하는 것이 필수적이에요. 이 글을 통해 VBA 코드의 속도 개선에 대한 궁금증을 해소하고, 실제 업무에 바로 적용할 수 있는 실질적인 팁들을 얻어 가시길 바랍니다.

✨ ScreenUpdating: 화면 업데이트를 멈춰 속도를 높이다

`Application.ScreenUpdating` 프로퍼티는 VBA 코드가 실행되는 동안 엑셀 화면의 업데이트를 일시적으로 중지시키는 역할을 해요. 우리가 엑셀에서 셀의 값을 바꾸거나 서식을 적용하면, 엑셀은 변경된 내용을 화면에 즉시 반영하기 위해 화면을 다시 그려요. 이 과정은 텍스트, 숫자, 서식, 차트 등 시각적인 요소가 변경될 때마다 발생하며, 상당한 CPU 자원을 소모한답니다. 특히 매크로가 수백, 수천 번의 셀 조작을 수행한다면, 그만큼 화면 업데이트도 반복적으로 일어나면서 코드 실행 시간이 길어지게 돼요. `Application.ScreenUpdating = False`로 설정하면, 이 모든 화면 업데이트 과정이 중지돼요. 마치 영화를 편집할 때, 최종 결과물을 보기 전까지는 모든 장면을 일일이 화면에 띄우지 않고 편집하는 것과 비슷하죠. 코드가 완료된 후에야 비로소 최종 결과가 화면에 한 번에 표시되기 때문에, 시각적인 렌더링에 소모되는 시간을 크게 절약할 수 있어요.

 

이 설정의 효과는 특히 셀 값 변경, 서식 적용, 차트 생성, 도형 삽입/삭제 등 화면에 시각적인 변화를 주는 작업이 많은 VBA 코드에서 두드러지게 나타나요. 예를 들어, 10,000개의 셀에 값을 입력하고 특정 서식을 적용하는 작업을 한다고 가정해 볼게요. `ScreenUpdating`이 `True`인 상태에서는 10,000번의 화면 업데이트가 발생하지만, `False`로 설정하면 이러한 업데이트가 모두 생략되고 코드 실행이 끝난 후 결과만 한 번에 표시돼요. 그 결과, 코드 실행 시간이 몇 분에서 몇 초, 혹은 그 이하로 단축되는 놀라운 경험을 할 수 있죠. 마치 텍스트 편집기에서 코드를 실행하는 것처럼, 화면 깜빡임 없이 빠르게 작업이 완료되는 것을 볼 수 있어요. 이는 사용자 경험을 크게 향상시키고, 대용량 데이터를 처리하는 매크로의 효율성을 극대화하는 데 필수적인 요소랍니다.

 

하지만 이 설정은 코드 실행이 끝난 후 반드시 원래 상태인 `True`로 복원해야 한다는 점을 명심해야 해요. 만약 `False` 상태로 그대로 두면, 사용자는 이후에 엑셀에서 어떤 작업을 하더라도 화면이 업데이트되지 않아 정상적인 사용이 불가능해져요. 마치 TV 화면이 꺼진 채로 소리만 들리는 상황과 같다고 할 수 있죠. 따라서 `ScreenUpdating = False`로 설정했다면, 코드의 마지막 부분에서 `ScreenUpdating = True`로 되돌리는 코드를 반드시 추가해야 합니다. 이는 VBA 성능 최적화의 가장 기본적인 규칙 중 하나이며, 이를 지키지 않으면 엑셀이 오작동하는 심각한 문제를 야기할 수 있습니다.

 

이 설정은 엑셀의 사용자 인터페이스(UI) 업데이트를 제어하는 것으로, VBA 코드 자체의 연산 속도를 직접적으로 높이는 것은 아니지만, 엑셀이 화면을 그리는 데 사용하는 CPU 시간을 절약함으로써 결과적으로 코드 실행 시간을 단축시키는 효과를 가져온답니다. 따라서 반복적인 셀 조작, 대량 데이터 입력, 서식 변경 등 시각적 변화가 많은 매크로에는 이 설정을 반드시 적용하는 것이 좋습니다. 엑셀의 성능을 최대한 끌어내고 싶다면, `ScreenUpdating`을 끄는 것을 가장 먼저 고려해야 할 최적화 기법이라고 할 수 있어요.

ScreenUpdating 설정의 효과 및 주의점

`Application.ScreenUpdating = False` 설정은 엑셀의 화면 업데이트를 완전히 중지시켜요. 이는 텍스트, 숫자, 서식, 차트, 도형 등 엑셀 창에 표시되는 모든 시각적 요소의 변경이 일시적으로 멈추는 것을 의미해요. 코드 실행 중에 셀 값이 바뀌거나, 셀 서식이 변경되거나, 새로운 차트가 삽입되는 모든 과정이 화면에 그려지지 않게 되는 거죠. 이렇게 되면 엑셀은 화면을 다시 그리는 데 드는 시간과 CPU 자원을 절약할 수 있어요. 특히 대량의 데이터를 한 번에 처리하거나, 복잡한 서식을 일괄적으로 적용하는 매크로의 경우, 화면 업데이트가 수백, 수천 번 반복되면서 상당한 시간 지연이 발생할 수 있는데, 이 설정을 사용하면 이러한 지연을 근본적으로 해소할 수 있어요. 마치 영화 편집 과정에서 최종 결과물을 보기 전까지는 모든 장면을 일일이 화면에 띄우지 않고 편집하는 것처럼, 엑셀도 화면 업데이트를 생략함으로써 연산에만 집중할 수 있게 되는 것이죠. 그 결과, 코드 실행 시간이 눈에 띄게 단축되는 것을 경험할 수 있어요.

 

하지만 이 설정은 강력한 만큼 주의해서 사용해야 해요. 가장 중요한 주의사항은 **코드 실행이 완료된 후 반드시 `Application.ScreenUpdating = True`로 복원하는 것**이에요. 만약 `False` 상태 그대로 매크로가 종료되면, 사용자는 이후 엑셀에서 어떤 작업을 하더라도 화면이 업데이트되지 않는 비정상적인 상태를 경험하게 될 거예요. 셀에 값을 입력해도 보이지 않거나, 서식을 변경해도 적용되지 않는 등 엑셀을 정상적으로 사용할 수 없게 되는 거죠. 따라서 매크로 코드의 마지막 부분에는 반드시 설정 복원 코드를 추가해야 합니다. 또한, 코드 실행 중에 오류가 발생하여 매크로가 비정상적으로 종료될 경우에도 설정이 복원되지 않을 수 있으므로, 오류 처리 구문을 사용하여 이러한 상황에 대비하는 것이 매우 중요해요.

 

이 설정은 엑셀의 UI 렌더링 과정을 건너뛰게 하여 성능을 향상시키는 것이므로, 화면 업데이트가 거의 없는 단순한 계산이나 데이터 조회 작업에서는 그 효과가 미미할 수 있어요. 하지만 셀 값을 대량으로 변경하거나, 서식을 일괄 적용하거나, 새로운 객체(차트, 도형 등)를 생성하는 등 시각적인 변화가 많은 작업에서는 획기적인 속도 향상을 기대할 수 있습니다. 따라서 VBA 코드를 작성할 때는 작업의 성격을 파악하고, `ScreenUpdating` 설정을 적절히 활용하는 것이 효율적인 매크로 개발의 핵심이라고 할 수 있어요.

⚙️ Calculation: 불필요한 재계산을 막는 지혜

`Application.Calculation` 프로퍼티는 엑셀의 자동 계산 방식을 제어하는 역할을 해요. 엑셀 파일에는 수많은 수식이 포함될 수 있는데, 셀의 값이 변경될 때마다 엑셀은 해당 변경에 영향을 받는 모든 수식을 자동으로 다시 계산하려고 해요. 이러한 자동 계산 기능은 실시간으로 결과를 확인할 수 있어 편리하지만, VBA 코드로 대량의 데이터를 수정하거나 여러 셀의 값을 변경할 때는 불필요한 재계산이 반복되면서 심각한 성능 저하를 유발할 수 있어요. 예를 들어, 1000개의 셀에 값을 입력하는 코드를 실행할 때, `Calculation`이 `xlCalculationAutomatic` (자동 계산)으로 설정되어 있다면, 각 셀이 변경될 때마다 엑셀은 관련된 모든 수식을 다시 계산하려고 시도할 거예요. 이는 1000번의 재계산 시도를 의미하며, 수식이 복잡하다면 그 시간은 매우 길어질 수 있죠.

 

이 문제를 해결하기 위해 `Application.Calculation`을 `xlCalculationManual`로 설정할 수 있어요. 이렇게 하면 VBA 코드가 실행되는 동안 엑셀의 모든 자동 계산 기능이 비활성화돼요. 즉, 사용자가 VBA 코드를 통해 셀 값을 변경하더라도 엑셀은 더 이상 자동으로 수식을 다시 계산하지 않아요. 이는 불필요한 재계산 작업을 완전히 생략함으로써 코드 실행 속도를 크게 향상시켜 줍니다. 마치 시험 중에 감독관이 "이제부터 필산은 금지입니다"라고 말하는 것처럼, 엑셀에게 "코드 실행 중에는 계산하지 마"라고 지시하는 것과 같아요. 코드 실행이 완료된 후에 사용자가 명시적으로 계산을 실행시키기 전까지는 어떤 수식도 자동으로 업데이트되지 않죠. 따라서 대량의 데이터 수정이나 복잡한 계산이 포함된 매크로에서는 이 설정을 반드시 적용하는 것이 좋아요.

 

`Application.Calculation` 프로퍼티는 다음과 같은 세 가지 주요 값을 가질 수 있어요:

  • `xlCalculationAutomatic`: 기본 설정으로, 워크시트 변경 시 모든 수식이 자동으로 다시 계산돼요.
  • `xlCalculationManual`: 코드 실행 중 자동 계산을 비활성화해요. 사용자가 `Application.Calculate` 등을 호출해야만 계산이 실행돼요.
  • `xlCalculationSemiautomatic`: 워크시트 변경 시 수식이 자동으로 다시 계산되지만, 외부 데이터 원본이 변경될 때는 다시 계산되지 않아요.

 

VBA 코드 실행 속도를 최적화하기 위해서는 `xlCalculationManual`을 사용하는 것이 가장 효과적이에요. 하지만 `ScreenUpdating`과 마찬가지로, `xlCalculationManual`로 설정한 후에는 코드 실행이 완료되면 반드시 원래 설정(대부분 `xlCalculationAutomatic`)으로 복원해야 해요. 그렇지 않으면 사용자가 이후에 엑셀에서 수식을 변경해도 결과가 업데이트되지 않아 혼란을 겪을 수 있어요. 또한, `xlCalculationManual` 모드에서는 코드가 끝난 후 수동으로 계산을 실행해야 할 필요가 있을 수 있어요. 이를 위해 `Application.Calculate` 메서드를 코드 마지막 부분에 추가하는 것을 고려해야 합니다.

 

엑셀 파일에 수식이 많거나 복잡할수록 `Application.Calculation = xlCalculationManual` 설정의 효과는 더욱 커져요. 수백, 수천 개의 수식이 포함된 파일을 다룰 때, 매번 셀이 변경될 때마다 발생하는 재계산은 상당한 시간 지연을 유발할 수 있는데, 이 설정을 통해 이러한 불필요한 연산을 모두 제거할 수 있기 때문이죠. 이는 마치 복잡한 수학 문제를 풀 때, 중간 계산 과정을 모두 생략하고 최종 답만 구하는 것과 같다고 할 수 있어요. 물론, 실제로는 중간 계산 결과가 필요할 수도 있으므로, 상황에 맞게 `Application.Calculate`를 적절히 호출해주는 것이 중요하답니다.

Calculation 설정 시 고려사항

`Application.Calculation = xlCalculationManual` 설정은 VBA 코드 실행 중 발생하는 모든 자동 계산을 비활성화해요. 이는 엑셀 파일에 수식이 많거나 복잡할 때, 매번 셀 변경마다 발생하는 재계산으로 인한 시간 지연을 방지하여 성능을 크게 향상시키는 매우 효과적인 방법이에요. 예를 들어, 1000개의 셀에 데이터를 입력하거나 수정하는 작업을 할 때, 자동 계산 모드에서는 각 셀 변경 시마다 엑셀이 관련된 모든 수식을 다시 계산하려고 시도해요. 수식이 많거나 복잡하다면 이 과정은 상당한 시간이 소요될 수 있죠. 하지만 수동 계산 모드로 설정하면, 이러한 불필요한 재계산이 모두 생략되어 코드 실행이 훨씬 빨라져요. 마치 복잡한 계산을 해야 할 때, 중간 과정을 건너뛰고 최종 결과만 빠르게 얻는 것과 같아요.

 

하지만 이 설정을 사용하면서 가장 중요한 점은 **코드 실행이 완료된 후에는 수동으로 계산을 실행해야 한다는 것**이에요. `xlCalculationManual` 모드에서는 사용자가 명시적으로 계산을 지시하기 전까지는 어떤 수식도 자동으로 업데이트되지 않아요. 따라서 VBA 코드가 모든 작업을 마친 후, 사용자가 최종 결과를 확인하기 위해서는 수동으로 계산을 다시 활성화해야 해요. 이를 위해 `Application.Calculate` 메서드를 코드 마지막 부분에 추가하는 것이 일반적이에요. 이 메서드는 현재 열려 있는 모든 통합 문서의 변경된 수식을 다시 계산해줘요. 만약 모든 수식을 처음부터 다시 계산해야 한다면 `Application.CalculateFull` 메서드를 사용할 수도 있지만, 일반적으로는 `Application.Calculate`로 충분해요. 이처럼 수동 계산 모드를 사용한 후에는 반드시 필요한 시점에 계산을 실행해주는 것을 잊지 않아야 해요.

 

또한, `Application.Calculation` 설정은 엑셀 파일 자체의 계산 방식 설정과도 연관이 있어요. 사용자가 엑셀 옵션에서 계산 방식을 수동으로 설정해 놓았다면, VBA 코드에서 `Application.Calculation = xlCalculationAutomatic`으로 설정해도 기본 설정으로 돌아가지 않을 수 있어요. 따라서 가장 안전한 방법은 코드 실행 전에 현재의 계산 모드를 변수에 저장해두었다가, 코드 실행 후 원래 저장된 설정으로 복원하는 것이에요. 예를 들어, `Dim originalCalculation As XlCalculation` 변수를 선언하고 `originalCalculation = Application.Calculation`으로 현재 설정을 저장한 뒤, `Application.Calculation = originalCalculation`으로 복원하는 방식이죠. 이 방법을 사용하면 사용자가 엑셀을 어떻게 설정했든 간에 원래 상태로 깔끔하게 되돌릴 수 있어요.

 

결론적으로, `Application.Calculation = xlCalculationManual` 설정은 VBA 코드의 속도를 크게 향상시키는 강력한 도구이지만, 코드 실행 후 수동 계산을 잊지 않고, 원래 설정으로 정확하게 복원하는 것이 중요해요. 이 두 가지 사항만 잘 지킨다면, 복잡한 수식이 많은 엑셀 파일에서도 훨씬 빠르고 효율적인 매크로를 만들 수 있을 거예요.

⚠️ 실행 전후 설정 복원의 중요성 (오류 발생 시에도!)

VBA 코드의 성능을 최적화하기 위해 `Application.ScreenUpdating = False`나 `Application.Calculation = xlCalculationManual`과 같은 설정을 변경하는 것은 매우 효과적이에요. 하지만 이 설정들을 사용함에 있어서 가장 중요하고도 절대적으로 지켜야 할 원칙이 있어요. 바로 **코드 실행이 완료된 후에는 반드시 변경했던 설정을 원래 상태로 복원하는 것**이에요. 만약 설정을 복원하지 않고 코드가 종료되면, 엑셀은 해당 설정이 영구적으로 적용된 것처럼 작동하게 돼요. 예를 들어, `ScreenUpdating`을 `False`로 둔 채로 매크로가 끝나면, 사용자는 이후 엑셀에서 어떤 작업을 하더라도 화면이 업데이트되지 않아 정상적인 사용이 불가능해져요. 이는 마치 TV 화면이 꺼진 채로 소리만 나는 상황과 같죠. 마찬가지로 `Calculation`을 `xlCalculationManual`로 둔 채로 끝나면, 사용자가 아무리 셀 값을 바꿔도 수식이 업데이트되지 않아 잘못된 결과를 보게 될 수 있어요.

 

이러한 복원 과정을 더욱 중요하게 만드는 것은 바로 **오류 발생 시**예요. VBA 코드가 실행되는 동안 예상치 못한 오류가 발생하면, 코드는 중단되고 설정 복원 코드가 실행되지 못한 채로 종료될 수 있어요. 이렇게 되면 엑셀은 비정상적인 상태에 머무르게 되고, 사용자는 큰 불편을 겪게 되죠. 이를 방지하기 위해 VBA에서는 `On Error` 구문을 활용한 오류 처리 메커니즘을 제공해요. 가장 권장되는 방법은 `On Error GoTo`를 사용하여 특정 오류 처리 루틴으로 이동하도록 하는 것이에요. 이 루틴 안에서 `ScreenUpdating`, `Calculation`, `EnableEvents` 등 변경했던 모든 설정을 원래대로 복원하는 코드를 작성하는 거죠. 이렇게 하면 정상적으로 코드가 종료되든, 오류로 인해 중단되든 상관없이 항상 설정이 안전하게 복원될 수 있어요.

 

예를 들어, 다음과 같은 구조를 사용할 수 있어요:

Sub MyFastMacro()

    Dim originalCalculation As XlCalculation

    ' 성능 향상을 위한 설정
    Application.ScreenUpdating = False
    originalCalculation = Application.Calculation ' 현재 계산 모드 저장
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    ' 오류 발생 시 복원 프로시저로 이동
    On Error GoTo RestoreSettings

    ' --- 여기에 실제 VBA 코드 작성 ---
    ' (이 부분에서 오류가 발생할 수 있습니다)
    ' ---------------------------------

    ' 정상 완료 시 복원 및 종료
    GoTo Cleanup

RestoreSettings:
    ' 오류 발생 시 복원
    MsgBox "오류가 발생했습니다. 설정을 복원합니다.", vbCritical
    ' 오류 처리 로직 추가 가능 (예: 오류 로그 기록)

Cleanup:
    ' 설정 복원 (오류 발생 여부와 관계없이 항상 실행)
    Application.ScreenUpdating = True
    Application.Calculation = originalCalculation ' 저장된 원래 설정으로 복원
    Application.EnableEvents = True

    ' 정상 완료 시 메시지 표시
    If Err.Number = 0 Then
        MsgBox "작업이 완료되었습니다!"
    End If

End Sub

 

위 코드에서 `On Error GoTo RestoreSettings`는 코드 실행 중 오류가 발생하면 `RestoreSettings` 레이블로 이동하라는 의미예요. 그리고 `GoTo Cleanup`은 오류 없이 정상적으로 코드가 실행되었을 때 `Cleanup` 레이블로 이동하여 설정을 복원하라는 의미죠. `RestoreSettings`와 `Cleanup` 레이블 아래에 있는 복원 코드는 오류 발생 여부와 관계없이 항상 실행되도록 설계되어 있어요. 이를 통해 어떤 상황에서도 엑셀이 정상 상태를 유지하도록 보장할 수 있습니다.

 

설정 복원은 단순히 `ScreenUpdating`과 `Calculation`뿐만 아니라 `Application.EnableEvents`나 `Application.DisplayAlerts` 등 다른 성능 최적화 설정을 사용했을 때도 마찬가지로 중요해요. 이러한 설정들을 변경했다면, 코드의 마지막 부분이나 오류 처리 루틴에서 반드시 원래 상태로 되돌려 놓아야 합니다. 이는 VBA 개발자가 지켜야 할 가장 기본적인 원칙이며, 이를 통해 사용자는 쾌적하고 안정적인 엑셀 환경을 유지할 수 있게 됩니다.

오류 처리와 설정 복원 전략

VBA 코드 실행 중 오류가 발생하는 것은 흔한 일이에요. 데이터 형식 오류, 존재하지 않는 파일 참조, 잘못된 범위 지정 등 다양한 원인으로 인해 매크로가 예기치 않게 중단될 수 있죠. 만약 오류가 발생했을 때 `ScreenUpdating`이나 `Calculation` 설정을 복원하는 코드가 실행되지 않으면, 엑셀은 비정상적인 상태에 머무르게 되어 사용자가 큰 불편을 겪게 돼요. 이를 방지하기 위해 VBA는 강력한 오류 처리 기능을 제공하며, 특히 `On Error GoTo` 구문을 활용하는 것이 가장 안전하고 효과적인 방법이에요. 이 구문을 사용하면, 코드 실행 중 오류가 발생했을 때 미리 정의해 둔 특정 레이블(프로시저 또는 코드 블록)로 실행 흐름을 이동시킬 수 있어요. 이 레이블 아래에 모든 성능 최적화 설정을 원래대로 복원하는 코드를 배치하면, 오류 발생 시에도 설정이 안전하게 복원되는 것을 보장할 수 있답니다.

 

예를 들어, `ErrorHandler`라는 레이블을 만들고 그곳에 설정 복원 코드를 넣는 방식이에요. 코드가 정상적으로 완료되었을 때는 `Exit Sub` 문을 사용하여 오류 처리 루틴을 건너뛰고 프로시저를 종료하며, 오류가 발생했을 때만 `ErrorHandler` 레이블로 이동하여 설정을 복원하고 필요한 후속 조치를 취하게 하는 거죠. 이처럼 `On Error GoTo`를 사용하면, 오류 발생 가능성을 염두에 두고 코드를 작성할 수 있으며, 어떤 상황에서도 엑셀 환경을 안정적으로 유지할 수 있어요. 이는 단순히 코드 실행 속도를 높이는 것을 넘어, 사용자에게 안정적인 경험을 제공하는 프로페셔널한 VBA 개발의 필수 요소라고 할 수 있습니다.

 

또 다른 중요한 복원 전략은 현재 설정 값을 미리 변수에 저장해 두는 것이에요. 예를 들어, `Application.Calculation`은 사용자가 엑셀 옵션에서 `xlCalculationAutomatic` 외에 `xlCalculationSemiautomatic` 등으로 설정해 두었을 수도 있어요. 단순히 `Application.Calculation = xlCalculationAutomatic`으로 복원하면 사용자의 원래 설정을 덮어쓰게 되는 거죠. 이를 방지하기 위해 코드 시작 부분에서 `Dim originalCalculation As XlCalculation`과 같이 변수를 선언하고 `originalCalculation = Application.Calculation`으로 현재 설정을 저장해둡니다. 그런 다음, 코드 종료 시 또는 오류 발생 시 `Application.Calculation = originalCalculation`과 같이 저장해 둔 원래 설정으로 복원하는 것이 가장 안전하고 권장되는 방법이에요. 이 방법을 사용하면 사용자의 엑셀 환경 설정을 존중하면서도 성능 최적화를 안전하게 수행할 수 있답니다.

 

결론적으로, VBA 코드에서 성능 최적화를 위해 설정을 변경했다면, **반드시 코드의 정상 종료 경로와 오류 발생 경로 모두에서 해당 설정을 원래대로 복원하는 코드를 포함**해야 해요. `On Error GoTo` 구문을 활용하여 오류 처리 루틴을 만들고, 현재 설정 값을 변수에 저장하여 복원하는 전략은 안정적이고 신뢰할 수 있는 VBA 코드 작성을 위한 필수적인 습관입니다.

💡 추가적인 성능 최적화 기법

`ScreenUpdating`과 `Calculation` 설정 외에도 VBA 코드의 실행 속도를 더욱 향상시킬 수 있는 몇 가지 추가적인 기법들이 있어요. 이러한 기법들을 함께 사용하면 성능 최적화 효과를 극대화할 수 있답니다. 첫 번째로 고려할 만한 것은 `Application.EnableEvents` 프로퍼티예요. 이 프로퍼티를 `False`로 설정하면, VBA 코드가 실행되는 동안 워크시트나 통합 문서에서 발생하는 모든 이벤트(예: `Worksheet_Change`, `Workbook_Open`, `Workbook_BeforeSave` 등)의 실행을 일시적으로 중지시킬 수 있어요. 만약 이벤트 프로시저가 복잡하거나 실행 속도가 느리다면, 이 설정이 성능 향상에 큰 도움이 될 수 있어요. 예를 들어, `Worksheet_Change` 이벤트가 셀 변경 시마다 실행되면서 추가적인 계산이나 조작을 수행한다면, `EnableEvents = False`로 설정하면 이러한 불필요한 이벤트 실행을 막을 수 있죠. 물론 이 설정도 코드 종료 시에는 반드시 `True`로 복원해야 해요.

 

두 번째로 유용한 설정은 `Application.DisplayAlerts` 프로퍼티예요. 이 프로퍼티를 `False`로 설정하면, 엑셀에서 발생하는 모든 경고 메시지(예: "파일을 저장하시겠습니까?", "선택한 항목을 삭제하시겠습니까?" 등)가 화면에 표시되지 않아요. 이러한 경고 메시지는 사용자 입력을 기다리기 때문에 코드 실행을 일시적으로 중단시키며, 매크로가 대량의 데이터를 처리하거나 자동으로 파일을 저장하는 등의 작업을 할 때 불필요한 지연을 유발할 수 있어요. `DisplayAlerts = False`로 설정하면 이러한 경고 메시지 없이 코드가 연속적으로 실행되어 전반적인 속도 향상에 기여할 수 있습니다. 역시 코드 종료 후에는 `True`로 복원하는 것을 잊지 말아야 해요.

 

세 번째로, `Application.StatusBar` 프로퍼티를 활용하는 것도 고려해 볼 만해요. 엑셀 창 하단의 상태 표시줄에 진행 상황 메시지를 표시하면 사용자가 매크로가 얼마나 진행되었는지 파악하는 데 도움이 돼요. 하지만 `ScreenUpdating`을 `False`로 설정하면 상태 표시줄 업데이트도 영향을 받을 수 있어요. `Application.StatusBar`를 `False`로 설정하면 상태 표시줄 업데이트 자체를 비활성화하여 미미하지만 성능 향상 효과를 얻을 수 있고, 코드 종료 후에는 원래 상태 메시지로 복원해주는 것이 좋아요. 또한, 사용자 인터럽트(Ctrl+Break)를 비활성화하는 `Application.EnableCancelKey = xlDisabled` 설정도 있어요. 이 설정은 매우 긴 코드를 실행할 때 사용자가 실수로 코드를 중단시키는 것을 방지하는 데 유용할 수 있지만, 사용자에게 코드 중단 방법을 제공하지 않으므로 매우 신중하게 사용해야 하며, 코드 종료 시 `xlInterrupt`로 복원해야 합니다.

 

이러한 추가적인 최적화 기법들은 `ScreenUpdating`과 `Calculation` 설정만큼 극적인 성능 향상을 가져오지는 않을 수 있지만, 함께 사용하면 전체적인 코드 실행 속도를 더욱 끌어올리는 데 기여할 수 있어요. 중요한 것은 이러한 설정들을 변경했을 때는 항상 코드의 마지막 부분이나 오류 처리 루틴에서 원래 상태로 복원하는 것을 잊지 않는 것이에요. 이를 통해 엑셀을 안정적으로 사용하면서도 VBA 코드의 성능을 최대한으로 끌어낼 수 있습니다.

ScreenUpdating, Calculation 외 추가 최적화 기법

VBA 코드의 성능을 개선하기 위해 `Application.ScreenUpdating`과 `Application.Calculation` 외에도 몇 가지 유용한 프로퍼티들이 있어요. 이들을 함께 활용하면 더욱 강력한 성능 최적화가 가능하답니다. 첫 번째는 `Application.EnableEvents`예요. 이 설정을 `False`로 바꾸면, VBA 코드가 실행되는 동안 발생하는 모든 이벤트 프로시저(예: `Worksheet_Change`, `Workbook_Open`, `Workbook_BeforeSave` 등)의 실행을 일시적으로 막을 수 있어요. 만약 코드 실행 중에 불필요하게 트리거되는 이벤트 프로시저가 있다면, 이 설정으로 성능 저하를 막을 수 있죠. 예를 들어, 특정 셀 값을 변경할 때마다 자동으로 실행되는 `Worksheet_Change` 이벤트가 복잡한 계산을 수행한다면, `EnableEvents = False`로 설정하여 이 과정을 건너뛰게 할 수 있어요. 물론, 코드 실행이 끝난 후에는 반드시 `True`로 복원해야 합니다.

 

두 번째는 `Application.DisplayAlerts`예요. 이 설정은 엑셀에서 발생하는 각종 경고 메시지(예: 파일 저장 시 덮어쓰기 확인, 데이터 삭제 확인 등)를 숨기는 역할을 해요. 이러한 경고 메시지는 사용자 입력을 기다리게 하므로, 매크로가 자동으로 파일을 저장하거나 데이터를 삭제하는 등의 작업을 수행할 때 불필요한 지연을 유발할 수 있어요. `DisplayAlerts = False`로 설정하면 이러한 경고 메시지 없이 코드가 연속적으로 실행되므로, 전반적인 실행 속도를 향상시키는 데 도움이 돼요. 이 설정 역시 코드 종료 시에는 `True`로 복원하여 엑셀의 정상적인 알림 기능을 유지해야 합니다.

 

세 번째로, `Application.DisplayStatusBar` 설정도 있어요. 엑셀 창 하단에 표시되는 상태 표시줄의 업데이트를 비활성화하는 것인데, `ScreenUpdating`을 끄는 것과 유사한 효과를 미미하게나마 줄 수 있어요. 특히 상태 표시줄에 진행 상황 표시가 활발하게 업데이트되는 경우 유용할 수 있어요. `False`로 설정하면 상태 표시줄 업데이트에 소모되는 리소스를 절약할 수 있으며, 코드 종료 후에는 `True`로 복원해야 합니다. 또한, `Application.EnableCancelKey = xlDisabled` 설정은 사용자가 Ctrl+Break 키를 눌러 매크로 실행을 강제로 중단하는 것을 막아줘요. 아주 긴 코드를 실행할 때 실수로 중단되는 것을 방지하기 위해 사용할 수 있지만, 사용자에게 코드 중단 방법을 제공하지 않으므로 매우 신중하게 사용해야 하며, 코드 종료 시 `xlInterrupt`로 복원해야 합니다.

 

이러한 추가적인 최적화 기법들은 `ScreenUpdating`이나 `Calculation` 설정만큼 드라마틱한 속도 향상을 가져오지는 않을 수 있지만, 함께 사용하면 전반적인 매크로 성능을 더욱 끌어올리는 데 기여할 수 있어요. 중요한 것은 이러한 설정들을 변경했을 때, **반드시 코드의 마지막 부분이나 오류 처리 루틴에서 원래 상태로 복원하는 것을 잊지 않는 것**이에요. 이를 통해 엑셀을 안정적으로 사용하면서도 VBA 코드의 성능을 최대한으로 끌어낼 수 있습니다.

🛠️ 실제 적용 사례 및 코드 예시

VBA 코드의 속도를 개선하기 위한 `ScreenUpdating`과 `Calculation` 설정은 이론만으로는 부족해요. 실제 코드를 통해 어떻게 적용하는지 이해하는 것이 중요하죠. 아래는 대량의 데이터를 처리하거나 복잡한 계산이 포함된 엑셀 파일에서 VBA 매크로를 실행할 때 성능을 최적화하는 실제 코드 예시들이에요.

 

예시 1: 대량 데이터 복사 및 서식 적용 최적화

이 예시는 원본 시트의 데이터를 복사하여 대상 시트에 값과 서식을 붙여넣는 작업을 할 때 `ScreenUpdating`, `Calculation`, `EnableEvents`, `DisplayAlerts` 설정을 활용하는 방법을 보여줘요. 수십만 행의 데이터를 다룰 때 이 설정들이 없으면 매크로 실행에 엄청난 시간이 소요될 수 있어요.

Sub ProcessLargeDataOptimized()

    Dim wsSource As Worksheet
    Dim wsDest As Worksheet
    Dim lastRow As Long
    Dim originalCalculation As XlCalculation

    ' 1. 성능 향상을 위한 설정 시작
    Application.ScreenUpdating = False
    originalCalculation = Application.Calculation ' 현재 계산 모드 저장
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False ' 이벤트 프로시저 비활성화
    Application.DisplayAlerts = False ' 경고 메시지 비활성화

    ' 오류 발생 시 복원 루틴으로 이동 설정
    On Error GoTo RestoreSettings

    ' 작업 대상 워크시트 설정
    Set wsSource = ThisWorkbook.Sheets("SourceData")
    Set wsDest = ThisWorkbook.Sheets("DestinationData")

    ' 원본 데이터의 마지막 행 찾기 (A열 기준)
    lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row

    ' 데이터 복사 (값만 붙여넣기)
    wsSource.Range("A1:Z" & lastRow).Copy
    wsDest.Range("A1").PasteSpecial Paste:=xlPasteValues

    ' 데이터 서식 복사 (서식만 붙여넣기)
    wsSource.Range("A1:Z" & lastRow).Copy
    wsDest.Range("A1").PasteSpecial Paste:=xlPasteFormats

    ' 대상 시트에서 추가 작업 (예: 특정 열에 수식 적용 등)
    ' wsDest.Range("AA1:AA" & lastRow).Formula = "=SUM(A1:Z1)" ' 예시 수식 적용

    ' 2. 수동 계산 실행 (필요한 경우)
    ' Application.Calculate ' 또는 Application.CalculateFull

    ' 3. 성능 향상 설정 복원 (정상 완료 시)
    GoTo Cleanup

RestoreSettings:
    ' 오류 발생 시 설정 복원
    MsgBox "데이터 처리 중 오류가 발생했습니다. 설정을 복원합니다.", vbCritical

Cleanup:
    ' 4. 모든 설정 복원 (오류 발생 여부와 관계없이 항상 실행)
    Application.ScreenUpdating = True
    Application.Calculation = originalCalculation ' 저장된 원래 설정으로 복원
    Application.EnableEvents = True
    Application.DisplayAlerts = True

    ' 작업 완료 메시지 표시 (오류 없을 때만)
    If Err.Number = 0 Then
        MsgBox "대량 데이터 처리 및 서식 적용이 완료되었습니다!", vbInformation
    End If

End Sub

 

이 코드에서는 `ScreenUpdating`, `Calculation`, `EnableEvents`, `DisplayAlerts`를 모두 `False`로 설정하고, `On Error GoTo`를 사용하여 오류 발생 시에도 안전하게 복원되도록 했습니다. 특히 `originalCalculation` 변수에 현재 계산 모드를 저장해두었다가 복원하는 것이 중요해요. 데이터 복사 후에는 `PasteSpecial`을 사용하여 값과 서식을 분리하여 붙여넣는 것이 효율적입니다. 만약 복사된 데이터에 수식이 포함되어 있다면, `Application.Calculate`를 호출하여 수식을 다시 계산해 주어야 할 수도 있습니다.

 

예시 2: 복잡한 수식이 많은 파일에서 데이터 업데이트

이 예시는 수백, 수천 개의 복잡한 수식이 포함된 엑셀 파일에서 특정 열의 데이터를 업데이트하는 작업을 할 때 성능을 최적화하는 방법을 보여줘요. `Calculation`을 `xlCalculationManual`로 설정하는 것이 핵심이며, 코드 실행 후에는 수동으로 계산을 실행해야 합니다.

Sub UpdateDataWithComplexFormulasOptimized()

    Dim ws As Worksheet
    Dim i As Long
    Dim originalCalculation As XlCalculation

    ' 1. 성능 향상을 위한 설정 시작
    Application.ScreenUpdating = False
    originalCalculation = Application.Calculation ' 현재 계산 모드 저장
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    ' 오류 발생 시 복원 루틴으로 이동 설정
    On Error GoTo RestoreSettings

    ' 작업 대상 워크시트 설정
    Set ws = ThisWorkbook.Sheets("DataSheet")

    ' 특정 열 (예: B열)의 값 업데이트
    ' 1000개의 행에 대해 값을 10% 증가시키는 예시
    For i = 1 To 1000
        ' 셀 값이 숫자인 경우에만 연산 수행
        If IsNumeric(ws.Cells(i, "B").Value) Then
            ws.Cells(i, "B").Value = ws.Cells(i, "B").Value * 1.1
        End If
    Next i

    ' 2. 수동 계산 실행 (업데이트된 값에 따라 수식이 다시 계산되어야 함)
    ' Application.Calculate ' 모든 변경된 수식 계산
    ' 또는 특정 범위만 계산
    ' ws.Range("C1:C1000").Calculate ' 예: C열의 수식만 계산

    ' 3. 성능 향상 설정 복원 (정상 완료 시)
    GoTo Cleanup

RestoreSettings:
    ' 오류 발생 시 설정 복원
    MsgBox "데이터 업데이트 중 오류가 발생했습니다. 설정을 복원합니다.", vbCritical

Cleanup:
    ' 4. 모든 설정 복원 (오류 발생 여부와 관계없이 항상 실행)
    Application.ScreenUpdating = True
    Application.Calculation = originalCalculation ' 저장된 원래 설정으로 복원
    Application.EnableEvents = True

    ' 작업 완료 메시지 표시 (오류 없을 때만)
    If Err.Number = 0 Then
        MsgBox "복잡한 수식이 포함된 데이터 업데이트 및 계산이 완료되었습니다!", vbInformation
    End If

End Sub

 

이 예시에서는 `Calculation`을 `xlCalculationManual`로 설정하여 데이터 업데이트 중 발생하는 불필요한 재계산을 방지했어요. 또한, `IsNumeric` 함수를 사용하여 숫자가 아닌 값이 포함된 셀에서 오류가 발생하는 것을 방지하는 것도 좋은 습관이에요. 코드 실행 후에는 `Application.Calculate`를 호출하여 수식 계산을 수동으로 실행시켜야 합니다. 만약 특정 범위의 수식만 다시 계산해도 된다면 `ws.Range("C1:C1000").Calculate`와 같이 특정 범위만 지정하여 계산하면 더 효율적일 수 있습니다.

 

이처럼 VBA 코드의 성능을 최적화하는 것은 단순히 코드를 빠르게 만드는 것을 넘어, 엑셀 환경을 안정적으로 유지하는 것과도 직결돼요. `ScreenUpdating`, `Calculation`, `EnableEvents`, `DisplayAlerts` 등의 설정을 적절히 활용하고, 코드 시작과 끝에서 반드시 원래 상태로 복원하는 습관을 들이는 것이 중요합니다. 또한, 오류 처리 구문을 사용하여 예기치 못한 상황에서도 안전하게 코드가 종료되도록 하는 것이 프로페셔널한 VBA 개발의 핵심입니다.

VBA 성능 최적화를 위한 코드 구조 템플릿

VBA 코드의 성능을 최적화하기 위한 가장 좋은 방법 중 하나는 표준화된 구조를 사용하는 것이에요. 아래는 `ScreenUpdating`, `Calculation`, `EnableEvents`, `DisplayAlerts` 설정을 포함하고, 오류 처리까지 고려한 VBA 코드 템플릿이에요. 이 템플릿을 기반으로 코드를 작성하면, 매번 설정을 관리하는 번거로움을 줄이고 안정성을 높일 수 있습니다.

Sub StandardOptimizedMacro()

    ' --- 변수 선언 ---
    Dim originalCalculation As XlCalculation
    Dim startTime As Double ' 실행 시간 측정을 위한 변수 (선택 사항)

    ' --- 초기 설정 및 성능 최적화 ---
    startTime = Timer ' 시작 시간 기록
    Application.ScreenUpdating = False
    originalCalculation = Application.Calculation ' 현재 계산 모드 저장
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    Application.DisplayAlerts = False

    ' --- 오류 처리 설정 ---
    On Error GoTo ErrorHandler

    ' --- 실제 VBA 코드 작성 시작 ---
    ' 여기에 성능에 영향을 주는 주요 로직을 작성합니다.
    ' 예: 대량 데이터 처리, 복잡한 계산, 파일 조작 등

    ' 예시: 10000개의 셀에 데이터 입력
    Dim i As Long
    For i = 1 To 10000
        ThisWorkbook.Sheets("Sheet1").Cells(i, "A").Value = i
    Next i

    ' 예시: 특정 수식 계산 (필요한 경우)
    ' ThisWorkbook.Sheets("Sheet1").Range("B1").Calculate

    ' --- 실제 VBA 코드 작성 종료 ---

    ' --- 정상 종료 시 처리 ---
    GoTo Cleanup

ErrorHandler:
    ' --- 오류 발생 시 처리 ---
    MsgBox "오류가 발생했습니다: " & Err.Description, vbCritical
    ' 오류 로깅 또는 추가 오류 처리 로직을 여기에 추가할 수 있습니다.

Cleanup:
    ' --- 설정 복원 (매우 중요!) ---
    ' 오류 발생 여부와 관계없이 항상 실행되어야 합니다.
    Application.ScreenUpdating = True
    Application.Calculation = originalCalculation ' 저장된 원래 설정으로 복원
    Application.EnableEvents = True
    Application.DisplayAlerts = True

    ' --- 완료 메시지 또는 결과 처리 ---
    If Err.Number = 0 Then ' 오류가 없었을 경우
        Dim endTime As Double
        endTime = Timer ' 종료 시간 기록
        MsgBox "매크로 실행이 완료되었습니다!" & vbCrLf & _
               "총 실행 시간: " & Format(endTime - startTime, "0.00") & "초", vbInformation
    Else ' 오류가 있었을 경우
        ' 오류 발생 시 사용자에게 알림 (예: 이미 메시지 박스로 표시됨)
    End If

    ' --- 오류 상태 초기화 ---
    Err.Clear

End Sub

 

이 템플릿은 VBA 코드의 성능을 최적화하고 안정성을 확보하기 위한 모범 사례를 담고 있어요. `startTime`과 `endTime` 변수를 사용하여 코드 실행 시간을 측정하는 기능도 포함되어 있어, 최적화 전후의 성능 개선 정도를 비교하는 데 유용하게 활용할 수 있습니다. 코드를 작성할 때는 항상 이 템플릿을 참고하여, 성능 최적화와 안정성 확보라는 두 마리 토끼를 모두 잡는 것을 목표로 삼는 것이 좋습니다.

[이미지2 위치]

❓ VBA 속도 개선 FAQ

Q1. `ScreenUpdating`을 `False`로 설정하면 화면이 완전히 멈추나요?

 

A1. 네, `Application.ScreenUpdating = False`로 설정하면 VBA 코드가 실행되는 동안 엑셀 화면의 모든 업데이트가 일시적으로 중지돼요. 이는 코드 실행이 완료된 후에야 최종 결과가 화면에 한 번에 표시되도록 하기 위함이에요. 따라서 코드 실행 중에는 화면에 아무런 변화도 보이지 않아요.

Q2. `Calculation`을 `xlCalculationManual`로 설정하면 수식이 아예 계산되지 않나요?

 

A2. 네, `Application.Calculation = xlCalculationManual`로 설정하면 VBA 코드 실행 중에는 엑셀의 자동 계산 기능이 완전히 비활성화돼요. 즉, 셀 값을 변경해도 관련된 수식이 자동으로 다시 계산되지 않아요. 코드 실행이 끝난 후에는 `Application.Calculate`와 같은 메서드를 호출하여 수동으로 계산을 실행해야 합니다.

Q3. 코드 실행 중 오류가 발생했는데 `ScreenUpdating`이 복원되지 않았어요. 어떻게 해야 하나요?

 

A3. 이러한 상황을 방지하기 위해 `On Error GoTo` 구문을 사용하여 오류 처리 루틴을 만들어야 해요. 이 루틴에 `ScreenUpdating`, `Calculation` 등 변경했던 모든 설정을 원래대로 복원하는 코드를 포함하면, 오류 발생 시에도 안전하게 설정을 복원할 수 있습니다. 또한, 현재 계산 모드를 변수에 저장해두었다가 복원하는 것이 가장 안전해요.

Q4. `ScreenUpdating`과 `Calculation`을 모두 `False`로 설정하는 것이 항상 최선인가요?

 

A4. 대부분의 경우, 특히 대량의 데이터를 처리하거나 복잡한 수식이 많은 엑셀 파일에서는 두 설정을 모두 비활성화하는 것이 성능 향상에 매우 효과적이에요. 하지만 아주 간단한 작업이나 화면 업데이트가 거의 없는 코드에서는 오히려 오버헤드를 유발할 수도 있어요. 작업의 성격을 파악하고 신중하게 적용하는 것이 중요해요.

Q5. `Application.EnableEvents = False`는 언제 사용해야 하나요?

 

A5. `Application.EnableEvents = False`는 워크시트나 통합 문서에서 발생하는 이벤트 프로시저(예: `Worksheet_Change`, `Workbook_Open` 등)가 코드 실행을 느리게 만들거나 불필요한 작업을 수행할 때 사용해요. 복잡한 이벤트 프로시저가 있는 경우 성능 향상에 도움이 될 수 있으며, 코드 종료 시에는 반드시 `True`로 복원해야 합니다.

Q6. `Application.DisplayAlerts = False`는 어떤 효과가 있나요?

 

A6. `Application.DisplayAlerts = False`는 엑셀에서 발생하는 각종 경고 메시지(예: 파일 저장 확인, 삭제 확인 등)를 숨겨요. 이러한 경고 메시지는 사용자 입력을 기다리므로 코드 실행을 일시 중단시키는데, 이 설정을 통해 경고 없이 코드가 연속적으로 실행되어 성능을 향상시킬 수 있어요. 코드 종료 시 `True`로 복원해야 합니다.

Q7. `Application.Calculate`와 `Application.CalculateFull`의 차이점은 무엇인가요?

 

A7. `Application.Calculate`는 현재 열려 있는 모든 통합 문서의 변경된 수식만 다시 계산해요. 반면에 `Application.CalculateFull`은 모든 통합 문서의 모든 수식을 처음부터 다시 계산해요. 성능 최적화를 위해서는 일반적으로 `Application.Calculate`를 사용하고, 정말 모든 수식을 강제로 다시 계산해야 할 때만 `Application.CalculateFull`을 사용하는 것이 좋아요.

Q8. VBA 코드 실행 시간이 얼마나 단축될 수 있나요?

 

A8. `ScreenUpdating`과 `Calculation` 설정을 올바르게 적용하면, 코드 실행 시간이 평균적으로 2배에서 10배 이상 향상될 수 있어요. 특히 화면 업데이트가 많거나 수식이 복잡한 경우, 그 효과는 더욱 극대화될 수 있습니다. 하지만 실제 향상 폭은 코드의 복잡성, 데이터 양, 엑셀 버전, 하드웨어 사양 등 다양한 요인에 따라 달라질 수 있습니다.

Q9. `On Error Resume Next`를 사용하는 것이 더 낫지 않나요?

 

A9. `On Error Resume Next`는 오류 발생 시 다음 줄로 계속 진행시키지만, 오류가 발생했는지 여부를 별도로 확인하고 처리해야 하는 번거로움이 있어요. 반면 `On Error GoTo`는 오류 발생 시 미리 정의된 오류 처리 루틴으로 이동시켜 설정을 복원하고 추가적인 오류 처리를 할 수 있게 해주므로, 더 안전하고 권장되는 방법입니다.

Q10. `ScreenUpdating`을 끄면 Excel이 "응답 없음" 상태가 되는 것을 막을 수 있나요?

 

A10. `ScreenUpdating = False` 자체만으로는 "응답 없음" 상태를 완전히 막지는 못할 수 있어요. 하지만 `DoEvents` 함수를 코드 중간중간에 삽입하면 VBA가 다른 Windows 메시지를 처리할 시간을 주어 "응답 없음" 상태에 빠지는 것을 방지하는 데 도움이 될 수 있습니다. `ScreenUpdating = False`는 주로 화면 렌더링 시간을 줄이는 데 초점을 맞춥니다.

Q11. `Application.EnableCancelKey = xlDisabled` 설정은 꼭 필요한가요?

 

A11. 이 설정은 사용자가 Ctrl+Break 키를 눌러 매크로 실행을 강제로 중단하는 것을 막아요. 아주 긴 코드를 실행할 때 실수로 중단되는 것을 방지하는 데 유용할 수 있지만, 사용자에게 코드 중단 방법을 제공하지 않으므로 매우 신중하게 사용해야 하며, 코드 종료 시 `xlInterrupt`로 복원해야 합니다.

Q12. VBA 코드 실행 전, 현재 `Calculation` 설정을 저장하고 복원하는 이유는 무엇인가요?

 

A12. 사용자가 엑셀 옵션에서 `xlCalculationAutomatic` 외에 `xlCalculationSemiautomatic` 등으로 계산 모드를 설정해 두었을 수 있기 때문이에요. 현재 설정을 변수에 저장해두었다가 코드 종료 시 원래대로 복원하면, 사용자의 엑셀 환경 설정을 존중하면서도 성능 최적화를 안전하게 수행할 수 있습니다.

Q13. `ScreenUpdating`을 `False`로 설정해도 상태 표시줄 업데이트는 보이나요?

 

A13. 일반적으로 `ScreenUpdating`을 `False`로 설정하면 상태 표시줄 업데이트도 함께 중지될 수 있어요. 하지만 `Application.DisplayStatusBar = False` 설정을 사용하면 상태 표시줄 업데이트를 명시적으로 비활성화할 수 있으며, 이는 미미하지만 성능 향상에 도움이 될 수 있습니다.

Q14. VBA 코드 최적화 시 가장 먼저 고려해야 할 설정은 무엇인가요?

 

A14. `Application.ScreenUpdating = False`와 `Application.Calculation = xlCalculationManual` 설정을 가장 먼저 고려하는 것이 좋습니다. 이 두 가지 설정만으로도 많은 경우 눈에 띄는 속도 향상을 경험할 수 있습니다.

Q15. `Application.Calculate`와 `Application.CalculateFull` 중 어떤 것을 사용해야 하나요?

 

A15. 대부분의 경우, 변경된 수식만 다시 계산하는 `Application.Calculate`를 사용하는 것이 효율적입니다. 모든 수식을 처음부터 다시 계산해야 하는 특별한 경우가 아니라면 `Calculate`를 사용하는 것이 좋습니다.

Q16. VBA 코드에서 루프(Loop)를 사용할 때 속도 개선 팁이 있나요?

 

A16. 루프 안에서 셀 값을 직접 변경하는 대신, 배열 변수에 데이터를 저장했다가 한 번에 시트에 쓰는 방식이 훨씬 빠릅니다. 또한, 루프 안에서 `ScreenUpdating`이나 `Calculation` 설정을 변경하는 것은 비효율적이므로, 코드 시작 시 한 번만 설정하는 것이 좋습니다.

Q17. `ScreenUpdating`을 `False`로 설정하면 엑셀 프로그램 자체도 느려지나요?

 

A17. 아닙니다. `ScreenUpdating = False`는 VBA 코드 실행 중 엑셀 화면 업데이트를 멈추는 것이므로, 엑셀 프로그램 자체의 속도에 직접적인 영향을 주지는 않습니다. 오히려 화면 업데이트에 사용될 리소스를 절약하여 코드 실행 속도를 높이는 효과를 가져옵니다.

Q18. `Calculation`을 수동으로 설정했을 때, 수동 계산은 어떻게 실행하나요?

 

A18. VBA 코드 내에서 `Application.Calculate` 또는 `Application.CalculateFull` 메서드를 호출하여 수동 계산을 실행할 수 있습니다. 또한, 엑셀 리본 메뉴의 '수식' 탭에서 '지금 계산' 버튼을 클릭해도 수동 계산이 실행됩니다.

Q19. `EnableEvents`를 `False`로 설정하면 어떤 이벤트가 중지되나요?

 

A19. `Worksheet_Change`, `Workbook_Open`, `Workbook_BeforeSave`, `Workbook_Activate`, `Worksheet_Activate` 등 엑셀에서 발생하는 거의 모든 이벤트 프로시저의 실행이 중지됩니다. 코드 실행이 완료되면 반드시 `True`로 복원해야 합니다.

Q20. `DisplayAlerts`를 `False`로 설정했을 때, 중요한 경고 메시지도 표시되지 않나요?

 

A20. 네, `Application.DisplayAlerts = False`로 설정하면 저장 확인, 삭제 확인 등 모든 종류의 경고 메시지가 표시되지 않아요. 따라서 중요한 경고 메시지를 놓치지 않도록 주의해야 하며, 코드 종료 후에는 반드시 `True`로 복원하여 엑셀의 정상적인 알림 기능을 유지해야 합니다.

Q21. VBA 코드 최적화는 모든 엑셀 버전에서 동일하게 적용되나요?

 

A21. `ScreenUpdating`과 `Calculation` 설정은 모든 엑셀 버전에서 동일하게 작동하는 기본적인 프로퍼티입니다. 하지만 최신 버전의 엑셀은 VBA 엔진 자체의 성능이 향상되었기 때문에, 과거 버전에 비해 최적화로 인한 속도 향상 폭이 상대적으로 줄어들 수는 있습니다. 하지만 여전히 대규모 데이터 처리에서는 매우 효과적입니다.

Q22. `On Error GoTo`를 사용할 때, `Exit Sub` 문은 왜 필요한가요?

 

A22. `On Error GoTo`는 오류 발생 시 특정 레이블로 이동하게 하지만, 오류가 발생하지 않고 코드가 정상적으로 완료되었을 때도 `ErrorHandler` 레이블로 이동할 수 있어요. `Exit Sub` 문을 `ErrorHandler` 레이블 이전에 두면, 코드가 정상적으로 완료되었을 때 `ErrorHandler` 루틴을 건너뛰고 프로시저를 종료할 수 있습니다. 이는 오류 처리 루틴에 있는 설정 복원 코드가 정상 종료 시에도 실행되도록 보장하기 위해서입니다.

Q23. VBA에서 객체 변수(Object Variable)를 사용하는 것이 성능에 영향을 주나요?

 

A23. 네, 객체 변수를 사용하는 것은 VBA 코드의 성능에 큰 영향을 줄 수 있어요. 특히 `Range`, `Worksheet`, `Workbook`과 같은 객체를 코드 내에서 반복적으로 참조하는 대신, 변수에 할당하여 사용하는 것이 훨씬 효율적입니다. 예를 들어, `Dim ws As Worksheet`와 같이 변수를 선언하고 `Set ws = ThisWorkbook.Sheets("Sheet1")`과 같이 할당한 후, `ws.Cells(...)` 대신 `ws.Range(...)`와 같이 사용하는 것이 좋습니다.

Q24. `DoEvents` 함수는 성능 최적화에 어떻게 기여하나요?

 

A24. `DoEvents` 함수는 VBA 코드가 다른 Windows 메시지를 처리할 시간을 주어, 엑셀이 "응답 없음" 상태에 빠지는 것을 방지하는 데 도움이 될 수 있어요. 특히 `ScreenUpdating`을 `False`로 설정했을 때, 긴 루프 내에서 `DoEvents`를 주기적으로 호출해주면 사용자 인터페이스가 멈추는 느낌을 줄여줄 수 있습니다. 하지만 직접적인 속도 향상보다는 응답성 개선에 더 초점을 맞춥니다.

Q25. VBA에서 배열(Array)을 사용하는 것이 왜 빠른가요?

 

A25. 배열을 사용하면 메모리 상에서 데이터를 한 번에 처리하고, 최종 결과만 시트에 쓰는 방식으로 작업할 수 있어요. 이는 셀 하나하나를 직접 참조하고 수정하는 것보다 훨씬 빠릅니다. 예를 들어, 대량의 데이터를 읽어와서 처리한 후, 결과를 배열에 저장했다가 마지막에 한 번에 시트에 쓰는 방식이 훨씬 효율적입니다.

Q26. 엑셀 파일(.xlsm) 자체의 크기가 성능에 영향을 미치나요?

 

A26. 네, 엑셀 파일의 크기가 클수록, 특히 시트 내에 불필요한 서식이나 숨겨진 개체가 많을수록 VBA 코드의 실행 속도에 영향을 줄 수 있습니다. 파일 최적화(예: 불필요한 서식 제거, 숨겨진 개체 삭제)도 성능 개선에 도움이 될 수 있습니다.

Q27. `Application.ScreenUpdating`과 `Application.EnableEvents`를 동시에 `False`로 설정해도 되나요?

 

A27. 네, 일반적으로 두 설정을 동시에 `False`로 설정해도 문제가 없습니다. 많은 성능 최적화 코드에서 이 두 가지 설정을 함께 사용하여 최대의 성능 향상을 추구합니다. 물론, 코드 종료 시에는 두 설정 모두 원래대로 복원해야 합니다.

Q28. VBA 코드 실행 중 Excel 창을 최소화해도 성능에 영향을 주나요?

 

A28. `ScreenUpdating`이 `True`인 상태에서 창을 최소화하면 화면 렌더링에 드는 리소스가 줄어들어 약간의 성능 향상이 있을 수 있습니다. 하지만 `ScreenUpdating = False` 설정이 훨씬 더 직접적이고 강력한 성능 개선 효과를 제공합니다.

Q29. VBA 코드 최적화는 다른 프로그래밍 언어에서도 비슷한 원리로 적용되나요?

 

A29. 네, 많은 프로그래밍 언어에서 UI 업데이트를 최소화하고 불필요한 계산을 줄이는 것은 성능 최적화의 기본적인 원리입니다. VBA의 `ScreenUpdating`과 `Calculation` 설정은 이러한 일반적인 프로그래밍 원리가 엑셀 환경에 적용된 것이라고 볼 수 있습니다.

Q30. VBA 성능 최적화에 대한 최신 트렌드나 새로운 기법이 있나요?

 

A30. VBA 자체의 성능 최적화 기법은 크게 변하지 않았지만, 최근에는 Excel의 새로운 기능(예: Power Query, Power Pivot, Office Scripts)과의 연동, 클라우드 환경에서의 VBA 활용, AI 기반의 자동화 등과 관련된 최적화 고려사항이 중요해지고 있습니다. 하지만 `ScreenUpdating`과 `Calculation`은 여전히 가장 기본적이고 강력한 성능 개선 방법으로 남아있습니다.

면책 문구

이 글은 VBA 코드의 성능 최적화 기법, 특히 `ScreenUpdating`과 `Calculation` 프로퍼티의 활용 및 주의점에 대한 일반적인 정보를 제공하기 위해 작성되었습니다. 제공된 정보는 기술적인 가이드라인이며, 특정 상황에서의 완벽한 성능 보장을 의미하지는 않습니다. VBA 코드의 실제 성능은 엑셀 버전, 파일의 복잡성, 하드웨어 사양, 코드의 구체적인 구현 방식 등 다양한 요인에 따라 달라질 수 있습니다. 따라서 이 글의 내용만을 가지고 법적 판단을 내리거나 코드를 적용하기보다는, 반드시 실제 환경에서 충분한 테스트를 거쳐야 합니다. 필자는 이 글의 정보로 인해 발생하는 직간접적인 손해에 대해 어떠한 법적 책임도 지지 않습니다. VBA 코드를 수정하거나 적용하기 전에는 반드시 원본 파일을 백업하고, 전문가의 도움을 받는 것을 고려하시기 바랍니다.

 

요약

VBA 코드의 실행 속도를 획기적으로 개선하는 핵심 방법은 `Application.ScreenUpdating = False`와 `Application.Calculation = xlCalculationManual` 설정을 활용하는 것입니다. `ScreenUpdating = False`는 코드 실행 중 화면 업데이트를 멈춰 시각적 렌더링에 소모되는 리소스를 절약하고, `Calculation = xlCalculationManual`은 불필요한 자동 계산을 방지하여 수식 처리 시간을 단축시킵니다. 이 두 설정은 특히 대량 데이터 처리나 복잡한 수식이 많은 엑셀 파일에서 매우 효과적이며, 코드 실행 시간을 수 배에서 수십 배까지 단축시킬 수 있습니다. 하지만 가장 중요한 것은 코드 실행 완료 후나 오류 발생 시에도 반드시 이 설정들을 원래 상태(`True` 및 `xlCalculationAutomatic` 또는 원래 설정)로 복원해야 한다는 점입니다. 이를 위해 `On Error GoTo` 구문을 활용한 오류 처리 루틴을 만드는 것이 필수적입니다. 또한, `Application.EnableEvents = False`, `Application.DisplayAlerts = False`와 같은 추가적인 최적화 기법들을 함께 사용하면 성능을 더욱 향상시킬 수 있습니다. 실제 코드를 작성할 때는 이러한 최적화 설정을 적용하고, 오류 발생 시에도 안전하게 복원될 수 있도록 표준화된 템플릿을 사용하는 것이 좋습니다. VBA 코드의 성능 최적화는 단순히 속도를 높이는 것을 넘어, 엑셀 환경의 안정성을 유지하고 사용자 경험을 개선하는 데 중요한 역할을 합니다.

댓글

이 블로그의 인기 게시물

LAMBDA로 재사용 함수 만들기: 템플릿화 방법

VBA 오류 처리(Err) 기본 패턴: 중단 방지와 로그 남기기

엑셀 VBA 매크로, 어디까지 가능할까? 실무 활용 10가지 혁신 사례