パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)
基本のデータ型とバリアント型 (準備中)
--------------------------------------------------------------------------------
Visual Basicにおける基本のデータ型とバリアント型およびいくつかの基本的なデータ型の変換
について。
--------------------------------------------------------------------------------
Visual Basic(VB4〜VB6)の基本のデータ型とバリアント型
基本的なデータ型の変換
バリアント型の注意点
などについて
Visual Basic(VB4〜VB6)をこのページではVBと記載します。
VBの基本のデータ型についてまとめます。
型名 | 型 | 型宣言文字 | バイト数 | 値の範囲 |
Integer | 整数型 | % | 2 | -32768〜32767 |
Long | 倍長整数型 | & | 4 | -2147483648〜2147483647 |
Single | 単精度浮動小数点型 | ! | 4 | -3.402823E38〜-1.401298E-45 1.401298E-45〜3.402823E38 |
Double | 倍精度浮動小数点型 | # | 8 | -1.79769313486232D308〜4.94065645841247D-324 4.94065645841247D-324〜1.79769313486232D308 |
Currency | 通貨型 (8バイト固定所数点型) |
@ | 8 | -922337203685477.5808〜922337203685477.5807 |
String | 文字列型 | $ | 0〜2E32(32ビットシステム) | |
Byte | バイト型 | 1 | 0〜255 | |
Boolean | ブール型 | 2 | TrueまたはFalse | |
Date | 日付型 | 8 | 100年1月1日 〜 9999年12月31日 | |
Object | オブジェクトへの参照型 | 4 | オブジェクトへの参照 |
(表1)
単精度浮動小数点型、倍精度浮動小数点型のEやDの後ろの数値は指数を表します。
string型では固定長文字列の指定も可能です。
Dim s As String *20 と宣言すると変数sは20バイトの固定長文字列変数になります。
固定長文字列変数については「固定長文字列とランダムファイル」をご参照下さい。
(※)参考
1バイト、2バイトで表せる整数の範囲、あるいは浮動小数点型の説明は以下のページなどを参照下さい。
他のプログラム言語を例にした話もありますが、VBでも参考になると思います。
・bitとbyte
・負の数を表す
・unsignedと浮動小数点型の内部構造
(※)ブール型
ブール型はTrueまたはFalseの2値をとる型で論理型とも呼ばれます。
VBは内部的には0はFalse、0以外はTrueと定義しています。
ブール型を整数型に型変換すると、Falseは0、Trueは-1に変換されます。
数値型の取り扱いには思わぬ落とし穴がいろいろあります。以下ご参照下さい。
&HFFFF=&HFFFFFFFF(数値型の落とし穴)
-1>1が成り立つ
(※) 参考
BooleanはOxford英英辞典では次のように説明されています。
Connected with a system, used especially in computing and electronics,
that uses only the number
1 (to show something is true) and 0 (to show something is false)
Oxford英英辞典では1はtrue、0をfalseとすると説明していますね。
実際はどのプログラミング言語でもFalseには数値としては0を設定しているようですが、Trueのほうは1を設定する
言語がある一方で、VBのように-1としている言語もあります。
バリアント型(variant)は上記の表1の全ての基本データ型の値をも格納できます。
Dim文でVariant型を指定するか、型を指定しない変数、あるいは宣言なしでつかった変数はVariant型
になります。
以下にいろいろな型を格納する簡単なテストをしてみます。
整数型(Integer)、文字列型(String)、ブール型(Boolean)、倍精度浮動小数点型(Double)
日付型(Date)を格納しています。
日付型のデータは#で囲んで、#4/14/1990 15:30:15# のように指定します。
日付型の変数に日付を指定するときは、月/日/年 の順のフォーマットでで指定します。
Printで日付型の変数を表示すると、年/月/日 のフォーマットで表示されます。
Vartype()はバリアント型変数に格納されているデータの種類を取得する関数で、戻り値は以下の
通りです。
バリアント変数が宣言された後、一度も値が与えられていない場合はEmptyが返ります。(Nullとはまた違う)
変数がEmptyかどうかのチェックは、IsEmpty()という関数で行います。
Nullはデータが未定値または欠損値であることを示します。Nullかどうかをチェックする場合は、IsNull()という
関数を使います。
戻り値 | データの種類 |
0 | Empty |
1 | Null |
2 | Integer |
3 | Long |
4 | Single |
5 | Double |
6 | Currency |
7 | Date |
8 | String |
9 | OLEオートメーションオブジェクト |
10 | エラー値 |
11 | Boolean |
12 | Variant |
13 | 非OLEオートメーションオブジェクト |
17 | Byte |
8192 | 配列 |
(表2)
プログラムは以下の通り。
Print文で、最初にVartype()で取得したデータの種類、そのあとにデーのタ中身を表示しています。
日付をバリアント型変数に保存するときは、月/日/年 というフォーマットで指定しますが、Printで表示
すると、年/月/日 で表示されます。
最後のNowは現在の日付、時間を取得する関数で、バリアント型に保存します。
Private Sub Command1_Click() Dim v As Variant Cls Print "Integer" v = 12345 Print VarType(v); ":"; v Print "String" v = "Basic" Print VarType(v); ":"; v Print "Boolean" v = True Print VarType(v); ":"; v Print "Double" v = 1234.98765432 Print VarType(v); ":"; v Print "date" v = #4/14/1990 8:01:05 AM# Print VarType(v); ":"; v Print "now" v = Now Print VarType(v); ":"; v End Sub
実行結果
(図1)
文字列である"123"を整数型に変換したい時は、Val()関数を使います。
逆に整数の123を文字列型の"123"に変換したい場合はStr$()を使います。
しかし、これらの関数を使って明示的にデータ型の変換を行わなくても、暗黙のうちに型変換されて
いる場合があり、これがバグや意図とは違う結果を引き起こす元凶になることが多いので、暗黙の型変換
には少し注意が必要です。
とくにバリナント型は暗黙の型変換で意図しない結果を引き起こし勝ちなので注意しておく必要があります。
VBでは、数値型 + 数値の文字列型 という演算がおこなわれると文字列は数値に変換され、数値計算が行われます。
以下のプログラムで、Print i + "2" や Print s + 1の個所がその例です。
数値の文字列型 + 数値の文字列型 の場合は文字列をくっけるという結果になります。
バリアント型の変数の種類が数値のタイプ(Integer, Long, Sinle, Double)の場合も同様です。
以下のプログラムと実行例をご参照下さい。
バリアント型の変数aに数値の1を格納したときは、a +1 も a+"2" も数値として演算されています。
変数aに文字列の"1"を格納した場合も a+1は数値として演算されています。
Private Sub Command2_Click() Dim a Dim i As Integer Dim s As String Cls Print "Variant" a = 1 Print a + 1 Print a + "2" a = "1" Print a + 1 Print a + "2" Print "Integer" i = 1 Print i + 1 Print i + "2" Print "String" s = "1" Print s + 1 Print s + "2" Print "val" Print Val(s) + 1 Print "str$" Print Str$(i) + "2" End Sub
実行例
この他に、数値同士の演算においても、数値のデータ型(Integer, Long, Single,
Double)が混在した
場合に暗黙の型変換が行われています。
これについては、整数型へのオートキャストをご参照下さい。