はじめに
VBAでプログラムを書く際、一人の従業員に関する情報(社員ID、氏名、入社日など)のように、複数の関連データをひとまとめにして扱いたい場面がよくあります。これらの情報を別々の変数で管理すると、コードが煩雑になり、管理も大変です。
このような問題を解決するのが、「ユーザー定義型」です。Type...End Type
ステートメントを使うと、String
や Long
、Date
といった既存のデータ型を自由に組み合わせて、あなただけの**オリジナルのデータ型(構造体)**を作成できます。
この記事では、ユーザー定義型を使って、関連するデータを一つの変数にすっきりとまとめる方法を、分かりやすく解説します。
ユーザー定義型の使い方サンプルコード
この例では、従業員情報を格納するための EmployeeRecord
という新しいデータ型を定義し、それを使って一人の従業員のデータを管理します。
完成コード
Type
の定義は、モジュールの先頭(Option Explicit
の下など)、どのプロシージャよりも前に記述する必要があります。
' --- ユーザー定義型を定義 ---
' モジュールの先頭に記述
Public Type EmployeeRecord
EmployeeID As String
FullName As String
HireDate As Date
Department As String
End Type
' --- ユーザー定義型を利用するマクロ ---
Sub ManageEmployeeData()
' 1. 作成したユーザー定義型で変数を宣言
Dim employee As EmployeeRecord
' 2. 各メンバーに値を代入
employee.EmployeeID = "EMP-007"
employee.FullName = "山田 太郎"
employee.HireDate = #4/1/2023# ' 日付リテラル
employee.Department = "営業部"
' 3. 格納したデータを参照
Dim message As String
message = "社員情報:" & vbCrLf & _
"ID: " & employee.EmployeeID & vbCrLf & _
"氏名: " & employee.FullName & vbCrLf & _
"入社日: " & employee.HireDate & vbCrLf & _
"部署: " & employee.Department
MsgBox message, vbInformation, "データ確認"
End Sub
コードの解説
Public Type EmployeeRecord ... End Type
EmployeeRecord
という名前で、新しいデータ型を定義しています。Type
と End Type
の間に、このデータ型に含めたい要素(メンバー)を 変数名 As データ型
の形式で列挙します。これにより、4つの異なるデータ(文字列2つ、日付1つ)をひとまとめにした EmployeeRecord
型が完成します。
Dim employee As EmployeeRecord
String
や Long
と同じように、自作した EmployeeRecord
型を使って変数を宣言しています。この employee
という一つの変数の中に、IDや氏名などを格納する複数の入れ物が用意されているイメージです。
employee.EmployeeID = "EMP-007"
ユーザー定義型の各メンバーにアクセスするには、 変数名.メンバー名
のように、ドット (.
) で繋げて記述します。これにより、どのメンバーに値を代入、またはどのメンバーから値を参照するのかを明確に指定できます。
ユーザー定義型のメリット
1. データの構造化
関連するデータを一つの変数にまとめることで、データの構造が明確になり、コードが非常に分かりやすくなります。
2. コードの可読性と保守性の向上
employeeID
, employeeName
, employeeDate
… と多数の変数を管理する代わりに、employee.EmployeeID
, employee.FullName
と書けるため、誰が見ても「従業員データの一部である」ことが一目で分かります。
3. 関数の引数をシンプルに
従業員データを別の関数に渡したい場合、ProcessEmployee employeeID, employeeName, ...
と多くの引数を渡す必要がありますが、ユーザー定義型を使えば ProcessEmployee employee
のように、たった一つの引数で済みます。
まとめ
今回は、VBAのユーザー定義型(Type
)を使って、複数の関連データを一つの変数にまとめる方法を解説しました。
Type ... End Type
で、モジュールの先頭にオリジナルのデータ型を定義する。変数名.メンバー名
の形式で、各データにアクセスする。
ユーザー定義型は、クラスモジュールほど高機能ではありませんが、データを構造化するためのシンプルで強力な手段です。特に、複数のデータをセットで扱うことが多い場合に、コードの質を大きく向上させてくれます。