プロシージャの冒頭で変数のデータ型を宣言することは、VBA の基本中の基本ですね。整数のデータを扱うときは Integer や Long, 文字列を扱うときは String を宣言しておきます。この記事を読んでくれてる人にとっては、そんなことは百も承知かと思いますが、宣言した以上は、その変数に格納できるデータの型は一種類だけです。Integer型変数には整数だけ、String型変数には文字列だけしか入れることができません。しかし、これらの異なるデータ型を組合わせた変数を自分で勝手に定義することもできます。それが 構造体 (ユーザー定義型変数) です。
【VBA】構造体
VBA の 構造体 の概念を本 (book) を例にとってイメージしてみます。ただ単に「本 (book)」といえば、世界中に存在するあらゆる形態の書物を含む一般名詞です。しかし、それぞれの本には表題 (title)、著者 (author)、価格 (price) といった特有の属性をもっています。それを図で表すと下のようなイメージになります。
構造体は宣言セクション(モジュールの一番上)で Typeステートメント によって作成します。3つの属性を用いて本を表すデータ型を作成してみると次のようになります。
'[VBA] 構造体の定義
Type Book
title As String
author As String
price As Long
End Type
ここに表題 (title) と著者 (author) については文字列型、価格については整数型で定義されていることに注目してください。構造体は複数の異なるデータ型を混在させることができるのです。
構造体にデータを格納するときは、普通のデータ型と同じくプロシージャの冒頭で Dim によって宣言します。その昔にこばとが書いた本のデータを作成してみます。
'[VBA] 本のデータを作成するプロシージャ Sub Book_Data_1() Dim x As Book '表題を格納します x.title = "踊りながら覚える英文法" '著者をを格納します x.author = "Excelハイマスターこばとちゃん" '価格を格納します x.price = 3500 Debug.Print x.title, x.author, x.price&; "円" End Sub
x を3つの属性をまとめて格納する変数として定義しています。そして表題を格納するには変数の後ろにドットを付けて
x.title = "踊りながら覚える英文法"
のように記述します。著者と価格はそれぞれ x.author, x.price に格納します。Book_Data_1() では確認のために、Debug.Print で3つのデータを表示させるようにしてあるので試してみてください。
書籍の一覧を Book 型で定義された配列に格納するマクロを作ってみます。『あとりえこばと』で出版されたエクセルデータをサンプルとして使います(実際に会社で用いているものには発行日や書籍コードなど他の項目もありますけど、ここでは簡略化してあります)。
表題 | 著者 | 価格 |
---|---|---|
踊りながら覚える英文法 | こばと | 3500 |
こばとの愉快なアラビアン | こばと | 4800 |
ビジネスで使ってはいけない英語 | 刑部真理子 | 1300 |
やまとことば不思議発見 | Aisling McKenzie | 1600 |
言葉の散歩道 | 城戸涼音 | 2200 |
上の表をコピーしてワークシートに貼り付けてください。
コードは次のようになります。
'[VBA] 本のデータを配列に格納するプロシージャ Sub Book_Data_2() 'mydataを配列として宣言します Dim mydata() As Book Dim i As Long Dim rct As Long, lct As Long Selection.CurrentRegion.Select 'リストの行数と列数を得ます rct = Selection.Rows.Count lct = Selection.Columns.Count '配列の要素数を決めます ReDim mydata(rct) '本のデータを格納します For i = 2 To rct mydata(i).title = Selection.Cells(i, 1) mydata(i).author = Selection.Cells(i, 2) mydata(i).price = Selection.Cells(i, 3) Next i '配列を並べてみます For i = 2 To rct Debug.Print mydata(i).title, mydata(i).author, mydata(i).price Next i End Sub
表のどこかを選択した状態で Book_Data_2() を実行すると、イミディエイトウィンドウに一覧が表示されるはずです。え? いい加減な本を売るな? 踊りながら英文法が覚えられるわけがない? う、うそじゃないもん。そういうクレームは本を買ってから言ってくださいな!
コメント