非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

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]

スポンサーリンク

 - Excel, VBA