更新日:、 作成日:

VBA 変数の型やデータ型の一覧

はじめに

Excel VBA マクロで変数の型やデータ型の一覧を紹介します。

数値型には主に、Integer、Long、Double などがあります。それぞれの最小値と最大値を紹介します。

他にも文字列型の String、日付型の Date、ブール型の Boolean など様々な型があります。

変数には型にあった値を代入する必要があります。そうでない値を代入するとエラーになります。

データ型の一覧

VBA で使用できる型には主に次のものがあります。最小値と最大値も紹介します。

型名 型宣言文字 データ型 値の例や最小値と最大値
Byteバイト型0 ~ 255 の整数
Integer%整数型-32,768 ~ 32,767 の整数
Long&長整数型-2,147,483,648 ~ 2,147,483,647 の整数
Single!単精度浮動小数点型負:-3.402823E38 ~ -1.401298E-45
正:1.401298E-45 ~ 3.402823E38
Double#倍精度浮動小数点型負:-1.79769313486231E308 ~ -4.94065645841247E-324
正:4.94065645841247E-324 ~ 1.79769313486232E308
Currency@通貨型-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807
Decimal10 進型少数なしの最大値:79,228,162,514,264,337,593,543,950,335
少数ありの最大値:7.9228162514264337593543950335
LongLong超長整数型-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 の整数
LongPtr整数型32 ビット環境:Long と同じ
64 ビット環境:LongLong と同じ
String文字列型"文字列"
可変長:最大で約 20 億 (2^31) 文字
固定長:1 ~ 約 64 K (2^16) の文字
Date日付型西暦100年1月1日 ~ 西暦9999年12月31日 の日付と時刻
Booleanブール型True または False
Objectオブジェクト型参照型 (Worksheet やクラスなど)
Variantバリアント型なんでも
Typeユーザー定義型Type で定義した型、構造体

Decimal 型

この他に変数の型として宣言できませんが VBA で最大の桁数を持つ Decimal 型が存在します。Variant 型に「CDec 関数」を使用したときだけ使用できる型です。

Dim d As Variant
d = CDec("79,228,162,514,264,337,593,543,950,335")
Debug.Print(d) ' 79228162514264337593543950335、Decimal

UInteger 型

符号なしの UInteger を使用したいときは、CUInt 関数を作成して変換できます。

Sub 実行()
    Dim uint As Long

    uint = CUInt(-10)
    Debug.Print(uint) ' 65526

    uint = CUInt(10)
    Debug.Print(uint) ' 10
End Sub

' 符号あり Integer を 符号なし UInteger に変換します。
Function CUInt(ByVal value As Integer) As Long
    ' value が正の値のときはそのまま
    If value >= 0 Then
        CUInt = value
        Exit Function
    End If

    ' 負の値のときは UInteger の最大値 + 1 の値を加える
    CUInt = value + 65536
End Function

LongLong、LongPtr 型

エクセルのバージョンが 64 ビットのときは、LongLong 型を使用できます。

LongPtr は32 ビットでは Long 型になります。64 ビットでは LongLong 型になります。両方の環境で動作するコードを作成するときに使用します。

バージョンを確認するには「エクセルのバージョンや製品名を確認する」をご覧ください。

型宣言文字について

型宣言文字を使用するには数値の後ろに型宣言文字を付けて 10& のように入力します。

& は Long の型宣言文字なので、この 10 は Long 型になります。

% は Integer の型宣言文字ですが、VBA の数値型の基本が Integer なので省略されます。

Dim s As String

s = TypeName(10%) ' % は省略される
Debug.Print(s) ' Integer

s = TypeName(10&)
Debug.Print(s) ' Long

s = TypeName(10@)
Debug.Print(s) ' Currency

s = TypeName(10!)
Debug.Print(s) ' Single

s = TypeName(10#)
Debug.Print(s) ' Double

16 進数との組み合わせでは Integer または Long の型宣言文字のみ使用できます。

Dim s As String

s = TypeName(&H10&)
Debug.Print(s) ' Long

s = TypeName(&H10#) ' エラー
Debug.Print(s)

数値型について

数値型には Byte, Integer, Long … と数多くの型が用意されています。まずは Integer の選択を考えます。Integer が VBA の数値型の基本だからです。

Integer の範囲は -32,768 ~ 32,767 と狭いです。この範囲を超える数値を扱うときは Long や Currency などを検討します。

少数を扱うなら Single や Double を選択します。ただし、小数の計算で誤差が発生するので注意が必要です。

誤差については「VBA 数値を計算する」をご覧ください。

文字列型について

文字列には可変長と固定長があります。一般的に可変長を使用します。

String * 文字数 のように入力して固定長の文字列型を宣言できます。固定長にその文字数より長い文字列が設定されたときは切り捨てられます。

Dim 可変長 As String
可変長 = "1234"
Debug.Print(可変長) ' 1234

Dim 固定長 As String * 3 ' 最大 3 文字
固定長 = "1234"
Debug.Print(固定長) ' 123

データ型を変換する

Integer に文字列など、型に合わない値を代入するとエラーになります。

Dim 数値 As Integer
数値 = 10     ' OK
数値 = "文字" ' エラー

数値型の範囲を超える値を代入するとエラーになります。

Dim バイト As Byte
バイト = 255 ' OK
バイト = 256 ' エラー

互換性がある値なら型を自動で変換できます。

Dim バイト As Byte
Dim イント As Integer
Dim ロング As Long

ロング = 256    ' Long に 256 を代入する
イント = ロング ' Long が Integer に変換される
ロング = イント ' Integer が Long に変換される
バイト = ロング ' エラー、256 が Byte の範囲を超えている

同じように数字を数値や日付形式の文字列を日付に代入できます。

Dim 文字列 As String
Dim イント As Integer
Dim バイト As Byte

文字列 = "256"  ' 数字の 256 を代入する
イント = 文字列 ' String が Integer に変換される
文字列 = イント ' Integer が String に変換される
バイト = 文字列 ' エラー、Byte に変換されるが範囲を超えている
Dim 文字列 As String
Dim 日付 As Date

文字列 = "2000/12/31" ' 文字の日付形式を代入する
日付 = 文字列 ' String が Date に変換される
文字列 = 日付 ' Date が String に変換される

String 型は数値でも日付でも代入できるので便利です。

型変換について詳しくは次をご覧ください。

Variant 型は多用しない

Variant 型には数値でも文字でもすべての値を代入できます。便利だからと言って多用は禁物です。

型を制限することで、想定外の値が代入されるときにエラーが発生して防いでくれています。不具合を発生させないためにも適切な型を選択することが大切です。

変数の型を確認する

Variant や Object に何の型が入っているのかを確認するには「TypeName 関数」または「VarType 関数」を使用します。型名または型を表す値を取得できます。

Dim v As Variant
Dim 型名 As String

v = 1
型名 = TypeName(v)
Debug.Print(型名) ' Integer

v = "Tips"
型名 = TypeName(v)
Debug.Print(型名) ' String
Dim v As Variant
DimAs Integer

v = 1
型 = VarType(v)
Debug.Print(型) ' 2

v = "Tips"
型 = VarType(v)
Debug.Print(型) ' 8