和風スパゲティのレシピ

日本語でコーディングするExcelVBA

変数のデータ型一覧と宣言方法まとめ

ExcelVBAで使用できる変数の型(データ型)の一覧と、
各変数を宣言・使用するサンプルコードを解説します。

変数の型(データ型)一覧表

主要な変数の型(As ○○)一覧

ExcelVBAで扱うことのできる主な変数の型(データ型)は以下の通りです。

種別 型名 格納する値
データ型 Long 数値(整数)
データ型 Double 数値(×÷に強い小数)
データ型 Currency 数値(+ーに強い小数)
データ型 String 文字列
データ型 Date 日付
データ型 Boolean True/False
オブジェクト型 Workbook Excelブック
オブジェクト型 Worksheet ワークシート
オブジェクト型 Range セルまたはセル範囲
オブジェクト型 Shape 図形やグラフなど
オブジェクト型 AutoFilter オートフィルター
オブジェクト型 ListObject テーブル
オブジェクト型 Collection コレクション
オブジェクト型 Dictionary ディクショナリー(連想配列)
オブジェクト型 Object すべてのオブジェクトを格納可
どちらも格納可 Variant 上記のすべての型を格納可
どちらも格納可 配列(Array) 上記の型を複数セットで格納


これらを変数として宣言する場合は、
以下のように「Dim 変数名 As 型名」というコードを記述します。

Dim 数値 As Long
Dim 文字列 As String
Dim セル As Range
Dim ワークシート As Worksheet

 
ちなみに「データ型」といった場合、

  • 広義:RangeやWorksheetも含めた変数の型すべて。
  • 狭義:そのうちオブジェクト型でないもの。プリミティブ型とも呼ぶ。

この2つの意味がありますので、文脈から推測して読み分けてください。
Range型やWorksheet型を「データ型」と呼んでも間違いではありません。

全データ型(プリミティブ型)一覧

以下はExcelVBAで扱えるデータ型(プリミティブ型)の全一覧です。

と言っても上記の「主要な変数型」にないものは特に使用する必要はありませんので、
太字の型だけ覚えておけば十分です。

型名 名称 格納値(詳細)
Integer 整数型 -32,768 ~ 32,767の整数
Long 長整数型 -2,147,483,648 ~ 2,147,483,647の整数
LongLong 64ビット整数型 -9223372036854775808 ~ 9223372036854775807の整数
Single 単精度浮動小数点数型 -3.402823E38 ~ -1.401298E-45(負の値)
1.401298E-45 ~ 3.402823E38(正の値)
Double 倍精度浮動小数点数型 -1.79769313486232E308 ~ -4.94065645841247E-324(負の値)
4.94065645841247E-324 ~ 1.79769313486232E308(正の値)
Currency 通貨型(固定小数点型) -922,337,203,685,477.5808 ~ 922,337,203,685,477.00
String 文字列型 最大約20億文字まで
Date 日付型 100/1/1 ~ 9999/12/31まで(時刻含む)
Byte バイト型 0~255(8ビット=1バイト)分の正の整数
Boolean ブール型 真(True)/偽(False)
Object オブジェクト型 オブジェクト
Variant バリアント型 すべてのデータ

 

全オブジェクト型一覧

全オブジェクト型の一覧はこちらです。と言いたいところなのですが、
実はオブジェクト型は無数にあります。

例えばセルの背景色を設定するコードにおいて、

Dim 背景色オブジェクト As Interior
Set 背景色オブジェクト = Range("A1").Interior

背景色オブジェクト.Color = RGB(255, 0, 0)

このように「Interiorオブジェクト」を変数にすることもできます。


ExcelVBAにおいて、
直後に「.」を入力できるコードはすべて該当のオブジェクト型を持っています。

Workbooks("○○").Worksheets("△△").Range("A1").Interior.Color = RGB(255, 0, 0)
' ↑Workbook型、Worksheet型、Range型、Interior型 すべてオブジェクト型
'    最後の「Color」だけは後ろに「.」を打てず、代わりに=で代入する。これをプロパティと呼ぶ。

Dim 並び替え設定 As Sort
Set 並び替え設定 = Range("A1:E100").Sort
' ↑Sortも実はオブジェクトなので、やろうと思えば変数に入れることができる

 

このあたりの話は、とりあえず
「なんにでもオブジェクト型は存在し、変数にいれようと思えば入れられる」
とだけ理解しておけば十分です。

通常使う上では、再掲する以下の変数だけでほとんどの処理は実装可能です。

型名 格納する値
Workbook Excelブック
Worksheet ワークシート
Range セルまたはセル範囲
Shape 図形やグラフなど
AutoFilter オートフィルター
ListObject テーブル
Collection コレクション
Dictionary ディクショナリー(連想配列)
Object すべてのオブジェクトを格納可

 

変数の宣言方法 - Dim・As・Setの使い方

各型の変数を宣言(定義)する場合は、
以下のように「Dim 変数名 As 型名」というコードを記述します。

Dim 数値 As Long
Dim 文字列 As String
Dim セル As Range
Dim ワークシート As Worksheet

 
変数を使って処理を行う場合、
「データ型」の変数は「=」を使って代入を行います。

Dim 数値 As Long
数値 = 1

 
変数内の値を使用する場合は変数名をそのまま記述することで、
そこに格納された値を使用することができます。

Dim 数値 As Long
数値 = 1

MsgBox 数値 ' 「1」が表示されます。

Range("A1").Value = 数値
' A1セルに「1」が入力されます。

 

続いてセルやシートなどのオブジェクト型変数は、
代入する場合は「Set」を頭につける必要があります。

Dim セル As Range
Set セル = Range("A1")

Dim シート As Worksheet
Set シート = Worksheets("○○")

オブジェクト型変数を使用する場合は、主に以下2つの使い方をします。


① オブジェクトの持つプロパティへ代入・読取を行う

例えばRange型変数のValueプロパティを使って、
セルの値を入力したり、セルの値を読み取るコードがこちらです。

Dim セル As Range
Set セル = Range("A1")

セル.Value = 1 ' A1セルに「1」が入力されます。

MsgBox セル.Value ' A1セルの値「1」がMsgBoxに表示されます。

 
Range("A1")を変数「セル」にSetしておくことで、
「Range("A1").Value」を「セル.Value」に書き換えることができる
ととらえておけばOKです。


② オブジェクトの持つメソッドを実行する

例えばWorksheet型変数を用いて、
コピーやシートの削除を行うコートがこちらです。

Dim シート As Worksheet
Set シート = Worksheets("○○")

シート.Copy ' ○○シートを新規ブックにコピー
シート.Delete ' ○○シートを削除

こちらも先ほどのプロパティと同様、
「Worksheets("○○").Copy」を「シート.Copy」に書き換えることができる
ととらえておけばOKです。

「型が一致しません。」エラーについて

数値に文字列を代入してしまったり、シートにセルをSetしてしまったり、
代入する値のデータ型が変数のデータ型と一致しない場合は、

実行時エラー '13':
型が一致しません。

エラーとなります。

Dim 数値 As Long
数値 = "あいう" ' ← 「型が一致しません。」 エラー

Dim セル As Range
Set セル = Worksheets("○○")  ' ← 「型が一致しません。」 エラー

 

このエラーが発生したら代入する値と代入先のデータ型が違ったと解釈してください。

主に

  • 数値が入るべきところに文字列が入った
  • セルの値がエラー値(エラー型)でそれが文字列や数値に入った

あたりで発生することが多いエラーです。


ただし、VBAには「データ型を変換できるなら自動変換する」仕組みがあるため、

Dim 文字列 As String
文字列 = 1000 ' ← これはOK

このように文字列に数値を入れても自動で"1000"に変換して受け取ってくれます。

これを「暗黙の型変換」と呼びますので、
名称は忘れていいですが、この仕様は覚えておきましょう。

主要な変数の型(データ型)のサンプルコード集

最後に主要なデータ型のサンプルコード集を記載します。
変数を扱う際の参考にしてください。

Long型(整数)

Dim 整数 As Long
整数 = 100

' セル値を格納
Dim 売上 As Long
売上 = Cells(R, 5)

' For文のカウンタとして利用
Dim 最終行 As Long: 最終行 = Worksheets("○○").UsedRange.Rows.Count
Dim R As Long
For R = 2 To 最終行

整数値にはLong型を用います。

値が小さかったとしてもInteger型を用いる必要はなく、
すべてLong型を使っておけばOKです。

Double型(小数)

Dim 小数 As Double
小数 = 0.1

' 小数の計算が必要な場合に使用
Dim 平均売上 As Double
平均売上 = 売上合計 / 取引回数

小数は通常Double型を用います。

数値を入力したセル値もDouble型のため、
セルと値をやり取りする場合はDouble型が一番安定します。

Currency型(+-が得意で×÷が苦手な小数)

コンピュータは実は小数の足し算と引き算が苦手で、
0.1+0.2=0.3の判定すら失敗します。

If 0.1 + 0.2 = 0.3 Then
    MsgBox "一致" ' ← なんとこれは実行されません。
End If

 
このように「キリのよい小数の足し算引き算を行う」場合は、
Double型ではなくCurrency型を用いると安定します。

Sub 小数点誤差の検証()
    
    Dim dbl小数1 As Double
    Dim dbl小数2 As Double
    Dim crr小数1 As Currency
    Dim crr小数2 As Currency
    
    dbl小数1 = 0.1
    dbl小数2 = 0.2
    
    crr小数1 = 0.1
    crr小数2 = 0.2
    
    If dbl小数1 + dbl小数2 = 0.3 Then
        MsgBox "一致" ' ← !実行されない!
    End If
    
    If crr小数1 + crr小数2 = 0.3 Then
        MsgBox "一致" ' ← 実行される
    End If

End Sub

 
ただし、Currency型は小数点第4位しか持てないため、
割り算と掛け算の精度はDouble型よりだいぶ落ちます。

Dim crr小数 As Currency
crr小数 = 1 / 3

If crr小数 * 3 = 1 Then
    MsgBox "一致" ' ← 実行されない
End If

このように「1/3 × 3 = 1」すら失敗しますので、
どちらの小数を使うか、慎重に検討してください。

String型(テキスト・文字列)

Dim 文字列 As String
文字列 = "あいうえお"

' セル値を格納
Dim 商品名 As Long
商品名 = Cells(R, 4)

文字列を扱う場合はString型を使用します。

前述の通り数値も受け取ってくれるため、
エラーが起きづらく、使いやすいデータ型です。

格納上限も20億文字と、ほぼ無限と思って差し支えありません。

Date型(日付)

Dim 日付 As Date
日付 = DateSirial(2025, 9, 1)

' セル値を格納
Dim 販売日 As Date
販売日 = Cells(R, 1)

日付を扱い場合はDate型を使用します。

Excelとは違い、100/1/1以降の値を扱うことができます。

Boolean型(True/False)

Dim 何らかの判定 As Boolean
何らかの判定 = True

True/Falseを扱う場合はBoolean(ブーリアン・ブール)型を使用します。


主にフラグ変数として用いることが多い変数です。

以下のように変数名の頭に「is」をつけておくと読みやすくなります。

Dim シート番号 As Long
Dim 検索シート名 As String
検索シート名 = "○○データ"

Dim isシートが存在 As Boolean
For シート番号 = 1 To Worksheets.Count
    If Worksheets(シート番号).Name = 検索シート名 Then
        isシートが存在 = True
        Exit For
    End If
Next

If isシートが存在 = False Then
   MsgBox "データシートがブック内にありません。"
   Exit Sub
End If

Workbook型(ブック)

Dim 処理ブック As Workbook
Set 処理ブック = Workbooks("○○.xlsx")

処理ブック.Worksheets(1).Activate ' 第1シートをActiveに
処理ブック.Worksheets(1).Range("A1").Value = 1 ' 第1シートA1セルに1を入力

ブック(Excelファイル)はWorkbook型変数にSetすることができます。

複数のブックを扱うマクロを書くときは、
変数に格納しておくとコードの記述が楽になります。

Worksheet型(ワークシート)

Dim 処理シート As Worksheet
Set 処理シート = Thisworkbook.Worksheets("○○")

処理シート.Range("A1").Value = 1 ' 対象シートのA1セルに1を入力
処理シート.Copy ' 対象シートを新規ブックにコピー

ワークシートはWorksheet型変数にSetすることができます。

これはコードを読みやすくする以上にひとつ重要な機能を持ち、
Worksheet型変数にSetすることで以下の選択肢を表示できます。

Worksheetのメンバー候補

Worksheets("○○")という記述ではこの選択肢が出ないため、
プロパティやメソッドの入力が面倒です。

コードも読みやすく取り違えも減らせるうえ、この選択肢で書きやすくもなります。

VBAを書くときは、処理するワークシートは必ず変数に入れるようにしましょう。


またWorksheet型に限り、変数名をあらかじめ設定しておく、
「シートオブジェクト名」という機能がExcelVBAに備わっています。

この機能を使うと、DimやSetのコードを記載することなく、
いきなり「データシート.Range("A1")」の記述ができる
ようになります。


これもExcelVBAを効率よくプログラミングする上で必須の機能ですので、
この機会に覚えてしまってください。

詳細はこちらをどうぞ。


Range型(セル・セル範囲)

Dim セル As Range
Set セル = Range("A1")

セル.Value = 1 ' セルの値を1に
セル.Interior.Color = RGB(255, 0, 0) ' セルの背景色を赤に

セルやセル範囲を扱うにはRange型変数を利用します。

単独セルでも複数セルでも、どちらもRange型を使うことになります。

Dim セル範囲 As Range
Set セル範囲 = Range("A1:C3")

 
セル・セル範囲の取得方法は様々な方法がありますので、
VBAに慣れてきたら、より便利な方法がないかを探してみてください。

' A1セルの取得
Dim セル As Range
Set セル = Range("A1")
Set セル = Cells("A1")

' A1:C3セル範囲の取得
Dim セル範囲 As Range
Set セル範囲 = Range("A1:C3")
Set セル範囲 = Range(Cells(1, 1), Cells(3, 3))
Set セル範囲 = Range("A1").Resize(3, 3)

' 何らかのオブジェクトを活用したセルの取得
Set オートフィルターの設置範囲 = Worksheets("○○").AutoFilter.Range
Set テーブルの設置範囲 = Worksheets("○○").ListObject(1).Range
Set 範囲内の空セル = セル範囲.SpecialCells(xlCellTypeBlanks)

Variant型(何でもはいる変数)

Dim 何でもはいる変数 As Variant
何でもはいる変数 = 1
何でもはいる変数 = "あいう"

データ型を指定せず、なんでも代入できる変数を扱う場合は、
Variant型変数を使用します。

「As ○○」を省略した場合は、このVariant型になります。


Variant型にはオブジェクト型を入れることもでき、
オブジェクトを入れたい場合はSetを記述して代入します。

Dim Variant変数 ' ← Asを省略時はVariantになる

Variant変数 = Range("A1") ' セルの値が入ります。
Set Variant変数 = Range("A1") ' セルそのものが入ります。

といってもこのような使い方は危険で紛らわしいため、
よほどの理由がない限りはオブジェクトをSetしないようにしてください。

Variant変数は「数値と文字列どちらもありうる値」に使用するのが基本です。

配列やコレクション(Array/Collection/Dictionary)

ExcelVBAを学習して複雑な処理を書くようになってくると、
「複数の変数をまとめて管理したい」という状況が訪れます。

その時は、配列やコレクションを使用して、
ひとつの変数に複数の値をまとめて入れる方法を用いることになります。

Dim 配列(1 To 5) ' 5つの箱をもつ配列変数を用意

' それぞれの箱にデータを格納
配列(1) = "みかん"
配列(2) = "りんご"
配列(3) = "いちご"
Dim コレクション As New Collection ' 要素数がわからないときはコレクションを使用

' データをコレクションに格納していく
コレクション.Add "みかん"
コレクション.Add "りんご"
コレクション.Add "いちご"

' 取り出すときは配列と同じように
MsgBox コレクション(1) ' ← 「みかん」が表示されます。

必要になったらそれぞれ専用の記事で学習してみてください。

入門用の勉強会アーカイブもありますので、
よろしければご視聴ください。


以上で変数の型(データ型)の解説を終わります。

データ型は奥が深く、理解を深めるには勉強が必要になります。


普段からこまめに変数を宣言して型の扱いに慣れておくことが、
データ型の理解を深める近道
になると思います。

積極的に変数を使ったコードを書いて、
読みやすく安定したマクロを作っていきましょう。