수색…
바이트
Dim Value As Byte
Byte는 부호없는 8 비트 데이터 유형입니다. 0에서 255 사이의 정수를 나타낼 수 있으며 해당 범위를 벗어나는 값을 저장하려고하면 런타임 오류 6이 발생합니다. Overflow
. Byte는 VBA에서 사용할 수있는 유일한 고유 한 서명되지 않은 형식입니다.
Byte로 변환하는 변환 함수는 CByte()
입니다. 부동 소수점 유형의 형변환의 경우 결과는 반올림하여 반올림 한 가장 가까운 정수 값으로 반올림됩니다.
바이트 배열 및 문자열
문자열 및 바이트 배열은 간단한 대입 (변환 함수가 필요 없음)을 통해 서로 대체 될 수 있습니다.
예 :
Sub ByteToStringAndBack()
Dim str As String
str = "Hello, World!"
Dim byt() As Byte
byt = str
Debug.Print byt(0) ' 72
Dim str2 As String
str2 = byt
Debug.Print str2 ' Hello, World!
End Sub
유니 코드 문자를 인코딩 할 수 있으려면 문자열의 각 문자가 배열의 2 바이트를 차지합니다. 최하위 바이트가 먼저옵니다. 예 :
Sub UnicodeExample()
Dim str As String
str = ChrW(&H2123) & "." ' Versicle character and a dot
Dim byt() As Byte
byt = str
Debug.Print byt(0), byt(1), byt(2), byt(3) ' Prints: 35,33,46,0
End Sub
정수
Dim Value As Integer
Integer는 부호있는 16 비트 데이터 유형입니다. -32,768 ~ 32,767 범위의 정수를 저장할 수 있으며 해당 범위를 벗어나는 값을 저장하려고하면 런타임 오류 6이 발생합니다. 오버플로.
정수는 리틀 엔디안 값으로 메모리에 저장되고 음수는 2의 보수 로 표시됩니다.
일반적으로 더 작은 형식이 Type의 멤버이거나 API 호출 규칙이나 다른 이유로 인해 2 바이트가 필요하지 않으면 정수가 아닌 Long 을 사용하는 것이 더 좋습니다. 대부분의 경우 VBA는 Integers를 내부적으로 32 비트로 취급하므로 일반적으로 작은 유형을 사용하면 이점이 없습니다. 또한 Integer 형식을 사용할 때마다 발생하는 성능 저하는 Long 형식으로 자동 전송됩니다.
Integer로 변환하는 3 스팅 함수는 CInt()
입니다. 부동 소수점 유형의 형변환의 경우 결과는 반올림하여 반올림 한 가장 가까운 정수 값으로 반올림됩니다.
부울
Dim Value As Boolean
Boolean은 True 또는 False로 나타낼 수있는 값을 저장하는 데 사용됩니다. 내부적으로 데이터 유형은 False를 나타내는 0과 True를 나타내는 다른 값으로 16 비트 값으로 저장됩니다.
부울을 숫자 유형으로 형변환하면 모든 비트가 1로 설정됩니다. 따라서 부호가있는 유형의 경우 -1, 부호없는 유형 (바이트)의 경우 최대 값이됩니다.
Dim Example As Boolean
Example = True
Debug.Print CInt(Example) 'Prints -1
Debug.Print CBool(42) 'Prints True
Debug.Print CByte(True) 'Prints 255
부울로 변환 할 형변환 함수는 CBool()
입니다. 16 비트 숫자로 내부적으로 표현 되더라도 16 비트를 모두 1로 설정하더라도 오버런으로부터 안전하다.
Dim Example As Boolean
Example = CBool(2 ^ 17)
Debug.Print CInt(Example) 'Prints -1
Debug.Print CByte(Example) 'Prints 255
긴
Dim Value As Long
Long은 부호있는 32 비트 데이터 유형입니다. -2,147,483,648에서 2,147,483,647 범위의 정수를 저장할 수 있으며 해당 범위를 벗어나는 값을 저장하려고하면 런타임 오류 6이 발생합니다. 오버플로.
long은 리니지안 값으로 메모리에 저장되고 음수는 2의 보수 로 표시됩니다.
Long은 32 비트 운영 체제에서 포인터의 너비와 일치하므로 Long은 API 함수에서 포인터를 저장하고 전달하는 데 일반적으로 사용됩니다.
Long으로 변환 할 형변환 함수는 CLng()
입니다. 부동 소수점 유형의 형변환의 경우 결과는 반올림하여 반올림 한 가장 가까운 정수 값으로 반올림됩니다.
단일
Dim Value As Single
단일은 부호가있는 32 비트 부동 소수점 데이터 유형입니다. 리틀 엔디안 IEEE 754 메모리 레이아웃을 사용하여 내부적으로 저장됩니다. 따라서 데이터 유형으로 표현할 수있는 고정 된 값 범위가 없습니다. 제한된 값은 저장된 값의 정밀도입니다. Single은 -16,777,216에서 16,777,216 범위의 정수 값을 정밀도의 손실없이 저장할 수 있습니다. 부동 소수점 숫자의 정밀도는 지수에 따라 다릅니다.
대략 2 128 보다 큰 값이 지정되면 단일 값이 오버플로됩니다. 상한에 도달하기 전에 사용 가능한 정밀도가 의심 스럽지만 음의 지수로 오버 플로우되지는 않습니다.
모든 부동 소수점 숫자와 마찬가지로 동등 비교를 할 때주의를 기울여야합니다. 가장 좋은 방법은 필요한 정밀도에 적절한 델타 값을 포함시키는 것입니다.
Single로 변환 할 형변환 함수는 CSng()
입니다.
더블
Dim Value As Double
Double은 부호있는 64 비트 부동 소수점 데이터 형식입니다. Single 과 마찬가지로 Little Endian IEEE 754 메모리 레이아웃을 사용하여 내부적으로 저장되며 정밀도와 동일한 예방 조치가 취해 져야합니다. Double은 정수 값을 -9,007,199,254,740,992에서 9,007,199,254,740,992 범위의 정밀도를 잃지 않고 저장할 수 있습니다. 부동 소수점 숫자의 정밀도는 지수에 따라 다릅니다.
약 2 1024 보다 큰 값을 할당하면 Double이 오버플로됩니다. 상한에 도달하기 전에 사용 가능한 정밀도가 의심 스럽지만 음의 지수로 오버 플로우되지는 않습니다.
Double로 변환 할 형변환 함수는 CDbl()
입니다.
통화
Dim Value As Currency
Currency는 Double 과 비슷한 부호가있는 64 비트 부동 소수점 데이터 유형이지만 소수점 오른쪽의 4 자리에 더 높은 정밀도를 부여하기 위해 10,000으로 스케일됩니다. Currency 변수는 -922,337,203,685,477.5808에서 922,337,203,685,477.5807 사이의 값을 저장할 수 있으므로 32 비트 응용 프로그램에서 모든 내장 유형의 가장 큰 용량을 제공합니다. 데이터 유형의 이름에서 알 수 있듯이 스케일링이 반올림 오류를 방지하는 데 도움이되므로 통화 계산을 나타낼 때이 데이터 유형을 사용하는 것이 가장 좋습니다.
Currency로 변환하는 변환 함수는 CCur()
입니다.
날짜
Dim Value As Date
(아래의 주를 참조하지만) 날짜 타입 12 월 30 일, 1899 에포크 일부터의 일수를 나타내는 소수의 왼쪽에있는 값을 부호 64 비트 부동 소수점 데이터 유형으로 내부적으로 표현된다. 십진수 오른쪽의 값은 시간을 분수로 나타냅니다. 따라서 정수 Date는 시간 구성 요소가 12:00:00 AM이고 x.5는 시간 구성 요소가 12:00:00 PM입니다.
날짜의 유효한 값은 1 월 1 일 부터 12 월 31 일까지의 9999입니다. Double에 더 큰 범위가 있기 때문에 해당 범위를 벗어나는 값을 할당하여 날짜를 오버플로 할 수 있습니다.
따라서 Double for Date 계산과 같은 의미로 사용할 수 있습니다.
Dim MyDate As Double
MyDate = 0 'Epoch date.
Debug.Print Format$(MyDate, "yyyy-mm-dd") 'Prints 1899-12-30.
MyDate = MyDate + 365
Debug.Print Format$(MyDate, "yyyy-mm-dd") 'Prints 1900-12-30.
Date로 변환하는 3 스팅 함수는 CDate()
이며, 숫자 유형 문자열 날짜 / 시간 표현을 허용합니다. 날짜의 문자열 표현은 사용중인 현재 로케일 설정을 기반으로 변환되므로 코드가 이식 가능해야하는 경우에는 직접 형변환을 피해야합니다.
끈
문자열은 일련의 문자를 나타내며 두 가지 형태로 제공됩니다.
가변 길이
Dim Value As String
가변 길이 String은 appending 및 truncation을 허용하며 메모리에 COM BSTR 로 저장됩니다. 이것은 문자열의 길이를 바이트 단위로 저장하고 문자열 데이터 자체를 와이드 문자 (문자 당 2 바이트)로 저장하고 2 개의 null 바이트로 끝나는 4 바이트 부호없는 정수로 구성됩니다. 따라서 VBA에서 처리 할 수있는 최대 문자열 길이는 2,147,483,647 자입니다.
StrPtr()
함수로 검색 할 수있는 구조체의 내부 포인터는 길이 접두사가 아닌 데이터 의 메모리 위치를 가리 킵니다. 즉, VBA String을 문자 배열에 대한 포인터가 필요한 API 함수에 직접 전달할 수 있습니다.
길이가 변경 될 수 있기 때문에 VBA 는 변수가 할당 될 때마다 문자열에 대한 메모리를 다시 할당 하므로 반복적으로 변수 를 변경하는 프로 시저에 성능 저하가 발생할 수 있습니다.
고정 길이
Dim Value As String * 1024 'Declares a fixed length string of 1024 characters.
고정 길이 문자열은 각 문자에 대해 2 바이트로 할당되며 간단한 바이트 배열로 메모리에 저장됩니다. 일단 할당되면 (자), String의 길이는 변경 불가능합니다. 메모리에서 널 (null)로 종료 되지 않으므로 널 (null)이 아닌 문자로 할당 된 메모리를 채우는 문자열은 널 (null)로 끝나는 문자열을 예상하는 API 함수로 전달하는 데 적합하지 않습니다.
고정 길이 문자열은 기존의 16 비트 색인 제한을 초과하므로 최대 65,535 자까지만 가능합니다. 사용 가능한 메모리 공간보다 긴 값을 할당하려고해도 런타임 오류가 발생하지 않고 대신 결과 값이 잘립니다.
Dim Foobar As String * 5
Foobar = "Foo" & "bar"
Debug.Print Foobar 'Prints "Fooba"
두 유형 중 하나의 문자열로 변환하는 변환 함수는 CStr()
입니다.
LongLong
Dim Value As LongLong
LongLong은 부호있는 64 비트 데이터 형식이며 64 비트 응용 프로그램에서만 사용할 수 있습니다. 64 비트 운영 체제에서 실행되는 32 비트 응용 프로그램 에서는 사용할 수 없습니다 . -9,223,372,036,854,775,808에서 9,223,372,036,854,775,807 범위의 정수 값을 저장할 수 있으며 해당 범위를 벗어나는 값을 저장하려고하면 런타임 오류 6이 발생합니다. 오버플로.
LongLong은 음수가 2의 보수 로 표시되는 리틀 엔디안 값으로 메모리에 저장됩니다.
LongLong 데이터 형식은 VBA의 64 비트 운영 체제 지원의 일부로 도입되었습니다. 64 비트 응용 프로그램에서는이 값을 사용하여 64 비트 API에 대한 포인터를 저장하고 전달할 수 있습니다.
LongLong으로 변환 할 형변환 함수는 CLngLng()
입니다. 부동 소수점 유형의 형변환의 경우 결과는 반올림하여 반올림 한 가장 가까운 정수 값으로 반올림됩니다.
다른
Dim Value As Variant 'Explicit
Dim Value 'Implicit
Variant는 임의의 형식의 값을 저장하고 교환하는 데 사용되는 COM 데이터 형식이며 VBA의 다른 형식은 Variant에 할당 될 수 있습니다. As [Type]
으로 지정된 명시 적 유형이없는 변수는 기본적으로 Variant로 선언됩니다.
변형은 VARIANT 구조 로 메모리에 저장됩니다. VARIANT 구조 는 바이트 유형 설명자 ( VARTYPE ) 다음에 6 예약 된 바이트 다음에 8 바이트 데이터 영역으로 구성됩니다. 숫자 유형 (날짜 및 부울 포함)의 경우 기본 값은 Variant 자체에 저장됩니다. 다른 모든 유형의 경우 데이터 영역에는 기본 값에 대한 포인터가 포함됩니다.
Variant의 기본 형식은 형식 설명자에 저장된 숫자 값을 반환하는 VarType()
함수 또는 문자열 표현을 반환하는 TypeName()
함수로 확인할 수 있습니다.
Dim Example As Variant
Example = 42
Debug.Print VarType(Example) 'Prints 2 (VT_I2)
Debug.Print TypeName(Example) 'Prints "Integer"
Example = "Some text"
Debug.Print VarType(Example) 'Prints 8 (VT_BSTR)
Debug.Print TypeName(Example) 'Prints "String"
Variant는 모든 유형의 값을 저장할 수 있으므로 유형 힌트 가없는 리터럴의 할당은 아래 표에 따라 적절한 유형의 Variant로 암시 적으로 변환됩니다. 유형 힌트가있는 리터럴은 힌트 유형의 변형으로 캐스팅됩니다.
값 | 결과 유형 |
---|---|
문자열 값 | 끈 |
정수 범위의 비 부동 소수점 수 | 정수 |
장거리 비 부동 소수점 수 | 긴 |
장거리 이외의 부동 소수점 숫자 | 더블 |
모든 부동 소수점 숫자 | 더블 |
참고 : Variant (For Each 루프 또는 API 요구 사항의 반복자)를 사용해야하는 구체적인 이유가없는 한 다음과 같은 이유로 일상적인 작업에서는 형식을 일반적으로 피해야합니다.
- 유형 안전이 아니므로 런타임 오류 가능성이 높아집니다. 예를 들어 Integer 값을 포함하는 Variant는 오버플로가 아니라 자동으로 Long으로 자동 변경됩니다.
- 적어도 하나의 추가 포인터 역 참조가 필요하므로 처리 오버 헤드가 발생합니다.
- Variant를위한 메모리 요구 사항은 항상 기본 유형을 저장하는 데 필요한 것보다 최소한 8 바이트 높다.
Variant로 변환하는 변환 함수는 CVar()
입니다.
LongPtr
Dim Value As LongPtr
LongPtr은 64 비트 플랫폼을 지원하기 위해 VBA에 도입되었습니다. 32 비트 시스템에서는 Long으로 처리되고 64 비트 시스템에서는 LongLong으로 처리됩니다.
주된 용도는 두 아키텍처에 포인터를 저장하고 전달할 수있는 이식성있는 방법을 제공하는 것입니다 ( 컴파일 타임에 코드 동작 변경 참조).
API 호출에서 사용할 때 메모리 주소로 운영 체제에서 처리되지만 VBA는 서명 된 형식 (따라서 서명되지 않은 부호있는 오버플로)을 처리한다는 점에 유의해야합니다. 이러한 이유로 LongPtrs를 사용하여 수행 된 포인터 연산은 >
또는 <
비교를 사용하면 안됩니다. 이 "quirk"을 사용하면 메모리의 유효한 주소를 가리키는 간단한 오프셋을 추가하면 오버플로 오류가 발생할 수 있으므로 VBA에서 포인터로 작업 할 때는주의해야합니다.
LongPtr로 변환 할 형변환 함수는 CLngPtr()
입니다. 부동 소수점 형식의 캐스트의 경우 결과는 가장 가까운 정수 값으로 반올림되고 반올림됩니다 (일반적으로 메모리 주소이기 때문에 부동 소수점 계산의 할당 대상으로 사용하는 것이 좋지만 위험은 거의 없습니다).
소수
Dim Value As Variant
Value = CDec(1.234)
'Set Value to the smallest possible Decimal value
Value = CDec("0.0000000000000000000000000001")
Decimal
데이터 유형의 하위 유형으로 만 사용할 수 있습니다 Variant
, 그래서 당신은 포함 할 필요가있는 변수를 선언해야 Decimal
A와 Variant
한 후 지정 Decimal
사용하여 값 CDec
기능을. Decimal
키워드는 예약어 (VBA가 결국 형식에 대한 일류 지원을 추가 할 것을 제안 함)이므로 Decimal
을 변수 또는 프로 시저 이름으로 사용할 수 없습니다.
Decimal
형식은 부모 Variant에 필요한 바이트 외에도 14 바이트의 메모리가 필요하며 소수점 이하 28 자리까지 저장할 수 있습니다. 소수 자릿수가없는 숫자의 경우 허용되는 값의 범위는 -79,228,162,514,264,337,593,543,950,335 ~ +79,228,162,514,264,337,593,543,950,335입니다. 소수점 이하 28 자리까지의 숫자의 경우 허용되는 값의 범위는 -7.9228162514264337593543950335에서 +7.9228162514264337593543950335까지입니다.