Excel/VBA:構造体(Type)を使ってデータ処理を便利にする
Excel/VBAでも構造体があります。Typeというステートメントを使います。
あまり有名じゃないのか、僕の周囲で使っている人少ないですね。でも、使うと便利なので覚えておきましょう。
[ad#top-1]
VBA構造体の基本形
VBAの構造体は以下のように書きます。Type~End Type間に必要な変数を宣言します。この変数群がプロパティとして使えるわけですね。
Type TestStructure Name As String Age As Integer City As String End Type Sub test() Dim person As TestStructure person.Name = "山田太郎" person.Age = 22 person.City = "横浜市" End Sub
「ユーザー定義型は定義されていません」への対処
よくやってしまう失敗例が以下です。
文法は正しいのですが、なぜか「ユーザー定義型は定義されていません」というエラーが発生してしまいます。いったいどこが悪いのでしょうか?
その答えは構造体を宣言する場所です。構造体は使われる場所より上に宣言しなければなりません。今回の例でいくとSubプロシージャと逆にすればいいわけですね。
構造体を配列化させる
構造体を配列で使う場合は以下のように普通に配列宣言すれば使えます。構造体自体は配列を使おうが使いまいが変わりありません。※以下の例は便宜上すべて同じデータを入れています。
Dim person(10) As TestStructure For i = 0 To 9 person(i).Name = "山田太郎" person(i).Age = 22 person(i).City = "横浜市" Next i
Excelの表を構造体に格納すると便利
ExcelマクロはExcelシートとVBAを連携させることで本来持つ力を発揮します。
上記の構造体を配列化することで、Excelシートの表をそのままデータに格納できます。これができると何が良いかと言うと、一度データ化してしまえば、いちいちセルを見に行かなくてもいいんです。セルにアクセスすると速度がガタ落ちするので、構造体の配列は大きなメリットがあります。
例えば、以下のように12万データ以上もある郵便番号リストは、いちいちセルにアクセスするのではなく、一度構造体の配列に入れて、Excelシートではなくそのデータを使えば速度は向上します。
例えば構造体は以下のようにします。
Type ZipList Zip As String Prefecture As String City As String Area As String End Type
この構造体を使ってExcelの表を配列化できます。
Dim adress(123929) As ZipList For i = 0 To 123928 adress(i).Zip = Cells(i + 4, 1) adress(i).Prefecture = Cells(i + 4, 2) adress(i).City = Cells(i + 4, 3) adress(i).Area = Cells(i + 4, 4) Next i
[ad#ad-1]
スポンサーリンク