更新日:、 作成日:

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
上記で定義した Point 構造体を使用しています。

構造体を代入

同じ構造体ならそのまま変数に代入できます。すべての要素がそれぞれ代入されます。簡単に言うとコピーできます。

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
動的 = 型不一致 ' エラー、型が一致していない
静的 = 型不一致 ' エラー、静的配列には代入できない、型が一致していない

データベースのデータを取得するときなど、多くのデータを操作するときに構造体が役に立ちます。構造体をレコードとして、要素を列として考え、構造体を配列にするとテーブルのデータを取得できます。