본문 바로가기
#2 엑셀 오류 가이드

엑셀에서 여러 스레드 계산(Multi-thread) 시 간헐적 충돌 해결

by 이세계의엑셀 2025. 4. 27.
반응형

엑셀에서 계산 속도를 높이기 위해 여러 스레드를 이용한 병렬 계산을 활용하는 경우가 많습니다. 하지만 이를 사용하는 도중 간헐적으로 셀 계산 충돌이나 응답 중지 현상이 발생해 업무에 방해가 되는 경우도 있습니다. 이번 글에서는 엑셀에서 여러 스레드 계산(Multi-thread) 시 간헐적 충돌 해결 방법을 중심으로 원인 분석과 실질적인 해결책을 상세하게 안내합니다.


메타디스크립션: 엑셀에서 여러 스레드를 사용한 계산 도중 발생하는 간헐적 충돌 문제의 원인과 해결 방법을 VBA 코드와 함께 단계별로 정리했습니다.


반응형

여러 스레드 계산 기능의 개요와 장점

엑셀에서는 기본적으로 수식 계산을 단일 스레드로 처리합니다. 그러나 최근 버전에서는 파일 > 옵션 > 고급 > 수식 계산 탭에서 멀티스레드 계산 사용을 체크하면 사용 가능한 프로세서 수만큼 병렬 계산이 가능합니다.

장점

  • 복잡한 수식 계산 속도 향상
  • 다중 시트 또는 대량의 배열 수식 처리 시 효과적
  • 고성능 CPU의 코어 자원을 적극 활용

하지만 이런 장점 뒤에는 불안정한 동기화 문제와 관련된 단점이 숨겨져 있습니다.


엑셀 멀티스레드 충돌이 발생하는 주요 원인

멀티스레드를 활성화했을 때 충돌하거나 계산 중 엑셀이 멈추는 증상이 발생하는 원인은 아래와 같습니다:

원인 설명
VBA 또는 외부 참조 함수 호출 UDF 또는 COM Add-in을 사용하는 경우 계산이 스레드 안전하지 않음
계산 중 이벤트 발생 Worksheet_Change 또는 Calculation 이벤트가 겹칠 경우 충돌 가능
실시간 데이터 연결 실시간 피드(예: 주식, 외부 DB)와의 비동기 동작 간섭
오래된 엑셀 버전 Excel 2010 이전 버전은 멀티스레드 안정성이 낮음
고정된 수식 순서 오류 순환 참조 또는 명시적 계산 순서 없이 동시 계산 시 충돌 발생

해결 방법 1: 멀티스레드 옵션 조정

멀티스레드 옵션을 너무 공격적으로 사용하면 오히려 시스템 자원을 과다 점유하고 충돌 위험이 높아집니다.

설정 방법

  1. 파일 > 옵션 > 고급 > 수식 계산 옵션
  2. "다중 스레드를 사용하여 계산" 체크 해제 또는 "사용자 지정"
  3. 프로세서 수를 1~2개로 제한하여 동시 계산 수 조절

해결 방법 2: 수식 재설계 및 병렬 처리 최소화

특정 수식들이 서로를 참조하거나 UDF(User Defined Function)를 사용하는 경우 스레드 간 경합(race condition)이 발생할 수 있습니다. 이럴 때는 수식을 다음과 같이 정리합니다:

  • 간접 참조 제거: INDIRECT, OFFSET 등 동적 참조는 멀티스레드 처리에 부적합
  • 순환 참조 방지: 명시적 계산 순서 없이 반복되는 셀 계산은 충돌 유발
  • 수식 블록 정리: 계산을 순차적으로 분리하는 구조로 설계

해결 방법 3: VBA 계산 동기화 및 오류 회피 코드

멀티스레드 계산 중 VBA가 간섭하면 문제가 발생합니다. 따라서 이벤트를 끄거나 계산을 제어하는 VBA 코드를 삽입하는 것이 좋습니다.

Sub SafeRecalculate()
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual

    ' 수동으로 계산 실행
    Worksheets("Sheet1").Calculate

    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
End Sub

주요 포인트

  • EnableEvents = False 로 이벤트 중지
  • Calculation = Manual 설정으로 전체 재계산 방지
  • 마지막에 다시 자동 계산 활성화

이 코드를 자동화 프로세스 중간에 삽입하면 간헐적인 충돌 방지에 매우 효과적입니다.


해결 방법 4: 병렬 계산 강제 해제 후 수동 제어

다음은 VBA로 엑셀의 멀티스레드 계산 옵션을 강제로 해제하고, 필요할 때만 수동 계산을 실행하는 코드입니다.

Sub DisableMultiThread()
    With Application
        .MultiThreadedCalculation.Enabled = False
        .MultiThreadedCalculation.ThreadCount = 1
    End With
    MsgBox "멀티스레드 계산이 비활성화되었습니다."
End Sub

원하는 시점에 ThreadCount를 늘려 다시 사용할 수 있지만, 불안정한 환경에서는 항상 1로 고정하는 것이 좋습니다.


엑셀 버전별 멀티스레드 지원 상태

엑셀 버전 스레드 계산 안정성 멀티스레드 UDF 지원 권장 설정
Excel 2007 낮음 미지원 비활성화
Excel 2013 보통 제한적 지원 사용자 설정
Excel 2016~2021 높음 일부 지원 2~4개 제한
Excel 365 매우 높음 고급 UDF 가능 자동 최적화 권장

추가 팁 및 유지 관리 전략

  • 정기적으로 Ctrl + Alt + Shift + F9를 눌러 전체 재계산 강제 새로고침
  • VBA 작업 시 항상 이벤트 중지 및 계산 방식 설정 코드 포함
  • Power Query나 외부 연동 시 병렬 처리 비활성화 권장
  • 엑셀 충돌 로그 확인: C:\Users\[사용자]\AppData\Local\Microsoft\Office\UnsavedFiles\ 경로

엑셀에서 여러 스레드 계산(Multi-thread) 시 간헐적 충돌 해결 요약

  • 병렬 계산 기능은 빠른 계산에 유리하지만 안정성 문제를 수반함
  • VBA 및 외부 함수 사용 시에는 단일 스레드 설정이 더 안전함
  • EnableEvents, Calculation 속성 조합을 통해 수식 충돌을 피할 수 있음
  • 엑셀 버전에 따라 적절한 멀티스레드 설정이 달라짐

멀티스레드 계산은 강력하지만 민감한 기능입니다. 복잡한 문서를 다룰수록 충돌이 잦아질 수 있으므로, 위의 방법들을 조합하여 최적의 계산 안정성과 성능을 유지하시기 바랍니다.

반응형