サーチ…


バイト

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

Unicode文字をエンコードできるようにするには、文字列内の各文字は配列内の最下位バイトを先頭に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バイトである必要がある場合を除き、一般的にIntegerではなくLongを使用することを勧めします。ほとんどの場合、VBAは整数を内部的に32ビットとして扱います。したがって、通常は小さな型を使用する利点はありません。さらに、整数型が使用されるたびに、Longとしてサイレントキャストされるため、パフォーマンスペナルティが発生します。

Integerに変換するキャスト関数はCInt()です。浮動小数点型からのキャストの場合、結果は四捨五入された最も近い整数値に丸められます。

ブール

Dim Value As Boolean

ブール値は、TrueまたはFalseのいずれかで表すことができる値を格納するために使用されます。内部的には、データ型は、Falseを表す0とTrueを表すその他の値を持つ16ビット値として格納されます。

ブールが数値型にキャストされると、すべてのビットが1に設定されることに注意してください。これにより、符号付き型の場合は-1、符号なし型(Byte)の場合は最大値になります。

Dim Example As Boolean
Example = True
Debug.Print CInt(Example)  'Prints -1
Debug.Print CBool(42)      'Prints True
Debug.Print CByte(True)    'Prints 255

Booleanに変換するキャスト関数は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が発生します。オーバーフロー。

ロングはリトルエンディアン値としてメモリに格納され、ネガは2の補数で表されます。

Longは32ビットオペレーティングシステムのポインタの幅と一致するため、LongsはAPI関数との間でポインタを格納および渡すためによく使用されることに注意してください。

Longに変換するキャスト関数はCLng() 。浮動小数点型からのキャストの場合、結果は四捨五入された最も近い整数値に丸められます。

シングル

Dim Value As Single

Singleは符号付き32ビット浮動小数点データ型です。 リトルエンディアンの IEEE 754メモリレイアウトを使用して内部的に格納されます。そのため、データ型で表現できる固定値の範囲はありません。制限されているのは、格納された値の精度です。 Singleは-16,777,216から16,777,216の範囲の整数値を精度の損失なく格納できます。浮動小数点数の精度は指数に依存します。

およそ2 128を超える値が割り当てられた場合、Singleはオーバーフローします。上限に達する前に、使用可能な精度が疑わしいものになりますが、負の指数でオーバーフローしません。

すべての浮動小数点数と同様に、等価比較を行うときは注意が必要です。必要な精度に適したデルタ値を含めることがベストプラクティスです。

Singleに変換するキャスト関数はCSng()です。

ダブル

Dim Value As Double

Doubleは、符号付き64ビット浮動小数点データ型です。 シングルと同様、 リトルエンディアンの IEEE 754メモリレイアウトを使用して内部的に格納され、精度に関する同じ注意が必要です。 Doubleは、-9,007,199,254,740,992〜9,007,199,254,740,992の範囲の整数値を精度の損失なく格納できます。浮動小数点数の精度は指数に依存します。

約2 1024を超える値が割り当てられた場合、Doubleはオーバーフローします。上限に達する前に、使用可能な精度が疑わしいものになりますが、負の指数でオーバーフローしません。

Doubleに変換するキャスト関数はCDbl()です。

通貨

Dim Value As Currency

通貨は、 Doubleと同様の符号付き64ビット浮動小数点データ型ですが、小数点以下4桁の精度を高めるために10,000 にスケールされています。通貨変数には、-922,337,203,685,477.5808から922,337,203,685,477.5807までの値を格納でき、32ビットアプリケーションでのイントリンシック型の中で最大の容量を与えます。データ型の名前が示すように、スケーリングが丸め誤差を回避するのに役立つので、このデータ型を金銭計算を表すときに使用することをお勧めします。

通貨に変換するキャスティング関数はCCur()です。

日付

Dim Value As Date

(下記の注を参照してくださいが)Date型12月30 、1899年のエポック日からの日数を表し、小数点の左側の値が符号付き64ビット浮動小数点データ型として内部的に表現されています。小数点の右側の値は、分数の日として時刻を表します。したがって、整数のDateは12:00:00 AMの時間コンポーネントを持ち、x.5は12:00:00 PMの時間コンポーネントを持ちます。

日付の有効値は、1月1 100 12月31 9999ダブルより大きな範囲を有するので、その範囲外の値を割り当てることによって日付をオーバーフローさせることができるの間です。

そのため、 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に変換するキャスト関数は、任意の数値型文字列の日付/時刻表現を受け入れるCDate()です。日付の文字列表現は使用されている現在のロケール設定に基づいて変換されるため、コードが移植可能である場合は直接キャストを避ける必要があることに注意することが重要です。

文字列

文字列は一連の文字を表し、2つの味があります。

可変長

Dim Value As String

可変長文字列は、追加および切り捨てが可能で、COM BSTRとしてメモリに格納されます。これは、文字列データの長さをワイド文字(1文字あたり2バイト)とし、2バイトのNULLバイトで終わる文字列データの長さを格納する4バイトの符号なし整数で構成されます。したがって、VBAで処理できる文字列の最大長は2,147,483,647文字です。

構造体への内部ポインタ( StrPtr()関数で取得可能StrPtr()は、長さのプレフィックスではなく、 データのメモリ位置を指します。つまり、文字配列へのポインタを必要とするAPI関数に直接VBA Stringを渡すことができます。

長さが変わる可能性があるため、VBA は、変数が割り当てられるたびに文字列のメモリを再割り当てします。これにより変数を繰り返し変更するプロシージャにパフォーマンス上のペナルティが課される可能性があります。

固定長

Dim Value As String * 1024    'Declares a fixed length string of 1024 characters.

固定長文字列は、各文字に対して2バイトずつ割り当てられ、単純なバイト配列としてメモリに格納されます。一旦割り当てられると、Stringの長さは不変です。それらはメモリ内でNULL終端されていないため、ヌル以外の文字で割り当てられたメモリを満たす文字列は、ヌル終了文字列を要求するAPI関数に渡すのには適していません。

固定長の文字列は、従来の16ビットのインデックス制限を引き継ぎます。したがって、最大65,535文字の長さしか設定できません。使用可能なメモリ空間より長い値を割り当てようとしても、ランタイムエラーは発生しません。代わりに、結果の値は単に切り捨てられます。

Dim Foobar As String * 5
Foobar = "Foo" & "bar"
Debug.Print Foobar          'Prints "Fooba"

いずれかの型のStringに変換するキャスト関数は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が発生します。オーバーフロー。

LongLongsはリトルエンディアン値としてメモリに格納され、ネガは2の補数として表されます。

LongLongデータ型は、VBAの64ビットオペレーティングシステムサポートの一部として導入されました。 64ビットアプリケーションでは、この値を使用して64ビットAPIへのポインタを格納して渡すことができます。

LongLongに変換するキャスト関数はCLngLng()です。浮動小数点型からのキャストの場合、結果は四捨五入された最も近い整数値に丸められます。

バリアント

Dim Value As Variant    'Explicit
Dim Value               'Implicit

バリアントは、任意の型の値の格納および交換に使用されるCOMデータ型であり、VBA内の他の型はバリアントに割り当てることができます。 As [Type]指定された明示的な型を持たない宣言された変数は、デフォルトでVariantになります。

バリアントは、 VARIANT構造体としてメモリに格納されます。VARIANT 構造体には、バイト型ディスクリプタ( VARTYPE )とそれに続く6つの予約バイト、次に8バイトのデータ領域が含まれます。数値型(日付とブール値を含む)では、基本値はバリアント自体に格納されます。他のすべての型の場合、データ領域には、基になる値へのポインタが含まれます。

ここに画像の説明を入力

バリアントの基になる型は、型記述子に格納された数値を返す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"

バリアントは任意のタイプの値を格納できるため、 タイプヒントのないリテラルからの割り当ては、以下の表に従って適切なタイプのバリアントに暗黙的にキャストされます。タイプヒントを持つリテラルは、ヒントタイプのバリアントにキャストされます。

結果のタイプ
文字列値文字列
整数範囲の非浮動小数点数整数
ロングレンジの非浮動小数点数長いです
ロングレンジ外の非浮動小数点数ダブル
すべての浮動小数点数ダブル

注意:バリアント(For EachループまたはAPI要件のイテレータ)を使用する特別な理由がない限り、通常、次の理由でルーチンのタスクでは型を避ける必要があります。

  • 型安全ではないため、実行時エラーの可能性が高くなります。たとえば、Integer値を保持するVariantは、オーバーフローするのではなく、自動的にLongに変更されます。
  • それらは、少なくとも1つの追加ポインタ逆参照を必要とすることによって処理オーバヘッドを導入する。
  • Variantのメモリ要件は、基本となる型を格納するために必要なメモリ量よりも常に少なくとも 8バイト高くなります。

Variantに変換するキャスティング関数はCVar()です。

LongPtr

Dim Value As LongPtr

LongPtrは、64ビットプラットフォームをサポートするためにVBAに導入されました。 32ビットシステムではLongとして扱われ、64ビットシステムではLongLongとして扱われます。

主な用途は、両方のアーキテクチャにポインタを格納して渡す移植可能な方法を提供することです( コンパイル時のコード動作の変更を参照)。

API呼び出しで使用される場合、オペレーティングシステムによってメモリアドレスとして扱われますが、VBAはそれを符号付きの型(したがって、符号なしの符号付きオーバーフローの対象)として扱うことに注意してください。このため、LongPtrsを使用して実行されるポインタ演算では、 >または<比較を使用しないでください。この "quirk"では、メモリ内の有効なアドレスを指す単純なオフセットを追加するとオーバーフローエラーが発生する可能性もあるため、VBAでポインタを操作する場合は注意が必要です。

LongPtrに変換するキャスト関数はCLngPtr()です。浮動小数点型からのキャストの場合、結果は最も近い整数値に丸められ、0.5が切り上げられます(通常はメモリアドレスであるため、浮動小数点計算の割り当てターゲットとして使用するのが最も危険です)。

小数

Dim Value As Variant
Value = CDec(1.234)

'Set Value to the smallest possible Decimal value
Value = CDec("0.0000000000000000000000000001")

Decimalデータ型は、のサブタイプとしてのみ使用可能ですVariant 、あなたが含まれている必要があります任意の変数を宣言しなければなりませんDecimalとして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です。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow