更新日:、 作成日:
VBA 構造体 Type を定義する
はじめに
Excel VBA マクロで構造体 Type の定義や初期化する方法を紹介します。
構造体とは、複数の変数をグループ化したようなものです。関連性のある値をまとめます。ユーザー定義型とも言います。
Type 構造体名 のようにして、構造体を定義できます。
Type の中に 要素名 As 型名 のようにして、構造体の要素を定義できます。
構造体を初期化するには、構造体の変数を代入します。
構造体を配列にするには、配列の変数を宣言するのと同じです。
構造体を宣言する
Type 構造体名 のように入力します。Type が構造体を定義するキーワードです。すべての関数より上に定義します。
Type の中に 要素名 As 型名 のように入力します。要素は変数のように使えます。
Type Point
X As Integer
Y As Integer
End Type
Type Customer
Birthday As Date
Id As Integer
Name As String
End Type
要素の型を別の構造体にもできます。
構造体の中に関数やコンストラクトなどは作成できません。変数だけ定義できます。
関数やコンストラクタを使用するには、クラスを使用します。
構造体のスコープ
構造体に使用できるスコープは Public と Private です。構造体 に Dim は使用できません。
省略したときは Public になります。
Public で宣言するには、標準モジュールにする必要があります。Sheet1 やクラスには宣言できません。
Public Type パブリック ' Public は標準モジュールにのみ宣言できる
要素名 As String
End Type
Private Type プライベート
要素名 As String
End Type
Type 省略 ' 省略したときは Public になる
要素名 As String
End Type
構造体の変数も同様に Public は標準モジュールにする必要があります。
Public パブリック As Point ' Point 構造体の変数は標準モジュールにのみ宣言できる
Private プライベート As Point
Sub 実行()
Dim ローカル() As Point
End Sub
スポンサーリンク
構造体を取得または代入する
構造体名が型になります。その変数を宣言して構造体を操作します。
構造体の変数.要素名 のように入力して、構造体の要素の値を取得または代入できます。
Dim p As Point ' Point 構造体を変数で宣言する
' 値を代入する
p.X = 10
p.Y = 20
' 値を取得する
Dim i As Integer
i = p.X
Debug.Print(i) ' 10
i = p.Y
Debug.Print(i) ' 20
構造体を代入
同じ構造体ならそのまま変数に代入できます。すべての要素がそれぞれ代入されます。簡単に言うとコピーできます。
Dim p1 As Point
p1.X = 10
p1.Y = 20
Dim p2 As Point
p2 = p1 ' p1 を p2 にコピー
Debug.Print(p2.X) ' 10
Debug.Print(p2.Y) ' 20
初期化
構造体を初期化する専用の関数などは VBA にはありません。空の構造体変数を代入してすべての要素を初期化できます。
Dim p As Point
p.X = 10
p.Y = 20
Dim 初期化用 As Point
p = 初期化用 ' p に空の構造体をコピーして初期化
Debug.Print(p.X) ' 0
Debug.Print(p.Y) ' 0
または初期値を設定した構造体変数を代入して初期化できます。
Dim 初期化用 As Point
初期化用.X = 10 ' 初期値を代入
初期化用.Y = 20 ' 初期値を代入
Dim p As Point
p = 初期化用 ' p に値の入った構造体をコピーして初期化
Debug.Print(p2.X) ' 10
Debug.Print(p2.Y) ' 20
構造体を配列にする
配列の変数を宣言するのと同じ方法で構造体も配列にできます。配列を代入する条件と同じ条件で構造体の配列を代入できます。
構造体を配列
構造体そのものを配列にするには次のように入力します。
Dim 静的(2) As Point ' 静的配列
静的(0).X = 10
Dim 動的() As Point ' 動的配列
ReDim Preserve 動的(3)
動的(0).X = 10
配列の要素が構造体になります。
構造体の要素を配列
構造体の要素を配列にするには次のように入力します。
Private Type 構造体
静的(2) As Integer ' 静的配列
動的() As Integer ' 動的配列
End Type
Sub 実行()
Dim p As 構造体
p.静的(0) = 10
ReDim Preserve p.動的(3)
p.動的(0) = 20
End Sub
構造体や要素に配列を代入
構造体の配列や、配列の要素に配列を代入するには、同じ型の動的配列にだけ代入できます。
Dim 動的() As Point
Dim 静的(3) As Point
' 型が一致している
Dim 型一致(4) As Point
動的 = 型一致 ' OK
静的 = 型一致 ' エラー、静的配列には代入できない
' 型が一致していない
Dim 型不一致(3) As Integer
動的 = 型不一致 ' エラー、型が一致していない
静的 = 型不一致 ' エラー、静的配列には代入できない、型が一致していない
データベースのデータを取得するときなど、多くのデータを操作するときに構造体が役に立ちます。構造体をレコードとして、要素を列として考え、構造体を配列にするとテーブルのデータを取得できます。
スポンサーリンク