Typeステートメント
第110回.ユーザー定義型(構造体)Type
Office VBA 言語リファレンス Visual Basic 言語リファレンス ステートメント >Type ステートメント Office 2013 Later
指定項目 | 省略可否 | 説明 |
---|---|---|
Public | 省略可能 | すべてのプロジェクトのすべてのモジュールのすべてのプロシージャで使用できるユーザー定義型を宣言するために使用されます。 |
Private | 省略可能 | ユーザー定義型が宣言されるモジュール内でのみ使用できるユーザー定義型を宣言するために使用されます。 |
varname | 必須 | ユーザー定義型の名前です。変数の名前付け規則に従った名前を指定します。 |
elementname | 必須 | ユーザー定義型の要素の名前です。要素名の場合も、キーワードが使用できる点を除いて、変数の名前付け規則に従った名前を指定します。 |
subscripts | ||
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のクラスモジュール内で宣言したユーザー定義型は、どんなときもプライベートになります。が正しい。
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()の1から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()の1から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の後ろに来る
なのでこんなのも可能だ。
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は使える。
'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