- 기사
Microsoft VBA(Visual Basic for Applications)는 Microsoft Office와 함께 제공되는 Visual Basic 버전입니다. Microsoft Office 2010의 VBA에는 VBA 코드가 32비트 및 64비트 환경 모두에서 올바르게 실행되도록 하는 언어 기능이 포함되어 있습니다.
메모
기본적으로 Office 2010, 2013 및 2016은 32비트 버전을 설치합니다. 설치 중에 64비트 버전을 설치하도록 명시적으로 선택해야 합니다. Office 2019 및 Microsoft 365부터 기본값은 64비트 버전입니다.
Office 2010 릴리스(VBA 버전 6 이하) 이전에 작성된 VBA 코드를 64비트 플랫폼에서 실행하면 64비트 버전의 Office에서 실행되도록 코드를 수정하지 않으면 오류가 발생할 수 있습니다. VBA 버전 6 및 이전 버전은 암시적으로 32비트 플랫폼을 대상으로 하고 일반적으로 다음을 포함하기 때문에 오류가 발생합니다.선언문포인터와 핸들에 32비트 데이터 형식을 사용하여 Windows API를 호출합니다. VBA 버전 6 및 이전 버전에는 포인터 또는 핸들에 대한 특정 데이터 유형이 없기 때문에긴포인터와 핸들을 참조하기 위한 32비트 4바이트 데이터 유형인 데이터 유형. 64비트 환경에서 포인터와 핸들은 8바이트 64비트 수량입니다. 이러한 64비트 수량은 32비트 데이터 유형에 보관할 수 없습니다.
메모
64비트 버전의 Microsoft Office에서 실행되는 경우에만 VBA 코드를 수정하면 됩니다.
64비트 Office에서 레거시 VBA 코드를 실행할 때의 문제는 64비트를 32비트 데이터 형식으로 로드하려고 하면 64비트 양이 잘린다는 것입니다. 이로 인해 메모리 오버런, 코드의 예기치 않은 결과 및 가능한 응용 프로그램 오류가 발생할 수 있습니다.
이 문제를 해결하고 VBA 코드가 32비트 및 64비트 환경 모두에서 올바르게 작동하도록 하기 위해 몇 가지 언어 기능이 VBA에 추가되었습니다. 그만큼이 문서 하단의 표새로운 VBA 언어 기능을 요약합니다. 세 가지 중요한 추가 사항은LongPtr유형 별칭,롱롱데이터 유형 및PtrSafe예어.
LongPtr. 이제 VBA에 변수 유형 별칭이 포함됩니다.LongPtr. 실제 데이터 유형LongPtr실행 중인 Office 버전에 따라 결정됩니다.LongPtr로 해결긴32비트 버전의 Office에서LongPtr로 해결롱롱64비트 버전의 Office에서. 사용LongPtr포인터와 핸들용.
롱롱. 그만큼롱롱데이터 형식은 64비트 버전의 Office에서만 사용할 수 있는 부호 있는 64비트 정수입니다. 사용롱롱64비트 적분의 경우. 명시적으로 할당하려면 변환 함수를 사용해야 합니다.롱롱(포함LongPtr64비트 플랫폼에서) 더 작은 정수 유형으로. 암시적 변환롱롱더 작은 적분은 허용되지 않습니다.
PtrSafe. 그만큼PtrSafe키워드는선언하다명령문은 64비트 버전의 Office에서 실행해도 안전합니다.
중요한
모두선언하다문은 이제 다음을 포함해야 합니다.PtrSafe64비트 버전의 Office에서 실행할 때의 키워드입니다. 단순히PtrSafe키워드를선언하다진술은선언하다명령문은 명시적으로 64비트를 대상으로 합니다. 64비트(반환 값 및 매개변수 포함)를 저장해야 하는 명령문 내의 모든 데이터 유형은 여전히 64비트 수량을 보유하도록 수정되어야 합니다.
메모
선언하다진술PtrSafe키워드는 권장되는 구문입니다.선언하다다음을 포함하는 진술PtrSafe32비트 및 64비트 플랫폼의 VBA7 개발 환경에서 올바르게 작동합니다.
VBA7 및 이전 버전에서 이전 버전과의 호환성을 보장하려면 다음 구성을 사용하십시오.
#If VBA7 Then Declare PtrSafe Sub... #Else Declare Sub... #EndIf
다음을 고려하세요선언하다진술 예. 수정되지 않은 실행선언하다64비트 버전의 Office에서 명령문을 사용하면 다음을 나타내는 오류가 발생합니다.선언하다진술은 다음을 포함하지 않습니다.PtrSafe예선. 수정된 VBA 예제에는PtrSafe하지만 반환 값(활성 창에 대한 포인터)이긴데이터 형식. 64비트 Office에서는 포인터가 64비트여야 하므로 이는 올바르지 않습니다. 그만큼PtrSafe한정자는 컴파일러에게선언하다명령문은 64비트를 대상으로 하므로 오류 없이 명령문이 실행됩니다. 그러나 반환 값이 64비트 데이터 형식으로 업데이트되지 않았기 때문에 반환 값이 잘려서 잘못된 값이 반환됩니다.
다음은 수정되지 않은 레거시 VBA입니다.선언하다진술 예:
함수 GetActiveWindow Lib "user32"()를 최대한 길게 선언
다음 VBA선언하다명령문 예제가 다음을 포함하도록 수정되었습니다.PtrSafe한정자이지만 여전히 32비트 반환 값을 사용합니다.
PtrSafe 함수 GetActiveWindow Lib "user32"()를 길게 선언
다시 말하지만, 다음을 수정해야 합니다.선언하다를 포함하는 진술PtrSafe한정자 및 변수가 64비트 데이터 유형을 사용하도록 64비트 수량을 보유해야 하는 명령문 내의 모든 변수를 업데이트해야 합니다.
다음은 VBA입니다.선언하다다음을 포함하도록 수정된 명령문 예PtrSafe키워드이며 적절한 64비트(LongPtr) 데이터 형식:
PtrSafe 함수 GetActiveWindow Lib "user32"()를 LongPtr로 선언
요약하면 64비트 버전의 Office에서 코드가 작동하려면 기존의 모든선언하다를 사용하는 문PtrSafe예선. 또한 이러한 내에서 모든 데이터 유형을 찾아 수정해야 합니다.선언하다새로운 64비트 호환성을 사용하기 위해 핸들이나 포인터를 참조하는 명령문LongPtr유형 별칭 및 새 형식과 64비트 정수를 보유해야 하는 유형롱롱데이터 형식. 또한 64비트 데이터 유형을 사용하려면 포인터 또는 핸들과 64비트 적분을 포함하는 사용자 정의 유형(UDT)을 업데이트하고 모든 변수 할당이 올바른지 확인하여 유형 불일치 오류를 방지해야 합니다.
32비트 및 64비트 Office 모두에서 작동하는 코드 작성
32비트와 64비트 버전의 Office 간에 포팅할 수 있는 코드를 작성하려면 새LongPtr대신 별칭을 입력하십시오.긴또는롱롱모든 포인터와 핸들 값에 대해. 그만큼LongPtr유형 별칭이 올바른 것으로 확인됩니다.긴또는롱롱실행 중인 Office 버전에 따라 데이터 유형이 달라집니다.
예를 들어 다른 논리를 실행해야 하는 경우 대규모 Excel 프로젝트에서 64비트 값을 조작해야 하는 경우 다음을 사용할 수 있습니다.Win64다음 섹션에 표시된 대로 조건부 컴파일 상수입니다.
Office 2010(32비트 또는 64비트) 및 이전 버전의 Office 모두에서 작동하는 코드 작성
새 버전과 이전 버전의 Office 모두에서 작동할 수 있는 코드를 작성하려면 새VBA7그리고Win64가정 어구컴파일러 상수. 그만큼Vba7조건부 컴파일러 상수는 VB 편집기 버전 7(Office 2010에서 제공되는 VBA 버전)에서 코드가 실행되고 있는지 확인하는 데 사용됩니다. 그만큼Win64조건부 컴파일러 상수는 실행 중인 Office 버전(32비트 또는 64비트)을 결정하는 데 사용됩니다.
#if Vba7 then ' 코드가 새 VBA7 편집기에서 실행 중입니다. #if Win64 then ' 코드가 64비트 버전의 Microsoft Office에서 실행 중입니다. #else ' 코드가 32비트 버전의 Microsoft Office에서 실행 중입니다. #end if #else ' 코드 VBA 버전 6 이하에서 실행 중임 #end if #If Vba7 Then Declare PtrSafe Sub... #Else Declare Sub... #EndIf
VBA7 언어 업데이트 요약
다음 표는 새로운 VBA 언어 추가 사항을 요약하고 각각에 대한 설명을 제공합니다.
이름 | 유형 | 설명 |
---|---|---|
PtrSafe | 예어 | 다음과 같이 주장합니다.선언하다명령문은 64비트 시스템을 대상으로 합니다. 64비트에서 필요합니다. |
LongPtr | 데이터 형식 | 매핑되는 별칭을 입력합니다.긴32비트 시스템 또는롱롱64비트 시스템에서. |
롱롱 | 데이터 형식 | 64비트 시스템에서만 사용할 수 있는 8바이트 데이터 유형입니다. 숫자형. -9,223,372,036,854,775,808에서 9,223,372,036,854,775,807 범위의 정수입니다. 롱롱64비트 플랫폼에서만 유효한 선언 유형입니다. 추가적으로,롱롱암시적으로 더 작은 유형으로 변환되지 않을 수 있습니다(예:롱롱~에게긴). 이는 실수로 포인터가 잘리는 것을 방지하기 위해 수행됩니다. 명시적 강제가 허용되므로 이전 예에서 다음을 적용할 수 있습니다.CLng~에게롱롱결과를 a에 할당긴(64비트 플랫폼에서만 유효). |
^^ | 롱롱유형 선언 문자 | 리터럴 값을 다음과 같이 명시적으로 선언합니다.롱롱. 선언해야 함롱롱최대값보다 큰 리터럴긴값(그렇지 않으면 암시적으로 다음으로 변환됩니다.더블). |
CLngPtr | 유형 변환 기능 | 간단한 표현식을LongPtr. |
CLngLng | 유형 변환 기능 | 간단한 표현식을롱롱데이터 유형(64비트 플랫폼에서만 유효). |
vb롱롱 | VarType 상수 | 롱롱정수(64비트 플랫폼에서만 유효). |
DefLngPtr | DefType 문 | 변수 범위에 대한 기본 데이터 유형을 다음과 같이 설정합니다.LongPtr. |
DefLngLng | DefType 문 | 변수 범위에 대한 기본 데이터 유형을 다음과 같이 설정합니다.롱롱. |
또한보십시오
- Visual Basic 개념 항목
지원 및 피드백
Office VBA 또는 이 설명서에 대한 질문이나 피드백이 있습니까? 참조하십시오Office VBA 지원 및 피드백지원을 받고 피드백을 제공할 수 있는 방법에 대한 안내를 받으십시오.