各データ型の特徴と変数宣言
<< 変数の宣言 :前の記事
前回は、変数の宣言について解説しました。ここまでで変数を宣言する方法や必要性が理解できたかと思います。
今回は、各データ型の特徴と変数宣言について事例を交えて解説していきますが、事例ではまだ解説していないステートメントやVBA関数を利用しています。そちらについては追々解説していきますので、今回は事例のSampleプロシージャの実行結果の確認に留め、各データ型の特徴を重点的に理解するようにしましょう。
目次
変数のデータ型
まずは変数のデータ型にどのようなものがあるかの確認です。これから以下のデータ型を利用した事例を紹介します。
指定方法 | データ型 | バイト数 | 値の範囲 |
---|---|---|---|
Byte | バイト型 | 1 | 0~255 |
Boolean | ブール型 | 2 | 真(True)又は偽(False) |
Integer | 整数型 | 2 | -32,768~32,767 |
Long | 長整数型 | 4 | -2,147,483,648~2,147,483,647 |
Currency | 通貨型 | 8 | -922,337,203,685,477.5808~922,337,203,685,477.5807 |
Single | 単精度浮動小数点数型 | 4 | -3.402823E38~-1.401298E-45(負の数) 1.401298E-45~3.402823E38(正の数) |
Double | 倍精度浮動小数点数型 | 8 | -1.7976931348623E308~-4.94065645841247E-324(負の数) 4.94065645841247E-324~1.79769313486232E308(正の数) |
Date | 日付型 | 8 | 西暦100年1月1日~西暦9999年12月31日 |
Object | オブジェクト型 | 4 | オブジェクトを参照するためのアドレス |
String | 文字列型 | 10+文字列の長さ | 0~2GB |
Variant | バリアント型 | 16 | 倍精度浮動小数点数型の範囲と同じ |
Variant | バリアント型 | 22バイト+文字列の長さ | 可変長の文字列型の範囲と同じ。 |
型宣言文字
型宣言文字とは、変数、定数、関数名の末尾に付けるデータ型を示す文字のことを言います。こちらを利用すると型宣言の簡素化が図れますが、可読性が悪くなるので、利用しないようにしましょう。たまにネット上のサンプルコードで記述されていることもあるので、プログラムの内容が読めるように覚えておくのもいいかと思います。
型宣言文字 | 変数のデータ型 |
---|---|
% | 整数型(Integer) |
& | 長整数型(Long) |
! | 単精度浮動小数点型(Single) |
# | 倍精度浮動小数点型(Double) |
@ | 通貨型(Currency) |
$ | 文字列型(String) |
以下は、型宣言文字を利用した型宣言になります。こちらでは、変数のデータ型を調べるTypeName関数を利用して設定した通りに型宣言できているか確認しています。
Sub sample()
Dim a% '整数型(Integer)
Dim b& '長整数型(Long)
Dim c! '単精度浮動小数点型(Single)
Dim d# '倍精度浮動小数点型(Double)
Dim e@ '通貨型(Currency)
Dim f$ '文字列型(String)
MsgBox "変数aのデータ型:" & TypeName(a) & vbCrLf & _
"変数bのデータ型:" & TypeName(b) & vbCrLf & _
"変数cのデータ型:" & TypeName(c) & vbCrLf & _
"変数dのデータ型:" & TypeName(d) & vbCrLf & _
"変数eのデータ型:" & TypeName(e) & vbCrLf & _
"変数fのデータ型:" & TypeName(f)
End Sub
実行結果
数値型の宣言
バイト型(Byte)
バイト型(Byte)の変数は、8ビット(1バイト)の変数です。0~255の範囲の単精度の正の数値を格納します。
事例
以下の事例では、変数aにバイト型(Byte)を宣言し「256」の値を設定しています。こちらを実行すると実行時エラーとなってしまいます。原因としては、バイト型の値の範囲が0~255なのに対して256の値を設定しているからです。
このように値の範囲を超えて設定しようとすると、オーバーフローとなり実行時エラーが表示されてしまいますので、ご注意ください。
Sub sample()
Dim a As Byte
a = 256
MsgBox a
End Sub
実行結果
実行時エラーの「実行時エラー'6':オーバーフローしました。」が表示されます。
整数型(Integer)
整数型(Integer)の変数は、16ビット(2バイト)の変数で、-32,768~32,767の範囲の値をとります。整数型の型宣言文字はパーセント記号(%)です。
Sub sample()
Dim a As Integer
a = 10000
End Sub
整数型の変数を列挙型の値として使うこともできます。列挙値には、プログラムの内部において特定の意味を持つ、一定数の数値を定義できます。列挙値を用いることによって、一定数の選択肢を表現しやすくなります。
たとえば、0 を黒、1 を白と定義しておきます。列挙型のそれぞれの値をConstステートメントで定数として定義すると、読みやすいコードを作成できます。定数にはついては後ほど解説しますので、こちらでは列挙型の値として利用できることを覚えましょう。
長整数型(Long)
長整数型(Long)の変数は、32ビット(4バイト)の変数です。-2,147,483,648~2,147,483,647の範囲の値をとります。長整数型の型宣言文字はアンパサンド(&)です。
Sub sample()
Dim a As Long
a = 100000000
End Sub
単精度浮動小数点数型(Single)
単精度浮動小数点数型(Single)の変数は、IEEE32ビット(4バイト)の浮動小数点数の変数です。負の値は-3.402823E38~-1.401298E-45、正の値は1.401298E-45~3.402823E38の範囲の値をとります。単精度浮動小数点数型の型宣言文字はエクスクラメーションマーク(!)です。
Sub sample()
Dim a As Single
a = 1000000
End Sub
値の範囲のE38は1038、E-45は10-45の意味になります。
倍精度浮動小数点数型(Double)
倍精度浮動小数点数型(Double)の変数は、IEEE64ビット(8バイト)の浮動小数点数の変数です。負の値は-1.79769313486231E308~-4.94065645841247E-324、正の値は4.94065645841247E-324~1.79769313486232E308の範囲の値をとります。倍精度浮動小数点数型の型宣言文字はシャープ記号(#)です。
Sub sample()
Dim a As Double
a = -1000000
End Sub
値の範囲のE308は10308、E-324は10-324の意味になります。
事例
こちらでは、変数aと変数bに整数型(Integer)、変数cに単精度浮動小数点数型(Single)を宣言し、変数aと変数cに「123.4」、変数bに「123.5」の値を設定しています。こちらを実行すると変数aには「123」が、変数bには「124」が、変数cには「123.4」が格納されます。
結果を見るとデータ型によって得られる値が異なっているのが分かるかと思います。変数cの単精度浮動小数点数型(Single)は、小数点を含む数値も格納できるため、目的通り「123.4」が格納されました。
変数aと変数bは整数型(Integer)で宣言されているため、整数値のみ格納することができます。実行結果を見てもそれぞれ整数値で格納されているのが分かりますが、整数型(Integer)に小数点を含む値を設定しようとすると四捨五入の整数値で格納されます。
このように変数宣言の影響により設定値が変わることがありますので、どのような値をどう扱うのかを十分に考えた上で、宣言するようにしましょう。
Sub sample()
Dim a As Integer
Dim b As Integer
Dim c As Single
a = 123.4
b = 123.5
c = 123.4
MsgBox "変数aの値:" & a & vbCrLf & _
"変数bの値:" & b & vbCrLf & _
"変数cの値:" & c
End Sub
実行結果
論理型の宣言
ブール型(Boolean)
ブール型(Boolean)の変数は、16 ビット(2バイト)の変数です。ブール型変数が格納できる値は、真(True)または偽(False)だけです。
ブール型変数は、Print#ステートメントを呼び出して出力すると、TrueまたはFalseの文字列が表示されます。Write#ステートメントを呼び出して出力すると、#TRUE#または#FALSE#の文字列が表示されます。
他の数値型をブール型の値に変換すると、0は偽(False)になり、0以外の値はすべて真(True)になります。一方、ブール型の値を他のデータ型に変換すると、偽(False)は0、真(True)は-1になります。
事例
こちらは、ブール型(Boolean)の変数宣言の事例です。事例ではIf~Then~Elseステートメントの条件分岐の材料として、ブール型(Boolean)の変数を利用しています。ブール型(Boolean)の変数は条件分岐でよく利用されますので、覚えておきましょう。
Sub sample()
Dim a As Boolean
a = True
If a = True Then
MsgBox "変数aの値:" & a
End If
End Sub
実行結果
通貨型の宣言
通貨型(Currency)
通貨型(Currency)の変数は、64ビット(8バイト)の変数です。整数形式で表され、10,000倍されて整数として記憶された、15 桁の整数部分と4桁の小数部分を持つ固定小数点数です。-922,337,203,685,477.5808~922,337,203,685,477.5807の範囲の値をとります。通貨型の型宣言文字は、アットマーク(@)です。
通貨型(Currency)は、金額に関連する計算に役立つデータ型です。また、固定小数点を含む計算にも役立ちます。
事例
こちらは、通貨型(Currency)の変数宣言の事例です。通貨型(Currency)は4桁の小数部分も持つことができますので、小数第4位まで表示されます。
変数b,c,dは小数第5位までの数値ですが、数値が丸められ小数第4位までとなっているのが分かるかと思います。ここでの注意点は数値型の宣言は四捨五入で丸められましたが、通貨型の宣言は五捨六入で丸められます。
通貨の扱いは基本、整数値で取得や設定するものですが、数値型と結果が異なることを理解しましょう。
Sub sample()
Dim a As Currency
Dim b As Currency
Dim c As Currency
Dim d As Currency
a = 10000
b = 10000.12344
c = 10000.12345
d = 10000.12346
MsgBox "変数aの値:" & a & vbCrLf & _
"変数bの値:" & b & vbCrLf & _
"変数cの値:" & c & vbCrLf & _
"変数dの値:" & d
End Sub
実行結果
日付型の宣言
日付型(Date)
日付型(Date)の変数は、IEEE64ビット(8バイト)の浮動小数点数の変数です。西暦100年1月1日~西暦9999年12月31日の範囲の日付と、0:00:00~23:59:59の範囲の時刻を表すことができます。
日付型の変数には、日付リテラルとして認識可能な任意の値を代入できます。日付リテラルの形式は、#1993 January 1#または#93 Jan 1 #のようにシャープ記号(#)で囲む必要があります。ちなみに#1993 January 1#は1993年1月1日を表す日付リテラルになります。
日付型の変数では、日付はコントロールパネルで設定されている短い日付形式に従って表示されます。時刻はコントロールパネルで設定されている時刻の形式(12時間制か24時間制)に従って表示されます。
日付型以外の数値型の変数を日付型に変換すると、整数部の値は日付、小数部の値は時刻として表されます。午前0時は0、正午は0.5です。負の整数は1899年12月30日より前の日付を表します。
事例
こちらは、日付型(Date)の変数宣言になります。日付の場合は、基本「"(ダブルクォーテーション)」で括る必要があります。変数a~変数dの値を見てもらうと分かりますが、日付の記述方法はいくつも存在します。
どれを利用しても実行結果は「/(スラッシュ)」で表示されています。表示方法はVBA関数を利用して変更することができますが、こちらでは同じ結果で取得されることを理解しましょう。
また、変数eは特殊で日付リテラルという形式で代入したものです。日付リテラルについては、上記で解説していますので、ご確認ください。
Sub sample()
Dim a As Date
Dim b As Date
Dim c As Date
Dim d As Date
Dim e As Date
a = "2014/1/1"
b = "2014-2-3"
c = "2014年5月10日"
d = "Dec, 14, 2014"
e = #2/1/2014#
MsgBox "変数aの値:" & a & vbCrLf & _
"変数bの値:" & b & vbCrLf & _
"変数cの値:" & c & vbCrLf & _
"変数dの値:" & d & vbCrLf & _
"変数eの値:" & e & vbCrLf & _
"変数aに1を足した値:" & a + 1
End Sub
実行結果
文字列型の宣言
文字列型(String)
文字列には、可変長文字列と固定長文字列の2種類があります。可変長文字列は文字数の制限はなく自由に文字列を格納することができ、固定長文字列はあらかじめ文字列の数を指定した文字列のことを言います。
可変長文字列には、約2GB(2^31)までの文字を格納することができます。固定長文字列には、1~約2GB(2^31)の文字を格納することができます。
ちなみにクラスモジュールでは、キーワードPublicを使って固定長文字列を宣言することはできません。 文字列型(String)のデータは、すべて文字コードで構成されます。文字列型(String)の型宣言文字は、ドル記号($)です。
事例
こちらは、文字列型(String)の変数宣言になります。文字列の場合は、必ず「"(ダブルクォーテーション)」で括る必要がありますので、ご注意ください。
Sub sample()
Dim a As String
a = "文字列です"
MsgBox "変数aは" & a
End Sub
実行結果
こちらは、固定長文字列の文字列型(String)の変数宣言になります。設定方法は、宣言のデータ型の後に「*(アスタリスク)」に固定する文字数を記述することで固定長文字列が設定できます。変数aに代入した文字列は5文字ですが、実行結果を見ると3文字までしか格納されていないのが分かるかと思います。
また、今回は文字数オーバーの場合に文字列が切り取られた事例を挙げましたが、逆に文字数が足らない場合は、足りない文字数分スペースが埋め込まれるので、ご注意ください。
Sub sample()
Dim a As String * 3
a = "文字列です"
MsgBox "変数aは" & a
End Sub
実行結果
バリアント型の宣言
バリアント型(Variant)
バリアント型(Variant)は、Privateステートメント、Publicステートメント、またはStatic ステートメントを使用して明示的にデータ型が宣言されていない、すべての変数に割り当てられます。バリアント型には型宣言文字がありません。
バリアント型は特殊なデータ型で、固定長の文字列型(String)データとユーザー定義型を除く、あらゆる種類のデータを格納することができます。また、バリアント型には、特殊な値Empty 値、Null値、およびエラー値やNothingなども格納することができます。バリアント型のデータがどのように処理されるかは、VarType関数またはTypeName関数を使って調べることができます。
バリアント型として格納されている数値データは、-1.797693134862315E308 ~ -4.94066E-324 (負の値)、4.94066E-324 ~ 1.797693134862315E308 (正の値) の範囲のすべての整数または実数の値をとることができます。通常、数値データはバリアント型として格納される場合でも、その数値本来のデータ型でバリアント型の変数に格納されます。
たとえば、整数型(Integer)の値をバリアント型の変数に代入した場合、続く操作でその変数は整数型として処理されます。ただし、バイト型(Byte)、整数型、長整数型(Long)、単精度浮動小数点数型(Single)のいずれかの数値データを含むバリアント型の変数を演算処理したとき、演算結果が元の数値本来のデータ型の範囲を超えた場合、バリアント型の内部処理形式として、その値を保持できるデータ範囲を持つ、より大きなデータ型が割り当てられます。
つまり、バイト型は整数型になり、整数型は長整数型になり、長整数型および単精度浮動小数点数型は倍精度浮動小数点数型 (Double) になります。バリアント型に含まれている通貨型(Currency)、10進型(Decimal)、および倍精度浮動小数点数型の値が有効範囲を超えるとエラーが発生します。
Empty値は、初期化されていない (初期値が代入されていない) バリアント型の変数を示します。Empty値を含むバリアント型の変数は、数値データと共に使われるときは 0、文字列データと共に使われるときは長さ 0 の文字列 ("") として扱われます。
Empty値をNull値と混同しないでください。Null 値は、バリアント型変数に有効なデータが意図的に格納されていないことを示します。
バリアント型では、エラー値はプロシージャ内でエラー条件が発生したことを示すために使われる特殊な値です。ただし、他のエラーとは異なり、通常のアプリケーション レベルのエラー処理は行われません。このため、ユーザーまたはアプリケーション自体が、エラー値に基づいて代替操作を実行できます。エラー値は、CVErr 関数を使って実数を変換することにより作成します。
事例
こちらは、バリアント型(Variant)の変数宣言になります。変数a,bは明示的に宣言していますが、宣言していない変数cもバリアント型(Variant)として扱われます。変数aには文字列が設定されています。変数bは数値が設定されていますが、バリアント型(Variant)はどんな値でも格納できますので、こちらを文字列としても扱えることを理解しましょう。
変数cには、Date関数を利用して日付を設定しています。実行結果の「変数cに1を足した値」を見てもらうと分かりますが、1日足した日付が結果として表示されています。
Sub sample()
Dim a As Variant
Dim b As Variant
a = "文字列です"
b = 123456
c = Date
MsgBox "変数aの値:" & a & vbCrLf & _
"変数bの値:" & b & vbCrLf & _
"変数cの値:" & c & vbCrLf & _
"変数bに1を足した値:" & b + 1 & vbCrLf & _
"変数cに1を足した値:" & c + 1
End Sub
実行結果
オブジェクト型の宣言
オブジェクト型(Object)
オブジェクト型(Object)の変数は、32ビット(4バイト)の変数です。オブジェクトを参照するためのアドレスを格納します。オブジェクト型として宣言した変数には、Setステートメントを使用してオブジェクトへの参照を代入することができます。
オブジェクト型として宣言した変数には任意のオブジェクトへの参照を格納することができますが、変数と参照先のオブジェクトとのバインディングが遅くなります (実行時バインディング)。事前バインディング (コンパイル時バインディング)を実行するには、固有のクラス名を指定して宣言した変数にオブジェクトへの参照を代入します。
事例
こちらは、オブジェクト型(Object)の変数宣言になります。オブジェクト型で宣言された変数のことをオブジェクト変数と言います。これまで変数の設定は「=(イコール)」で左辺に右辺の値を代入すると解説しましたが、オブジェクト変数の場合は、オブジェクトへの参照を行うSetステートメントを利用して設定します。以下はオブジェクト変数の宣言方法です。
Set オブジェクト変数名 = 対象のオブジェクト名
ここで事例を確認してみると、オブジェクト変数aにはA1セルのオブジェクトが参照されています。次にオブジェクト変数aを利用せずにRangeオブジェクトのValueプロパティでA1セルに「VBA」を代入します。これでA1セルには「VBA」の文字列が入力されました。
続いてMsgBox関数を利用してメッセージを表示されていますが、こちらではオブジェクト変数aのValueプロパティを利用して値を取得しています。結果は見て分かるとおり「VBA」が取得されています。
オブジェクト変数の特徴は、通常の変数が値を代入しているのに対して、オブジェクト変数はオブジェクトを参照していることです。ですので、「VBA」の値を代入しているわけではなく、あくまでA1セルのオブジェクトを参照していることになります。例えばA1セルが「Excel」に変更された場合、オブジェクト変数aのValueプロパティの値も「Excel」に変更されます。
Sub sample()
Dim a As Object
Set a = Range("A1")
Range("A1").Value = "VBA"
MsgBox "オブジェクト変数aの値:" & a.Value
End Sub
実行結果
オブジェクト型(Object)を利用するメリット
オブジェクト型(Object)を利用するメリットとしては、オブジェクト選択の簡略化とコードの可読性の向上があります。例えば、ワークブックBook1とワークブックBook2の2つのファイルを利用してデータのやり取りを行う場合、どのワークブックを利用するのかWorkbooksコレクションから指定する必要があります。
事例を見ても分かるようにオブジェクト変数a,bにはそれぞれのワークブックのsheet1オブジェクトを参照しています。
そして、オブジェクト変数を利用していない場合とした場合の値の代入を処理していますが、どちらも同じ処理になります。どちらも同じ処理ですが、オブジェクト変数を利用した方がオブジェクト選択も簡略化されすっきりした形になっているのがわかるかと思います。
Sub sample()
Dim a As Object
Dim b As Object
Set a = Workbooks("Book1").Worksheets("sheet1")
Set b = Workbooks("Book2").Worksheets("sheet1")
'オブジェクト変数を利用しない場合
Workbooks("Book1").Worksheets("sheet1").Range("A1").Value = "Excel"
Workbooks("Book2").Worksheets("sheet1").Range("A1").Value = "VBA"
'オブジェクト変数を利用した場合
a.Range("A1").Value = "Excel"
b.Range("A1").Value = "VBA"
End Sub
まとめ
今回は、それぞれのデータ型の特徴を事例を交えて解説してきました。データ型を間違えると予期せぬ結果をもたらすので、それぞれの特徴を理解した上で正しいデータ型で宣言するようにしましょう。次回は、この基本的なデータ型以外にユーザーが自由に定義できる型の作成について解説していきます。
次の記事: ユーザー定義型の宣言と型変換 >>
近田 伸矢, 植木 悠二, 上田 寛
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。