VBA の型

# リテラルについて

リテラルとはデータの型と値を表す、ここでは最小単位の型(組み込み型)について扱う。 プログラミング言語の大半は文字列の塊でしかない、効率よく処理させるためそれが何であるかデータの種類をプログラム言語へ明示しなくてはならない。 データの種類は一般的な値を示す文字ですむが場合によっては特別な文字(修飾子)が必要となる。 これは実社会においては率であれば　0～100 の数字に対し　%　が付き、通貨ドルであれば数字に先だって \$ が付く事と似ている。　修飾子がどのように付くかについては % \$ と同様に文化的な背景があるため統一されてはいない。

型及び値にはいろいろなタイプがありそれぞれ表現出来る事が異なる、その異なる表現を使い分ける為に型が設けられている。 型には大まかに値型とオブジェクト型(参照型)の二つに分かれている。

## 値(コンピュータの数値)

全ての値は論理値を複数束ね(ビット)た形式で保存されている、通常それを意識する事は不要であるが簡単に説明する。

数学の整数は次の通りである。

| 0 | 0+1 | 1+1 | ... 際限なく続く、無論マイナス側も |
|---|-----|-----|-----|
| 0 |   1 |   2 | ... |

コンピュータは有限の範囲しか扱えない8ビットの場合は次の通りである。 (ビット数は2進数の桁数である)

| ビット数 |  符号    | 範囲             |
|---------|---------|------------------|
| 8ビット  | 符号あり | -128 ～ 0 ～ 127 |
|         | 符号なし | 0 ～ 255         |

符号なし8ビットの場合は 2^8 べき乗 => 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 => 256 になるが 0 を含むため 255 まで表すことが出来る。 符号が必要な場合は2の補数で処理される為に -128 ～ 0 ～ 127 となる。

2進数と10進数と16進数の関係は次の通り。

| 2進数 | 10,16進数 | 2進数 | 10,16進数 | 2進数 | 10進数 | 16進数 | 2進数 |  10進数 | 16進数 |
|--------|---------|-------|---------|--------|---------|----------|-------|----------|---------|
| 0000  | 0        | 0100  | 4        | 1000   | 8         | 8         | 1100 | 12        |   C      |
| 0001  | 1        | 0101  | 5        | 1001   | 9         | 9         | 1101 | 13        |   D      |
| 0010  | 2        | 0110  | 6        | 1010   | 10       | A         | 1110 | 14        |   E      |
| 0011  | 3        | 0110  | 7        | 1011   | 11       | B         | 1110 | 15        |   F      |

# 値型ついて

値型とは Nothing (後述) 状態を持てないものを言う、変数への代入時は値をコピーする。

## 論理演算用の値型

コンピュータの基本的な処理単位である論理を扱う型は次の通りである。　

| 型        |  識別子          | 説明 |
|-----------|-----------------|------|
| Boolean   | True False      |  論理型、真理値、真(True) 偽(False)を持つ |

## 数値演算用の値型

通常記述した数値の範囲によって自動的に型が決定され型を意識することなく利用できるが、暗黙的に決まる事が問題なるケースでは修飾子を付記し明示する事が可能である。　次の数値演算用の型がある。

| 型               |  リテラルと修飾子 | 説明                  |
|------------------|-----------------|-----------------------|
| Byte            | 無し             | 8bit 符号無し 整数型 0～255 |
| **Integer**     | 数値%            | 16bit 符号付き 整数型 -32768～32767 [^int] |
| **Long**	   | 数値&           | 32bit 符号付き 整数型 -2147483647～2147483647 |
| Single           | 数値!            | 単精度 浮動小数型 普通使わない |
| **Double**       | 数値#            | 倍精度 浮動小数型 標準利用 |
| Decimal          | 無い             | 10進演算型 丸め誤差対策の型|
| Currency         | 数値@            | 10進演算型? 丸め誤差対策の型 |

整数型には修飾子として接頭語がある。

|  修飾子          | 説明     |
|----------------|---------|
| &H数値          | 16進数 |
| &0数値          | 8進数   |

整数以外にも指数や少数表現も可能である。

```vbnet
1.23
1.23e-10
1.23e+10
```

[^int]: Excel　の VBA 登場はは　Excel 5.0('94) 当時16ビットから32ビットの移り変わり時期で今も影響が残っている。 現代のプログラマからすると思わぬ結果に面を食らう、昨今はintは32ビットか64ビットが一般的である。

## 特殊な値型

| 型       |  リテラルと修飾子 | 説明        |
|---------|----------------|------------|
| String  | "123"   　       | 文字列     |
| Date    | \#2001/2/3\# \#2001/2/3 11:22:33\# | 日時 [^日時]　|

歴史的な事情により変数宣言に＄をつけると文字列型となる。

```
MyName$ = "名前はまだない"
```

[^日時]: 他の言語では datetime date time で分けられ参照型が一般的である。

# オブジェクト型(参照型)

値型より上位概念の組み込み型である、変数への代入時は参照で扱うため参照型ともいう。 未初期化の状態 Nothing を持つ事が可能で、オブジェクト型は内部に値型もしくはオブジェクト型を内包した複雑な入れ子構造を表現する為の型である。　ここではオブジェクト型の作り方は割愛し基本操作に必要な物のみ扱う。

| 型            | 識別子            |説明                                                   |
|------------|-----------------|--------------------------------------------|
| Object     |                      | [^object]                                                 |
| Nothing   | Nothing          | オブジェクトが未参照状態/初期状態を表す     |

Nothing 型の変数は作る事が出来ない。

[^object]: 他の言語ではなんでも入る型としてオブジェクト型が使われる VBA はオブジェクトだけが代入可能である、なんでも入れたい場合は　Variant 型を使う。

# Variant型

Variant は値型およびオブジェクト型などなんでも代入する事が出来る型である。

# Empty

Empty 型の識別子 Empty はあらゆる型の初期値を返す、型と初期値の関係は次の通り。

| 型         | 値          |
|----------|-----------|
| Boolean | False     |
| 値型      | 0           |
| Object  | Nothing  |
| String   | ""          |
| Variant | Empty    |

Empty 型の変数は作る事は出来ない。 何かしらの状況でオブジェクトが使えない状態を示す Empty 型の識別子 Unknown が定義されている。

# その他の型識別子

## Null

Null[^null]型の識別子 Null はセル式の Null 状態を示す値である。 この型の変数を作ることは出来ない。

[^null]: 他の言語では無効なオブジェクトを表す。

# 型を調べる関数

Variant 型を使ったりセル由来の情報を扱うとき現在の値の型が何であるか調べる必要が多々ある、そのような時は以下の関数で調査出来る。

| 関数                | 動作              |
|------------------|----------------|
| TypeName(式) | 型の名前を返す |
| IsArray(式)	| 変数が配列かどうかを調べる |
| IsDate(式)	| 値を日付型に変換可能かどうかを調べる |
| IsEmpty(式)	| 値がEmptyかどうかを調べる |
| IsError(式)	| 式がエラー値かどうかを調べる |
| IsMissing(式)	| プロシージャに省略可能なバリアント型 (Variant) の引数が渡されたかどうかを調べる |
| IsNull(式)	        | 式にNull結果が含まれているかを調べる |
| IsNumeric(式) | 値を数値として評価できるかどうかを調べる |
| IsObject(式)	| オブジェクトかどうかを調べる |
| VarType(式)   | 型識別数値を返す[^vartype] |

```vbnet
Sub Func()
	' a1 セルの型をポップアップする
	MsgBox TypeName(Range("a1").value)
End Sub
```

[^vartype]: [VarType 関数](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/vartype-function)