『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】構造体とは? 使い方と実例を解説!

プロシージャの冒頭で変数のデータ型を宣言することは、VBA の基本中の基本ですね。整数のデータを扱うときは Integer や Long, 文字列を扱うときは String を宣言しておきます。この記事を読んでくれてる人にとっては、そんなことは百も承知かと思いますが、宣言した以上は、その変数に格納できるデータの型は一種類だけです。Integer型変数には整数だけ、String型変数には文字列だけしか入れることができません。しかし、これらの異なるデータ型を組合わせた変数を自分で勝手に定義することもできます。それが 構造体 (ユーザー定義型変数) です。

【VBA】構造体(ユーザー定義型変数)

VBA構造体の概念を本 (book) を例にとってイメージしてみます。ただ単に「本 (book)」といえば、世界中に存在するあらゆる形態の書物を含む一般名詞です。しかし、それぞれの本には表題 (title)、著者 (author)、価格 (price) といった特有の属性をもっています。それを図で表すと下のようなイメージになります。
 
VBAユーザー定義型変数(構造体)概念図
 
構造体は宣言セクション(モジュールの一番上)で 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() を実行すると、イミディエイトウィンドウに一覧が表示されるはずです。
 
このように、構造体を使えば、複数の変数をまとめて1つのオブジェクトとして扱えます。同様の機能は クラスモジュール を使っても実装できます。クラスモジュールは単にデータをまとめて格納するだけでなく、そのデータを扱うためのプロパティやメソッドも備えています。しかし、構造体に比べると、クラスモジュールの設計手順は複雑で手間がかかります。また、構造体が変数として宣言されるとすぐに使用できますが、クラスモジュールはインスタンス化する必要があります。異なる型のデータをまとめておきたい、というぐらいの状況であれば、敢えてクラスモジュールを使う必要はないと思います。格納したデータを使って、もっと複雑なことをしてみたい、あるいは VBA でオブジェクト指向プログラミングをしてみたいと考えるのであれば、一歩踏み込んでクラスモジュールを使ってみるのもいいかもしれません。

コメント

  1. あとりえこばと より:

    ChatGPTが構造体について解説します

    [ChatGPT] VBAには構造体というデータ型があります。構造体は、複数の変数をまとめて1つのオブジェクトとして扱えるようにするためのもので、それぞれの変数に名前を付けてアクセスできます。C言語などで使われる構造体と似た機能を持っています。VBAでは、Typeキーワードを使って構造体を宣言します。以下は、構造体の宣言の例です。

    Type Employee
        Name As String
        Age As Integer
        Salary As Double
    End Type

    この例では、Employeeという名前の構造体を定義しています。この構造体は、Name、Age、Salaryの3つの変数を持ちます。構造体を使うと、宣言した構造体を型として使って変数を宣言することができます。以下は、構造体を使った変数宣言の例です。

    Dim employee1 As Employee
    Dim employee2 As Employee

    この例では、Employeeという構造体を型として、employee1とemployee2という2つの変数を宣言しています。宣言した構造体の各変数には、名前を使ってアクセスできます。以下は、構造体の変数に値を代入する例です。

    employee1.Name = "John"
    employee1.Age = 30
    employee1.Salary = 50000.0

    この例では、employee1という構造体のName、Age、Salaryの変数にそれぞれ値を代入しています。構造体は、複数の変数を一度に扱う場合に便利です。例えば、同じ型の構造体の配列を作ることもできます。また、構造体を使うことで、より複雑なデータを扱いやすくすることができます。