본문 바로가기
#4 VBA/#4.1 환경설정 및 기본개념

32비트와 64비트 VBA 차이

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

 

32비트와 64비트 VBA 차이는 Microsoft Office 환경에서 매크로를 개발할 때 반드시 알아야 할 핵심 요소다. 이 차이는 메모리 접근 방식, API 선언 구문, 자료형 호환성 등 전반적인 코드 작성 규칙에 영향을 주므로, 프로젝트 규모가 작든 크든 미리 숙지해두는 것이 좋다.

반응형

32비트와 64비트 VBA 차이의 배경

  • 32비트 VBA는 오래된 Windows 및 Office 버전에서 주로 사용되며, 각 프로세스가 활용할 수 있는 메모리 주소 공간이 제한적이다.
  • 64비트 VBA는 Office 2010 이후부터 본격적으로 도입되었으며, 대용량 데이터를 처리하거나 시스템 메모리를 넉넉히 활용할 수 있다는 장점이 있다.
  • 그러나 64비트 환경이 되면서 기존 Declare 구문 및 API 호출 방식에 변경이 생겼고, 일부 호환성 문제가 발생할 수 있다.

주요 개념

  • 주소 공간(Address Space): 프로세스가 메모리에 접근할 수 있는 범위. 32비트는 이론상 최대 4GB, 64비트는 이보다 훨씬 많은 메모리를 할당받을 수 있다.
  • Declare 문: Windows API, 외부 DLL 함수 등을 호출할 때 사용하는 구문. 64비트 환경에서는 PtrSafe 키워드를 반드시 붙여야 한다.
  • LongPtr 자료형: 32비트에서는 4바이트, 64비트에서는 8바이트로 처리되는 특수 자료형이다.

32비트와 64비트 VBA 환경 이해

Office를 설치할 때 32비트 버전 또는 64비트 버전을 선택 가능하다. 개발자는 두 환경 중 하나를 사용하거나, 별도 PC를 통해 각각의 버전을 병행 테스트할 수도 있다.

  • 32비트 환경 특징
    • 기존 프로젝트와 호환성이 높다.
    • 메모리 사용 제한이 상대적으로 존재한다.
    • Declare 구문이 단순하며, PtrSafe 선언이 필요 없다.
  • 64비트 환경 특징
    • 대규모 데이터 처리가 유리하다.
    • 일부 API 호출 시 LongLong 또는 LongPtr을 고려해야 한다.
    • 기존 32비트 API 코드를 그대로 사용하면 오류가 발생할 가능성이 있다.

 

Declare 구문 및 자료형 비교

아래 표는 32비트와 64비트에서 달라지는 Declare 구문 및 자료형을 간단히 비교한 것이다.

구분 32비트 VBA 64비트 VBA
Declare 문 Declare Function Foo Lib "xxx" ... Declare PtrSafe Function Foo Lib "xxx" ...
포인터형 Long LongPtr
정수형 Long = 4바이트 LongLong = 8바이트 (필요 시 별도 사용)
예시 Declare Function GetTickCount Lib ... Declare PtrSafe Function GetTickCount Lib ...
  • LongPtr: 32비트에서는 4바이트, 64비트에서는 8바이트로 할당되는 가변형 자료형
  • PtrSafe: 64비트 환경에서의 안전한 포인터 호출을 보장하기 위해 Declare 구문에 추가된 키워드
  • LongLong: 64비트 정수형(8바이트). 특정 Win64 API에서 매개변수나 반환값으로 사용된다.

32비트와 64비트 환경의 API 호출 예시

아래 예시는 GetTickCount API를 호출하는 간단한 코드로, 64비트 환경에서 컴파일 시 오류 없이 동작하도록 처리한 모습이다.

#If Win64 Then
    Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As LongLong
#Else
    Private Declare Function GetTickCount Lib "kernel32" () As Long
#End If

Sub GetSystemTickCount()
    Dim result As LongLong

    result = GetTickCount()
    Debug.Print "System TickCount:", result
End Sub
  • #If Win64 Then 구문은 컴파일 시점에 사용 환경이 64비트인지 판별한다.
  • 32비트 VBA 환경에서는 기존 선언 그대로, 64비트 VBA 환경에서는 PtrSafeLongLong을 적용해 충돌을 방지한다.

32비트와 64비트 VBA 차이로 인한 마이그레이션 이슈

  1. ActiveX 컨트롤
    • 일부 ActiveX 컨트롤은 64비트용 라이브러리를 제공하지 않아, 64비트 Office 환경에서 정상 작동하지 않을 수 있다.
    • 해결 방법: 32비트 Office 환경 유지 또는 64비트용 대체 컨트롤 사용.
  2. 타사 DLL 참조
    • 다양한 회계·ERP 시스템과 연동할 때 32비트용 DLL만 제공된다면, 64비트 VBA 환경에서 호출이 불가능하다.
    • 해결 방법: 제작사에 64비트 지원 버전 문의 또는 AnyCPU 형태로 재컴파일된 라이브러리 사용.
  3. 자료형 불일치 오류
    • Long, Integer, String 등은 크게 문제되지 않지만, 포인터 연산이나 구조체를 다룰 때 자료형이 달라져 오류가 발생할 수 있다.
  4. 보안 정책 차이
    • 64비트 Office는 일부 기업 방화벽이나 안티바이러스 환경에서 예외 처리가 누락되어, 매크로 실행이 차단될 수도 있다.

 

호환성 확보를 위한 단계별 접근

  • 1단계: 환경 조사
    • 현재 사용하는 Office 버전, 32비트/64비트 여부, 필요한 API나 DLL 목록을 정리한다.
  • 2단계: Declare 구문 수정
    • PtrSafe 키워드 도입 여부, LongPtr 또는 LongLong 적용 여부 등을 점검한다.
    • 32비트에서만 동작하는 API가 있는지 확인한다.
  • 3단계: 테스트 시나리오 구축
    • 32비트 PC, 64비트 PC 각각에서 동일한 VBA 프로젝트를 실행하여 오류 발생 지점을 찾는다.
    • 데이터 처리, 폼 컨트롤, 타사 라이브러리 호출 등 여러 기능별로 시나리오를 만든다.
  • 4단계: 오류 수정 및 재배포
    • 코드 수정 후, 서로 다른 환경에서 재테스트한다.
    • 최종 배포 시에는 매크로 보안 정책에 따라 디지털 서명 등을 고려한다.

실제 프로젝트 적용 사례

  • 대용량 데이터 분석
    • 64비트 VBA는 메모리 사용에 좀 더 자유로워, 수십만 행 이상의 Excel 데이터를 처리할 때 안정성이 개선될 수 있다.
    • 기존 32비트 환경에서 Out of Memory 오류가 발생했다면, 64비트 전환을 고려할 만하다.
  • API 기반 시스템 통합
    • 일부 Windows API가 64비트 전용 함수만 제공하기 시작하면서, 최신 OS와의 연동에서는 64비트 Office를 사용하는 편이 호환성이 좋다.
    • 예를 들어, 레지스트리 경로(HKLM\SOFTWARE vs HKLM\SOFTWARE\WOW6432Node) 처리 등에서 혼동이 줄어든다.
  • ERP·MES 연동
    • 대기업 및 제조업 환경에서 ERP·MES 연동 매크로를 만들 때, DLL 버전 일치가 필수이므로 32비트 또는 64비트 버전을 통일해야 한다.

매크로 보안과 서명

  • 보안 수준
    • Office 기본 설정에서 매크로 실행이 차단될 수 있으며, 64비트 버전이라 해서 다르지 않다.
    • 조직 내 보안 정책에 따라 특정 인증서로 서명된 매크로만 허용될 수 있으니 사전에 확인한다.
  • 디지털 서명 적용
    • 자체 인증서(셀프 서명) 또는 공인 인증서를 이용해 VBA 프로젝트에 서명하면, 신뢰할 수 있는 프로젝트로 인식된다.
    • 서명된 매크로라도 32비트용 DLL과 64비트용 DLL이 다르면 실행 시 에러가 발생할 수 있으니 주의한다.

자주 묻는 질문(FAQ)

  • Q1: 32비트 VBA와 64비트 VBA가 동시에 설치 가능한가?
    • 원칙적으로 동일 PC에 32비트 Office와 64비트 Office를 공존 설치하는 것은 공식적으로 권장되지 않는다. 다만 가상 머신이나 별도 테스트 환경을 마련하면 가능하다.
  • Q2: Declare 구문에서 PtrSafe만 쓰면 64비트로 자동 지원되는가?
    • PtrSafe는 필수 요건이지만, 내부 매개변수와 반환값 형식도 64비트에 맞춰야 한다. LongPtrLongLong을 적절히 사용해야 오류가 없다.
  • Q3: 32비트 매크로를 64비트 환경에서 그대로 실행하면 어떻게 되는가?
    • 단순 로직은 동작 가능하지만, API 호출 등 포인터 관련 코드가 있으면 컴파일 에러 또는 런타임 에러가 발생한다.

실제 코드 예시: 32비트 & 64비트 동시 호환

아래 코드는 32비트와 64비트 환경을 모두 지원하기 위한 전형적인 구조다. 운영 체제 및 Office 버전에 따라 적절한 Declare 선언을 자동으로 선택한다.

Option Explicit

#If Win64 Then
    Private Declare PtrSafe Function GetUserNameA Lib "advapi32.dll" ( _
        ByVal lpBuffer As String, _
        nSize As LongPtr) As Long
#Else
    Private Declare Function GetUserNameA Lib "advapi32.dll" ( _
        ByVal lpBuffer As String, _
        ByVal nSize As Long) As Long
#End If

Public Sub ShowCurrentUser()
    Dim buffer As String * 255
    Dim size As Long

    size = 255
    If GetUserNameA(buffer, size) <> 0 Then
        MsgBox "현재 사용자명: " & Left$(buffer, InStr(buffer, Chr$(0)) - 1)
    Else
        MsgBox "사용자명 조회 실패"
    End If
End Sub
  • GetUserNameA: 현재 Windows 사용자 이름을 가져오는 API.
  • String * 255: 고정 길이 문자열 버퍼를 만든 뒤, API 호출 결과를 수신한다.
  • #If Win64 Then: 64비트에서만 PtrSafeLongPtr을 적용한다.

마지막으로 알아두어야 할 점

32비트와 64비트 VBA 차이는 매크로 개발의 근본적인 구조에 변화를 줄 수 있다. 특히 API 및 외부 DLL 호출이 많은 프로젝트일수록 포인터 선언과 자료형 호환성을 신경 써야 한다. Office 버전 업그레이드 전후, 각 환경에 맞춘 매크로 코드 리뷰가 필수적이다. 32비트와 64비트 VBA 차이가 야기할 수 있는 에러를 사전에 방지하려면, 프로젝트 설계 단계부터 버전 선택과 테스트 시나리오 구축에 심혈을 기울이는 것이 중요하다.

반응형