■ データ型を詳しく学ぼう
以前、初級編で、
「データ型は、Boolean,Long,Double,Stringの4つを覚えておけばとりあえず十分です」
と解説しました。
確かにこの4つでほとんどの場合、間に合ってしまうのですが…。やはり、高度な業務システムを開発していくためには、他のデータ型も知っておいたほうがよいでしょう。
様々なデータ型
Excel VBAで扱えるデータ型は実に様々です。データ型によって扱えるデータの種類や範囲、初期値や使用するメモリ領域が異なります。
適切なデータ型を指定してやることが、プログラムのパフォーマンスを高め、処理の高速化につながります。
データ型 |
サイズ |
範 囲 |
初期値 |
型宣言文字 |
バイト型(Byte) |
1byte(8bit) |
0〜255(正の整数値) |
0 |
|
ブール型(Boolean) |
2byte(16bit) |
真 (True)は-1、偽 (False)は0 |
0(False) |
|
整数型(Integer) |
2byte(16bit) |
-32,768 〜 32,767(正/負の整数値) |
0 |
% |
長整数型 (Long) |
4byte(32bit) |
-2,147,483,648 〜 2,147,483,647
(正/負の整数値) |
0 |
& |
単精度浮動小数点数型 (Single) |
4byte(32bit) |
-3.402823E38 〜 -1.401298E-45 (負の値) 1.401298E-45 〜 3.402823E38 (正の値) |
0 |
! |
倍精度浮動小数点数型 (Double) |
8byte(64bit) |
-1.79769313486232E308 〜
-4.94065645841247E-324 (負の値) 4.94065645841247E-324 〜 1.79769313486232E308 (正の値) |
0 |
# |
通貨型 (Currency) |
8byte(64bit) |
-922,337,203,685,477.5808 〜 922,337,203,685,477.5807 |
0 |
@ |
日付型 (Date) |
8byte(64bit) |
西暦100年1月1日0:00:00 〜
西暦9999年12月31日23:59:59 |
#1899/12/30 00:00:00# |
|
オブジェクト型 (Object) |
4byte(32bit) |
オブジェクトを参照するアドレス |
Nothing |
|
可変長文字列型 (String) |
10byte +
文字列の長さ x 2byte |
最大約2GB |
vbNullString |
$ |
固定長文字列型 (String * n) |
文字列の長さ x 2byte |
最大約63KB |
String$(n, vbNullChar) |
$ |
バリアント型 (Variant) |
16byte(128bit) 〜 条件による |
条件による |
Empty |
|
※10進型(Decimal)はCDec関数を使用してVariant型による値の取得のみが可能で、10進型変数の宣言はできません。
※変数を宣言なしで使用したり、変数の宣言をしても明示的に型を指定しなかった場合は全てVariant型に定義されます。
例:
Dim MyStr
Dim i, j, k As Long
変数MyStrは宣言されていますが、型指定されていないのでVariant型になります。変数i,j,kのうち、kはLong型になりますが、i,jはVariant型になります。
それでは、それぞれのデータ型をより詳しく見ていきましょう。
数値型
整数型 (Integer)、長整数型 (Long)、単精度浮動小数点数型 (Single)、倍精度浮動小数点数型 (Double)、通貨型 (Currency) のデータ型が数値型にあたります。
数値は整数(小数部なし)と実数(小数部あり)に分かれます。
整数は実数に比べて、使用するメモリ消費量も少なく演算速度も速いです。
32bitOSの場合、16bitのInteger型は内部で32bit変換されながらコードが実行されます。32bitのLong型はこのオーバーヘッドがない分、高速であるといわれています。
実数を扱う場合は、Single,Double型の浮動小数点数のデータ型を用いるか、Currency型の固定小数点数のデータ型を用います。固定小数点数は演算誤差が少なく、浮動小数点数に比べるとはるかに速く演算します。その分、表現できる値の範囲は狭くなります。
バイト型
バイナリーデータを変数に格納する場合に使用します。その場合は、Byte型の要素をもつ配列として宣言します。
たとえば文字列をByte型配列に渡してやるとUnicodeで文字列情報を格納します。この情報をバイナリ出力でテキストファイルに出力してもUnicodeのままで出力されるため文字化けします。VBAにより、ファイルの入出力、DLLの呼び出し、オブジェクトのメソッドやプロパティの参照が行われた時に、自動的にShift-Jisへの変換が行われます。
文字列型
・可変長文字列型。文字列型変数を宣言するときに特に指定をしない限り、可変長文字列型として定義されます。
可変長文字列では、格納する文字列の長さに応じてメモリ領域を確保していきます。
VBAでも文字列は基本的に文字型(Char型)の配列です。ただ配列であることを、
開発者側が意識する必要はありません。
・固定長文字列型。文字列型変数を宣言するときに文字列のサイズを指定します。
例:Dim StrFileName As String * 20
この例では、長さ20文字の文字列型変数を宣言しています。
(確保される領域は文字数x2byteです。Unicodeで格納されるため、どんな文字でも必ず2byteになります)
このとき、代入される文字列が20文字を超える場合、超過した文字列右端部分が切り捨てられます。
20文字に満たない場合は、残りをスペースで補充します。
固定長文字列型変数の初期値は文字数分のvbNullCharが格納されていますが、一度でも文字列を代入すると全てスペースに置き換わります。
ブール型
変数に真(TRUE)か偽(FALSE)のいずれかを表す値を格納します。既定値は偽(FALSE)になります。
日付型
整数部が日付、小数部が時刻を示します。日付は1899年12月30日の00:00:00がゼロで、1日に1増加します。
例:
・0.00 = 1899/12/30 00:00:00
・1.00 = 1899/12/31 00:00:00
・2.50 = 1900/01/01 12:00:00
オブジェクト型
アプリケーション内や他のアプリケーションのオブジェクトに対する参照が格納されます。Object型で宣言した変数を利用するには、Setステートメントを用いて、オブジェクトへの参照を代入する必要があります。
オブジェクト変数は、総称オブジェクト型ではなく固有オブジェクト型で宣言すべきです。
固有オブジェクト型を指定するとコードの実行前にVBAがオブジェクトへの参照を解決します(事前バインディング)。
総称オブジェクト型を使用した場合、コードの実行時にはじめてオブジェクトへの参照が解釈されるため、オーバーヘッドが発生し実行速度が落ちます(実行時バインディング)。
例:事前バインディング
Dim MyObj As Word.Application
Set MyObj = New Word.Application
例:実行時バインディング(遅延バインディング)
Dim MyObj As Object
Set MyObj = CreateObject("Access.Application")
※こちらのページでも事前バインディング、実行時バインディングの詳しい説明があります。
ActiveXオートメーション(OLEオートメーション)を利用しよう!
バリアント型
すべての基本データ型を格納できます。Variant型で宣言された変数に各種データ型の値を代入するときは、型の変換を行わなくても、自動的に必要な変換が行われます。またVariant型には、Empty、Null、Error といった3つの特殊な値を格納することができます。
・Empty |
Variant型変数の既定値で一度も値が代入されていないことを表します。 |
・Null |
変数やフィールドに有効なデータが格納されていないことを表します。 |
・Error |
エラー番号を持つデータ型です。 |
最後に、バリアント型とは関係ないですが、よく似た言葉で混同しないように以下の説明を追記しておきます。
・vbNullString |
可変長文字列で初期化されていない文字列を表します。StrPtr関数は0を返します。 |
・vbNullChar |
固定長文字列の初期値でキャラクターコード0(&H0000)のNull文字を表す定数です。 |
・"" |
長さ0の文字列で空文字列を表します。StrPtr関数は0を返しません。 |
・vbNull |
VarType関数の戻り値として使われる定数で長整数型の1を表します。 |
・Nothing |
Object型の変数が特定のオブジェクトと関係付けられていないことを表します。 |
以上、変数のデータ型について解説しました。
他言語では、厳密に定義されるデータの型指定も、VBAでは比較的柔軟に取り扱うことができます。
このあたりはVBAの長所なのですが、だからといって詳しく知らなくてもよいということにはなりません。
例えば、当たり前のように使っているString型も、内部的には結構面倒なことをやっています。String型そのものが無く、クラスで定義しなければならない言語だって存在します。
このあたりの構造を知ることで、より深いVBAの理解につながればと思います。
|