VBA VBAマクロ

VBAで構造体を使うメリットを考えてみた

構造体とは「複数の変数を1つの入れ物」で管理できる、ユーザー定義のデータ型になります。プログラマーが、構造体という雛形を作成することで、効率的なプログラムを実施可能にするものです。

わかるような、わからないような話ですね。
それでは、構造体を使ったプログラムのメリットについて見てみましょう。

構造体のメリット

構造体を使った時のメリットについて整理してみました。

  1. 何度も同じ変数宣言をしなくても良い
  2. 引数の数を減らせる
  3. 複数の変数をまとめて戻り値に設定できる
  4. 変数のデータ型などを毎回考える必要が無い

1.何度も同じ変数宣言をしなくても良い

構造体はプログラマー自身が各プログラムに合わせた変数の集まりのテンプレートとして作成できます。
そのため、何度も出現する変数のセットがある場合には、何度も同じ変数定義を繰り返さなくても良いというメリットがあります。 
例えば、複数の商品情報を取得し、何らかの処理をしたいときの例を見てみましょう。
NotUseTypeSample関数が構造体を使わないパターン、UseTypeSample関数が構造体を使った時のパターンになります。
 
構造体を使う事でソースコードの行数が削減でき、すっきりとしたソースコードになりますね。

▽構造体を使わないパターン

Sub NotUseTypeSample()
	' 累計売上高の最も高い商品
	Dim lngItemNo_1 As Long		' 商品番号
	Dim strCategory_1 As String	' 商品カテゴリー
	Dim strItem_1 As String		' 商品名
	Dim dteSalesDate_1 As Date	' 販売日
	Dim strInCharge_1 As String	' 担当者

	' 累計売上高の最も少ない商品
	Dim lngItemNo_2 As Long		' 商品番号
	Dim strCategory_2 As String	' 商品カテゴリー
	Dim strItem_2 As String		' 商品名
	Dim dteSalesDate_2 As Date	' 販売日
	Dim strInCharge_2 As String	' 担当者

	' 今月の売上高の最も高い商品
	Dim lngItemNo_3 As Long		' 商品番号
	Dim strCategory_3 As String	' 商品カテゴリー
	Dim strItem_3 As String		' 商品名
	Dim dteSalesDate_3 As Date	' 販売日
	Dim strInCharge_3 As String	' 担当者

	' 今月の売上高の最も少ない商品
	Dim lngItemNo_4 As Long		' 商品番号
	Dim strCategory_4 As String	' 商品カテゴリー
	Dim strItem_4 As String		' 商品名
	Dim dteSalesDate_4 As Date	' 販売日
	Dim strInCharge_4 As String	' 担当者

	' -- ここからは解説対象外のためコメントのみ --
	' 各変数にデータを設定
	' 各変数を使ってデータ処理(表示など)
	
End Sub

▽構造体を使うパターン

Type Item
	lngItemNo As Long	' 商品番号
	strCategory As String	' 商品カテゴリー
	strItem As String	' 商品名
	dteSalesDate As Date	' 販売日
	strInCharge As String	' 担当者
End Type

Sub TypeUseSample()

	Dim GrossSales_Max As Item	' 累計売上高の最も高い商品
	Dim GrossSales_Min As Item	' 累計売上高の最も少ない商品
	Dim ThisMonthSales_Max As Item	' 今月の売上高の最も高い商品
	Dim ThisMonthSales_Min As Item	' 今月の売上高の最も少ない商品

	' -- ここからは解説対象外のためコメントのみ --
	' 各変数にデータを設定
	' 各変数を使ってデータ処理(表示など)
End Sub

2.引数の数を減らせる

構造体を引数として、利用することで、明らかに引数の数が少なくなり、見た目もシンプルになりますね。

▽構造体を使わないパターン

' 呼び出し側の関数
Sub Main()

	' -- ここからは解説対象外のためコメントのみ --
	' 変数宣言
	' 変数へのデータ設定
	' -- ここまでは解説対象外のためコメントのみ --
	
	' 関数の呼び出し
	NotUseTypeSample lngItemNo, strCategory, strItem, dteSalesDate, strInCharge

End Sub

' 処理をする関数
Sub NotUseTypeSample(ByVal lngItemNo As Long, ByVal strCategory As String, ByVal strItem As String, ByVal dteSalesDate As Date, ByVal strInCharge As String)

	' -- ここからは解説対象外のためコメントのみ --
	' 何らかの処理をする

End Sub

▽構造体を使うパターン

Type Item
	lngItemNo As Long	' 商品番号
	strCategory As String	' 商品カテゴリー
	strItem As String	' 商品名
	dteSalesDate As Date	' 販売日
	strInCharge As String	' 担当者
End Type

' 呼び出し側の関数
Sub Main()

	' -- ここからは解説対象外のためコメントのみ --
	' 変数宣言
	' 変数へのデータ設定
	' -- ここまでは解説対象外のためコメントのみ --
	
	' 関数の呼び出し
	TypeUseSample GrossSales_Max

End Sub

' 処理をする関数
Sub TypeUseSample(ByRef inputItem As Input )

	' -- ここからは解説対象外のためコメントのみ --
	' 何らかの処理をする

End Sub

3.複数の変数をまとめて戻り値に設定できる

Function Procedureは戻り値を取得できますが、戻り値は1つだけと決められています。そこで、構造体を使うことによって、複数の変数をまとめて取得可能な関数を作成できます。

Type Item
	lngItemNo As Long	' 商品番号
	strCategory As String	' 商品カテゴリー
	strItem As String	' 商品名
	dteSalesDate As Date	' 販売日
	strInCharge As String	' 担当者
End Type

' 呼び出し側の関数
Sub Main()

	Dim retItem As Input
	
	' 関数の呼び出し
	retItem = GetItemData(1)	' 商品番号1番の商品情報を取得

	' -- ここからは解説対象外のためコメントのみ --
	' 取得した商品情報に対し、何らかの処理をする
	
End Sub

' 処理をする関数
Function GetItemData(ByVal lngItemNo As Long) As Input

	' -- ここからは解説対象外のためコメントのみ --
	' 商品番号に対応するデータを戻り値に設定するなどの処理

End Function

4.変数のデータ型などを毎回考える必要が無い

開発するプログラムによって、取扱うデータの雛形をあらかじめ構造体として定義することによって、後からシステム拡張や修正をする人が、各データのデータ型や変数名などを考え、宣言せずに構造体を1つ宣言すれば良くなります。
意外とデータ型や変数名って、迷うのですよね。

今回はVBAで構造体を使うメリットについてまとめてみました。
プログラム設計というのは、なかなか一筋縄ではいかないので、実現したい業務に合わせて、試行錯誤しなければなりませんが、少しでも参考になれば嬉しいです。

-VBA, VBAマクロ
-, ,