構造体とは
人・会社・物 等を表すのに、色々な情報があります。
会社を例に取ってみると、会社コード・会社名・設立年月日・資本金・郵便番号・住所・電話番号・FAX番号・・など様々な情報があります。
これらを単純に変数で定義しようとすると以下のようになります。
Dim strCompanyCode As String '会社コード
Dim strCompanyName As String '会社名
Dim dtEstablishment As Date '設立年月日
Dim curCapital As Currency '資本金
Dim strPostNo As String '郵便番号
Dim strAddress As String '住所
Dim strTEL As String '電話番号
Dim strFAX As String 'FAX番号
・
・
Dim strCompanyName As String '会社名
Dim dtEstablishment As Date '設立年月日
Dim curCapital As Currency '資本金
Dim strPostNo As String '郵便番号
Dim strAddress As String '住所
Dim strTEL As String '電話番号
Dim strFAX As String 'FAX番号
・
・
このように個々に書くと、それぞれの関連性が分かりにくくなり、「変数設定忘れ」「重複変数設定」「データの更新し忘れ」・・などのリスクがあります。
これらの変数の情報を会社で括ると非常に見やすくなります。
具体的には下記のように記述します。
'[構造体]会社
Type typCompany
strCompanyCode As String '会社コード
strCompanyName As String '会社名
dtEstablishment As Date '設立年月日
curCapital As Currency '資本金
strPostNo As String '郵便番号
strAddress As String '住所
strTEL As String '電話番号
strFAX As String 'FAX番号
・
・
End Type
Dim stCompany As typCompany '会社
Type typCompany
strCompanyCode As String '会社コード
strCompanyName As String '会社名
dtEstablishment As Date '設立年月日
curCapital As Currency '資本金
strPostNo As String '郵便番号
strAddress As String '住所
strTEL As String '電話番号
strFAX As String 'FAX番号
・
・
End Type
Dim stCompany As typCompany '会社
これだけだとピンとこないかもしれませんが、構造体を設定する事で、全て会社に紐づけられた状態となります。
新たに変数を設定する場合、Type typCompany ~ End Typeまでをチェックすれば、会社として定義すべき変数が網羅されているか、二重登録されていないかチェックしやすくなります。
また、電話番号やFAX番号は会社だけではなく、自社の組織や個人情報としても持っています。今回、電話番号の変数は strTEL と設定しましたが、「会社」で括らなければ何の電話番号か分からなくなります。変数に 会社・組織・人・・・を入れると、変数名だけで非常に長く、管理が大変になり、変数名のネーミングルールや管理が非常に大変となります。
構造体と配列の組み合わせ
構造体は、配列と組み合わせて使う事で最も効果的な使い方となります。(配列については「[変数]配列について」参照)
システムで処理を行う場合、複数レコードを扱う事が一般的で、取引のある会社は1社だけではありません。
処理する会社を都度データベースから読み込んで処理を行う方法も考えられますが、I/Oは処理レスポンスが悪いため、都度I/Oが発生する処理は極力控えた方が良いです。
上記を例に構造体を配列(10万件)で定義すると、下記のようになります。
'[構造体]会社
Type typCompany
strCompanyCode As String '会社コード
strCompanyName As String '会社名
dtEstablishment As Date '設立年月日
curCapital As Currency '資本金
strPostNo As String '郵便番号
strAddress As String '住所
strTEL As String '電話番号
strFAX As String 'FAX番号
・
・
End Type
Dim stCompany(100000) As typCompany '会社
Type typCompany
strCompanyCode As String '会社コード
strCompanyName As String '会社名
dtEstablishment As Date '設立年月日
curCapital As Currency '資本金
strPostNo As String '郵便番号
strAddress As String '住所
strTEL As String '電話番号
strFAX As String 'FAX番号
・
・
End Type
Dim stCompany(100000) As typCompany '会社
このように設定し、配列の数値を変える事で、その会社の情報が管理出来るようになります。
構造体の使い方
構造体の変数を使う場合は、構造体.変数 とします。
配列を使っている場合は、構造体(カウント数).変数 とします。
電話番号を例にすると下記の様に記述します。
stCompany.strTEL = "03-1234-5678" '配列ではない場合
stCompany(0).strTEL = "03-1234-5678" '配列の場合
stCompany(0).strTEL = "03-1234-5678" '配列の場合
構造体の初期化
変数が多くなる程1つ1つ初期化するのは大変です。例えば「実行」ボタンを押した後、再度「実行」ボタンを押して再処理を行う場合、1回目のデータが残ったままになり障害に繋がるケースがあります。
構造体の場合、項目数が多いので一括でクリア(初期化)したいのですが、そういう関数は用意されていなさそうなので、下記のように実際に使う構造体と初期化用の構造体を作成し、初期化する時は初期化用の構造体で上書きします。
Dim stCompany As typCompany '実際に使う構造体
Dim del_stCompany As typCompany '初期用の構造体
stCompany.strTEL = "03-1234-5678" '値をセット
MsgBox stCompany.strTEL 'セットした値を表示
stCompany = del_stCompany '初期化
MsgBox stCompany.strTEL '初期化された事を確認
Dim del_stCompany As typCompany '初期用の構造体
stCompany.strTEL = "03-1234-5678" '値をセット
MsgBox stCompany.strTEL 'セットした値を表示
stCompany = del_stCompany '初期化
MsgBox stCompany.strTEL '初期化された事を確認
一方、構造体に配列を使っている場合、配列の初期化 Erase を使う事ができます。
Dim stCompany(10) As typCompany '配列化した構造体
stCompany(0).strTEL = "03-1234-5678" '値をセット
MsgBox stCompany(0).strTEL 'セットした値を表示
Erase stCompany '初期化
MsgBox stCompany(0).strTEL '初期化された事を確認
stCompany(0).strTEL = "03-1234-5678" '値をセット
MsgBox stCompany(0).strTEL 'セットした値を表示
Erase stCompany '初期化
MsgBox stCompany(0).strTEL '初期化された事を確認