Office VBA Type Statement Memo

[Typeステートメント](http://officetanaka.net/excel/vba/statement/Type.htm)
[第110回.ユーザー定義型（構造体）Type](http://excel-ubara.com/excelvba1/EXCELVBA410.html)
[Office VBA 言語リファレンス Visual Basic 言語リファレンス ステートメント >Type ステートメント Office 2013 Later](https://msdn.microsoft.com/ja-jp/library/office/gg278730.aspx)

|指定項目|省略可否|説明|
|:-------|:------:|:--:|
|Public|省略可能|すべてのプロジェクトのすべてのモジュールのすべてのプロシージャで使用できるユーザー定義型を宣言するために使用されます。|
|Private|省略可能|ユーザー定義型が宣言されるモジュール内でのみ使用できるユーザー定義型を宣言するために使用されます。|
|varname|必須|ユーザー定義型の名前です。変数の名前付け規則に従った名前を指定します。|
|elementname|必須|ユーザー定義型の要素の名前です。要素名の場合も、キーワードが使用できる点を除いて、変数の名前付け規則に従った名前を指定します。|
|subscripts|||lower で明示的に指定しない場合、配列の下限は Option Base ステートメントによって制御されます。Option Base ステートメントが存在しない場合は 0 になります。
|type|必須|要素のデータ型です。指定できるのは、Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal (現在はサポートされていません)、Date、String (可変長文字列の場合)、String * length (固定長文字列の場合)、Object、Variant、別のユーザー定義型、オブジェクト型です。|

##Microsoft VBA の解説が間違いがある
 Type ステートメントはモジュール レベルでのみ使用できます。
 Type ステートメントを使用してユーザー定義型を宣言すると、宣言の範囲内でその型の変数を宣言できるようになります。
 Dim、Private、Public、ReDim、または Static を使用して、ユーザー定義型の変数を宣言します。
 標準モジュールおよびクラス モジュールでは、ユーザー定義型が既定でパブリックになります。キーワード Private を使用して、この表示を変更できます。 
 Type...End Type ブロックでは、行番号と行ラベルが許可されていません。
 ユーザー定義型は、データ レコードで頻繁に使用されます。多くの場合、データ レコードは異なるデータ型の多数の関連要素で構成されます。
 ユーザー定義型の固定サイズ配列の使用例を次に示します。
 
 このマイクロソフトの記述は誤り。Office Tanakaのクラスモジュール内で宣言したユーザー定義型は、どんなときもプライベートになります。が正しい。
 

```vbnet
Type StateData 
    CityCode (1 To 100) As Integer    ' Declare a static array. 
    County As String * 30 
End Type 
 
Dim Washington(1 To 100) As StateData
```

上記の例では、StateData に CityCode の静的配列が含まれていて、レコード Washington が StateData と同じ構造を持っています。
ユーザー定義型内で固定サイズ配列を宣言する場合は、そのディメンションを変数ではなく数値リテラルまたは数値定数で宣言する必要があります。

これだけしか書いていないがこれがどうなっているかというと
Washingtonは動的配列で
Washington(1)
<途中省略>
Washington(100)
となり、
さらにこのWashingTon()の１から100に
それぞれ　CityCode(1)からCityCode(100)性的配列
が入っている
Type StateData
    CityCode(1 To 100) As Integer     ' Declare a static array.
    County As String * 30
    CiteCount(1 To 10) As Integer
End Type
Dim Washington(1 to 100)
とすると
WashingTon()の１から100に
それぞれ　CityCode(1)からCityCode(100)性的配列
Countryの30桁の固定文字配列
それぞれ　Citycount(1)からCityCode(10)の性的配列
ができる。


###代入
    Washington(1).CityCode(1) = 12
    Washington(1).County = "a"
  とするとWashington(1)のCityCode(1)に12
  Washington(1)に a が入る

## Dimで変数を宣言するとき、Typeの後に来る文字が　Asの後ろに来る
なのでこんなのも可能だ。

```vbnet
Type の後ろに来る｡
インテジャ As Integer
性的文字列配列(1 To 100) As String
固定文字 As String * 30
End Type

Sub test()
Dim 動的構造体配列(1 to 10) As の後ろに来る｡
End Sub
```

##使用目的
excel-ubara：ユーザー定義型が活躍するのは、これを配列として定義し、大量データを扱うような場面になります。
MS公式：レコード Washington が StateData と同じ構造を持っています。とレコードという表現を使っており、これがデータ処理に使われることを意味している。

##使用箇所
　となるとTypeはExcelではなく、Excel以外のOfficeで使う場合が多いと考えられる。
　Excelでは出てこないわけだ
　Typeは同型の変数なら性的配列に入れられる。
　なので全部 integerなら
Type テスト
性的文字列配列(1 To 100) As Integer
end type
も可能だが、可読性に欠けている
なので同型でも並べる
type テスト
数値 as integer
'途中省略
数値100 as integer
End type
とは言っても、さすがに100はキツイ。やはりデータ格納のための機能だと言えるだろう。

##Sample
OfficeTanakaを応用すると次のようになる
動的配列で Redimは使える。

```vbnet
'Module Level
Private Type myType
    myValue As Integer
    myString As String
    mydate As Date
End Type

Type の後ろに来る｡
インテジャ As Integer
性的文字列配列(1 To 100) As String
性的固定文字配列(1 To 100) As String * 10
End Type

Type StateData
    CityCode(1 To 100) As Integer     ' Declare a static array.
    County As String * 30
    CiteCount(1 To 10) As Integer
End Type

Dim Washington(1 To 100) As StateData

Sub Sample()
    Dim Washington2(1 To 100) As の後ろに来る｡
    Dim myData() As myType, i As Integer, msg As String, buf As String
    ReDim Preserve myData(1 To 100)
    Washington(1).CityCode(1) = 12
    Washington(1).County = "a"
    For i = 1 To 20
        myData(i).myValue = i * 100
        myData(i).myString = "test" & i
        myData(i).mydate = Now
    Next i

    For i = 1 To 20
         buf = myData(i).myValue & vbTab & myData(i).myString & vbTab & Format(myData(i).mydate, "hh:mm:ss")
         msg = msg & myData(i).myValue & vbTab & myData(i).myString & vbTab & Format(myData(i).mydate, "hh:mm:ss") & vbCrLf
        Cells(i, 1).Value = buf
    Next i
    MsgBox msg
End Sub