※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。
 当ブログを経由しての商品の購入や、サービスの申し込みが発生すると提携企業からの成果報酬を受けとる場合があります。

エクセルVBAの構造体(ユーザー定義型)の基本的な使い方と注意点

VBA_ユーザー定義型(構造体)の記事のアイキャッチ画像

Contents

エクセルVBAの構造体(ユーザー定義型)とは

エクセルVBAの構造体(ユーザー定義型)の概要

 VBAにおける構造体は、ユーザー定義型とも呼ばれ、異なるデータ型の変数をひとまとめにして新しい型を定義ができる機能です。

構造体は、配列と同様に複数のデータを1つの変数にまとめて扱えるため、プログラムの可読性が向上し、効率的なコードを書くために有効に使えるものです。

エクセルVBAの構造体(ユーザー定義型)を使うメリット

 構造体(ユーザー定義型)は、変数をまとめることでプログラムの可読性が向上します。

 エクセルVBAに限った話ではありませんが、プログラムで複雑な処理を実行するために、膨大な数の変数やオブジェクトを使用します。

しかし、変数やオブジェクトが多くあると、それにともなってコードが複雑になり、コードが読み取りにくくなる傾向があります。

このようなときの解決策の1つとして構造体(ユーザー定義型)を使用することで複数の変数をまとめられます。

複数の変数を1つにまとめられる

 構造体(ユーザー定義型)は、複数の変数をまとめたものを1つのオブジェクトとして扱えます。

関連するデータを1つの変数にまとめることができ、コードからプログラムの全体像をイメージしやすくできます。

 例えば、職員やなにかのコミュニティなどの名簿の情報を格納する場合に、氏名年齢性別生年月日などの個別の変数として管理できるようにこれらの情報を1つのオブジェクトにまとめることができます。

事例1

名簿

 ・氏名
 ・年齢
 ・性別
 ・生年月日

 構造体(ユーザー定義型)は同じ種類のデータ型の変数が複数あるときも力を発揮します。
学生の成績を管理する場合、氏名出席番号数学英語国語などの情報を1つのオブジェクトにまとめられます。

事例2

学生の成績

 ・氏名
 ・出席番号
 ・数学
 ・英語
 ・国語

 このようなことから、構造体(ユーザー定義型)はプログラムの可読性を向上させることができるものだと言えます。

かんたんに言えば変数をパッケージ化できるってことだね。

変数をグループ化することでコードの記述量を削減できる

 構造体(ユーザー定義型)を使用する最大のメリットは、同じ型の複数の変数を1つにまとめられる点です。

たとえば、名前年齢住所という3つの変数を持つユーザー情報を取り扱う場合、通常はそれぞれの値を代入するための変数を宣言する必要があります。

また、それぞれの変数で実行する処理が複雑になればなるほどコードの可読性は下がり、対象となる変数がどのような値をあつかうための変数であるかが見えづらくなってしまいます。

そういったときに構造体(ユーザー定義型)をつかうことで、コードの記述量の減少とともにそれぞれの変数がどういった値を代入するものであるかの理解しやすいものとしてくれます。

以下は構造体(ユーザー定義型)のイメージ画像です。
文章だと伝わりにくいですが、視覚的に図で見るとどういった効果があるかわかりやすいと思います。

構造体(ユーザー定義型)のイメージ画像
VBAのユーザー定義型(構造体)のイメージ画像

プログラムの拡張性が高まる

 構造体(ユーザー定義型)を利用することで、プログラムの拡張性が高まります。

構造体(ユーザー定義型)を使用することで、1つのオブジェクトに複数のデータを格納できるため、将来的に新しいデータが必要になった場合でも、構造体(ユーザー定義型)に新しいフィールドを追加するだけで、既存のコードを変更する必要がなくなります。

 例えば、前述のイメージ画像で示した構造体(ユーザー定義型)である「ユーザー情報」には、名前、年齢、住所の3つのフィールドが既に存在している状態ですが、こちらに電話番号生年月日などのデータを追加したい場合にも、構造体(ユーザー定義型)のフィールドを追加するだけで拡張ができるようになり、将来的なマクロの発展においても柔軟に対応が可能になります。

既存のコードを大きく変更することなく、プログラム(マクロ)を拡張できるように備えておくことは開発する上で大きなメリットと言えます。

独学でプログラミングをはじめてみたけど、このままの学習方法に不安を感じているのなら、
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験

エクセルVBAの構造体(ユーザー定義型)の宣言方法

構造体(ユーザー定義型)の宣言方法

 ここからは構造体(ユーザー定義型)の実際の使用方法について説明していきます。
まずは、構造体(ユーザー定義型)の宣言方法ですが、以下のようにコードを書きます。

構造体(ユーザー定義型)宣言するための構文
  
Option Explicit

Type 構造体名
    フィールド1 As 型1
    フィールド2 As 型2
    ' ...
End Type

 構造体(ユーザー定義型)を宣言するためのコードは宣言セクション内にTypeステートメントを使います。

Typeステートメントは Type から End Type までの間に変数を書きこんでいきます。

Typeのあとに構造体(ユーザー定義型)の名前を指定してください。また、この構造体(ユーザー定義型)に含まれる変数を End Type までの間に変数名とデータの型を指定してください。

書きかたについては、以下に実際のVBEの画像を参考にしてください。

VBEの画像
ユーザー定義型(構造体)を宣言するVBEの宣言セクションを説明する画像

 画像では、フィールド1として、氏名文字列(String)型、フィールド2を年齢として長整数(Long)型、フィールド3が生年月日日付(Date)型、フィールド4が血液型文字列(String)型として4つのフィールドをもつ構造体(ユーザー定義型)を構造体という名前で宣言しています。

構造体(ユーザー定義型)の宣言における注意点

 構造体(ユーザー定義型)を宣言するときの注意点について説明します。

同じ名前の構造体(ユーザー定義型)を宣言することはできない

 宣言セクションで同じ名前の構造体(ユーザー定義型)を宣言するとエラーが発生します。

サンプルコード(コンパイルエラー発生)
  
Option Explicit

'構造体(ユーザー定義型)は宣言セクションで宣言します。
Type 構造体
    
    氏名 As String '構造体(ユーザー定義型)のフィールド1としてなまえと型を宣言
    年齢 As Long '構造体(ユーザー定義型)のフィールド2としてなまえと型を宣言
    生年月日 As Date '構造体(ユーザー定義型)のフィールド3としてなまえと型を宣言
    血液型 As String '構造体(ユーザー定義型)のフィールド4としてなまえと型を宣言

End Type

'複数の構造体(ユーザー定義型)を宣言時は同じ名前だとエラーが発生する
Type 構造体
    
    氏名 As String '構造体(ユーザー定義型)のフィールド1としてなまえと型を宣言
    年齢 As Long '構造体(ユーザー定義型)のフィールド2としてなまえと型を宣言
    生年月日 As Date '構造体(ユーザー定義型)のフィールド3としてなまえと型を宣言
    血液型 As String '構造体(ユーザー定義型)のフィールド4としてなまえと型を宣言

End Type

 モジュール内のプロシージャを実行しようとするとコンパイルエラーが発生し、名前が適切でない旨のエラーメッセージが表示されます。
※フィールド名が同じであっても構造体(ユーザー定義型)名が異なる場合は宣言は可能です。

独学だと中々スキルが身についた実感が湧かない。学習環境を見直してみませんか?

エクセルで繰り返しや転記作業で苦しい思いをした経験はありませんか?
今まで苦労してきたその作業を簡単なプログラムをおぼえるだけで解決できる可能性があります。
なるべくお金や時間をかけずにエクセルマクロVBAを習得したい人にはこちらの「1日速習講座」がおすすめです。

エクセルVBAの構造体(ユーザー定義型)の初期化方法

 前項のとおり、構造体(ユーザー定義型)を宣言セクションで宣言できたら今度は初期化をします。

初期化の方法はとても簡単でプロシージャ内で変数を宣言するだけです。

構造体(ユーザー定義型)を初期化する方法

サンプルコード(宣言セクション)
  
Option Explicit

'構造体(ユーザー定義型)は宣言セクションで宣言します。
Type 構造体
    
    氏名 As String '構造体(ユーザー定義型)のフィールド1としてなまえと型を宣言
    年齢 As Long '構造体(ユーザー定義型)のフィールド2としてなまえと型を宣言
    生年月日 As Date '構造体(ユーザー定義型)のフィールド3としてなまえと型を宣言
    血液型 As String '構造体(ユーザー定義型)のフィールド4としてなまえと型を宣言

End Type

 上記の構造体(ユーザー定義型)を初期化します。

サンプルコード(プロシージャ)
  
Sub mysub1()

    Dim  サンプルユーザー定義型 As 構造体
    サンプルユーザー定義型.氏名 = "青木 一郎"
    サンプルユーザー定義型.年齢 = 29
    サンプルユーザー定義型.生年月日 = #4/18/1994#
    サンプルユーザー定義型.血液型 = "AB"

End Sub

 変数を宣言するときと同じで要領で、Dim 〇〇(変数名)とコードを書きます。
ポイントとなるのは、”As 〇〇“の部分で宣言セクションで宣言したユーザー定義型(構造体)名をデータ型として指定する点です。

構造体(ユーザー定義型)の入力支援機能

 宣言セクションで構造体(ユーザー定義型)を宣言すると、プロシージャ内で入力支援機能(インテリセンス)を使うことができるようになります。

入力支援機能とは?

インテリセンスと呼ばれるものでひとことで言えば、コードの入力を助けてくれる機能のことです。

詳しく知りたい人はリンクをクリック。(外部サイトに接続します。)

入力支援機能(インテリセンス)は、実際に構造体(ユーザー定義型)のフィールドに値を代入する場面などで確認できます。

 フィールドは他の変数と同様に、変数名.フィールド名に”=”で値を代入します。
型の入力や、フィールド名の入力時に入力支援機能(インテリセンス)により予測候補がリストで表示されるようになるのでリストから選択ができます。

構造体“という名前の構造体(ユーザー定義型)を宣言した状態で、プロシージャ(mysub1)で変数の宣言をすると、選択可能な候補リストが表示されます。

以下の画像の中では候補に”構造体“が表示されていることが以下の画面でわかります。

VBAの宣言セクションでユーザー定義型(構造体)を宣言するとプロシージャで変数を宣言するとインテリセンスに宣言したユーザー定義型(構造体)が表示されている画面

さらに、それぞれのフィールドに値の代入をするときも、同じように入力補完機能(インテリセンス)がはたらき、候補となるメンバーが表示されることが次の画像でわかると思います。

VBAの宣言セクションでユーザー定義型(構造体)を宣言するとプロシージャで変数を宣言するとインテリセンスに宣言したユーザー定義型(構造体)のフィールド名が表示されている画面

構造体(ユーザー定義型)の氏名・年齢・生年月日・血液型のフィールドを初期化するコードです。

サンプルマクロのVBAコード

  
Sub mysub1()

    Dim サンプルユーザー定義型 As 構造体
    サンプルユーザー定義型.氏名 = "青木 一郎"
    サンプルユーザー定義型.年齢 = 29
    サンプルユーザー定義型.生年月日 = #4/18/1994#
    サンプルユーザー定義型.血液型 = "AB"

End Sub

03行目

「サンプルユーザー定義型」という名前の変数が構造体として宣言しています。
サンプルユーザー定義型は、氏名、年齢、生年月日、血液型のフィールドを持っている構造体(ユーザー定義型)になります。

04行目から07行目

 氏名、年齢、生年月日、血液型に値を代入しています。
氏名フィールドは”青木 一郎”、年齢フィールドは29、生年月日フィールドは1994年4月18日、血液型フィールドにはABを代入しました。

ここまでのマクロを実行してローカルウィンドウに表示されている値を確認してみます。

サンプルコード実行時にローカルウィンドウ
ユーザー定義型(構造体)の初期化を実行したときのローカルウィンドウ画像

マクロを実行して、構造体(ユーザー定義型)の初期化を実行したときのローカルウィンドウが上の画像です。

それぞれのフィールドに値が代入されていることがわかります。

構造体(ユーザー定義型)のフィールドに値が代入できたね。

構造体(ユーザー定義型)の配列を初期化する方法

 これまでの説明で変数を構造体(ユーザー定義型)として宣言しました。

今度は配列を初期化する方法を紹介します。

宣言セクションによる構造体(ユーザー定義型)の宣言には変更がありませんので、プロシージャの部分のコード部分のみ説明します。

サンプルマクロのVBAコード

  
Sub mysub2()
    
    Dim サンプルユーザー定義型(2) As 構造体

'配列の0番インデックスのフィールドを初期化する
    サンプルユーザー定義型(0).氏名 = "青木 一郎"
    サンプルユーザー定義型(0).年齢 = 29
    サンプルユーザー定義型(0).生年月日 = #4/18/1994#
    サンプルユーザー定義型(0).血液型 = "AB"

'配列の1番インデックスのフィールドを初期化する
    サンプルユーザー定義型(1).氏名 = "石川 美織"
    サンプルユーザー定義型(1).年齢 = 34
    サンプルユーザー定義型(1).生年月日 = #8/2/1988#
    サンプルユーザー定義型(1).血液型 = "A"

'配列の2番インデックスのフィールドを初期化する
    サンプルユーザー定義型(2).氏名 = "有働 信二"
    サンプルユーザー定義型(2).年齢 = 30
    サンプルユーザー定義型(2).生年月日 = #11/23/1992#
    サンプルユーザー定義型(2).血液型 = "O"

End Sub

03行目

 通常の変数と同じように宣言しますが、配列の特徴として添え字として3つの要素を代入できるように”(2)“をつけています。
これにより、サンプルユーザー定義型の変数を3つ準備しています。

06行目から21行目

 サンプルユーザー定義型の0~2の変数に値を代入しています。
それぞれのフィールドに個別の情報を代入することで、3名分の情報が作成できます。

配列は要素は0からだから2を指定すると0、1、2の3つだね。

データを代入した時点での状態を表示すると以下のようになります。

変数名 フィールド名
サンプルユーザー定義型(0) 氏名 青木 一郎
年齢 29
生年月日 1994/4/18
血液型 AB
サンプルユーザー定義型(1) 氏名 石川 美織
年齢 34
生年月日 1988/8/2
血液型 A
サンプルユーザー定義型(2) 氏名 有働 信二
年齢 30
生年月日 1992/11/23
血液型 O
配列については他の記事で詳しく解説していますので、こちらもあわせて読んでみてください。

 通常の変数のときと同じようにマクロを実行して、ローカルウィンドウを確認していきましょう。

以下の画像は実行したときのものです。それぞれに要素の各フィールドに値が代入されていることがわかります。

こうして見ると、構造体(ユーザー定義型)は、ひと目でわかりやすく値が管理ができ、その値がどういったものであるかがグループ化できることはプログラム全体の読みやすさ(可読性)が向上します。

サンプルコード実行時にローカルウィンドウ
ユーザー定義型(構造体)の初期化を実行したときのローカルウィンドウ画像(静的配列)
独学だと中々スキルが身についた実感が湧かない。学習環境を見直してみませんか?

エクセルで繰り返しや転記作業で苦しい思いをした経験はありませんか?
今まで苦労してきたその作業を簡単なプログラムをおぼえるだけで解決できる可能性があります。
なるべくお金や時間をかけずにエクセルマクロVBAを習得したい人にはこちらの「1日速習講座」がおすすめです。

エクセルVBAで構造体(ユーザー定義型)のフィールドにアクセスする

 構造体(ユーザー定義型)のフィールドへのアクセスですが、VBAではドット演算子. を使う方法と、Withステートメントを使う2種類の方法があります。

フィールドへのアクセスにはドット演算子.を使う

ドット演算子.をつかってのフィールドアクセス方法は既に前項でも紹介しているとおり、以下のように書きます。

構造体(ユーザー定義型)名.フィールド名 = 値

  
Sub mysub1()

    Dim サンプルユーザー定義型 As 構造体
    サンプルユーザー定義型.氏名 = "青木 一郎"
    サンプルユーザー定義型.年齢 = 29
    サンプルユーザー定義型.生年月日 = #4/18/1994#
    サンプルユーザー定義型.血液型 = "AB"

End Sub

これで氏名フィールドにアクセスして、”青木 一郎“を代入することができました。

構造体(ユーザー定義型)はWithステートメントでまとめられる

 構造体(ユーザー定義型)の変数名をWithステートメントで囲み、各フィールドにアクセスする際には、ドット. をつけて、フィールド名だけを記述します。

以下のマクロでは、ドット演算子をつかって、フィールドにアクセスしたコードをWithステートメントで書き直したものです。

  
Sub mysub3()

    Dim サンプルユーザー定義型 As 構造体
    
    With サンプルユーザー定義型
        .氏名 = "石川 美織"
        .年齢 = 34
        .生年月日 = #8/2/1988#
        .血液型 = "A"
    End With
    
End Sub

05行目

 Withステートメントをつかってサンプルユーザー定義型をまとめています。
これにより、それぞれのフィールドに値を代入するとき「サンプルユーザー定義型」をくり返し書く必要がなくなります。

Withステートメントの使いかたや、他の使用例についてはこちらの記事でも紹介しています。

構造体(ユーザー定義型)の応用例

 ここまでで構造体(ユーザー定義型)を使用することで、コード量が少なくなります。
コード量が少なくなれば、可読性の向上につながり、拡張しやすいものにできることはおわかりいただけたかと思います。

ここではそんな構造体(ユーザー定義型)をつかったプログラムを2つ紹介します。

構造体(ユーザー定義型)をつかって社員情報を管理する

 3名の社員を構造体(ユーザー定義型)の変数として各フィールドに値を代入して出力するプログラムです。

※宣言セクションの書きかたは、前述のとおりでコチラを参考にしてください。

  
Sub mysub4()

'変数"社員1"を構造体(ユーザー定義型)として宣言する
    Dim 社員1 As 構造体
    
'変数"社員1"の各フィールドに値を代入する
    社員1.氏名 = "青木 一郎"
    社員1.年齢 = 29
    社員1.生年月日 = #4/18/1994#
    社員1.血液型 = "AB"
    
'変数"社員2"を構造体(ユーザー定義型)として宣言する
    Dim 社員2 As 構造体

'変数"社員2"の各フィールドに値を代入する
    社員2.氏名 = "石川 美織"
    社員2.年齢 = 34
    社員2.生年月日 = #8/2/1988#
    社員2.血液型 = "A"
    
'変数"社員3"を構造体(ユーザー定義型)として宣言する
    Dim 社員3 As 構造体

'変数"社員3"の各フィールドに値を代入する
    社員3.氏名 = "有働 信二"
    社員3.年齢 = 30
    社員3.生年月日 = #11/23/1992#
    社員3.血液型 = "O"

'各フィールドの値を出力する
    Debug.Print 社員1.氏名, 社員1.年齢, 社員1.生年月日, 社員1.血液型
    Debug.Print 社員2.氏名, 社員2.年齢, 社員2.生年月日, 社員2.血液型
    Debug.Print 社員3.氏名, 社員3.年齢, 社員3.生年月日, 社員3.血液型
    
End Sub

このコードであれば、新入社員が入社してきた場合などに“社員4″を追加するなどで、簡単にプログラムの拡張ができます。

※こちらでは社員1から社員3と個別に変数をつかっていますが、配列を使う方法でもスッキリとした可読性の高いコードが書けます。

プログラムのコードは見やすさとアップデートのしやすさが大切だよ。

構造体(ユーザー定義型)をつかってCSVファイルを読み込む

 応用例の2つ目では、CSVファイルの読み込み方法を紹介します。

サンプルデータとなるCSVファイルを準備しましたので、そちらを読み込んで構造体(ユーザー定義型)に代入していきます。

サンプルCSVファイル

 こちらのCSVを読み込んでいきます。
サンプルCSVファイルには、それぞれの行に氏名年齢性別出身地所属役職6つの要素があり、101行目(データとしては100件分)が登録されています。

VBAでCSVファイルを読み込むマクロで使用するサンプルデータの画像

このCSVファイルの表データを読み込んでいくよ。

  
Option Explicit

Type 社員情報

    name As String '氏名を代入するフィールド
    age As String '年齢を代入するフィールド
    gender As String '性別を代入するフィールド
    Birthplace As String '出身地を代入するフィールド
    Affiliation As String '所属を代入するフィールド
    director As String '役職を代入するフィールド

End Type

読み込むCSVファイルのデータを読み取るため、1行あたりに6つのフィールド(氏名・年齢・性別・出身地・所属・役職)をもつ、構造体(ユーザー定義型)を宣言しておきます。

  
Sub CSVを読み込む()
    Dim f As Integer
    f = FreeFile'Openステートメントで使用可能な数値(1~511)が返る

'ファイルの格納場所を指定する
    Open "C:\Users\XXXX\Desktop\名簿.csv" For Input As #f
    
    Dim myArray() As 社員情報
    Dim arr As Variant'CSVの行の文字列を代入するための配列
    Dim line As String'CSVの行の文字列を格納する変数
    Dim i As Integer'インデックス用の変数

    Do Until EOF(f)
        ReDim Preserve myArray(i)
        Line Input #f, line
        arr = Split(line, ",")
        myArray(i).name = arr(0)
        myArray(i).age = arr(1)
        myArray(i).gender = arr(2)
        myArray(i).Birthplace = arr(3)
        myArray(i).Affiliation = arr(4)
        myArray(i).director = arr(5)
        i = i + 1
    Loop
    
    Close #f

End Sub

サンプルマクロに書いている手順としては、以下のとおりです。

それぞれの手順について詳しく解説していきます。

ただし、この応用例では、本記事で紹介したい構造体(ユーザー定義型)以外の部分も含むため、それらの部分は深掘りはせずどういったことをしているかに留めておきます。

FreeFile関数の戻り値を整数型の変数に代入する

FreeFile関数Openステートメントで使用できる数値を返す関数です。

1~511までの数値が返ってきます。
サンプルコードの場合は、変数 f には整数” 1 “が代入されます。

OpenステートメントでCSVファイルをひらく

Openステートメントは指定したファイルを開く操作ができます。

Openステートメントの構文

pathname For mode [ Accessaccess ] [ lock ] As [ # ] filenumber [ Len = reclength ] を開く

太字の部分が必須となる指定項目です。

 Openステートメントの構文において、指定項目の pathname mode filenumber の指定は必須です。
サンプルコードで指定項目に代入している値は以下の表のとおりです。

指定項目 サンプルコードでの値
pathname “C:\Users\XXXX\Desktop\名簿.csv”
mode
(Append、Binary、Input、Output、または Random)
Input
filenumber(1~511) 1(※変数 f に代入された数値)
※指定が必須の項目のみサンプルコードの値を掲載しています。

CSVファイルの行ごとのデータをLineInputステートメントで変数に代入する

 サンプルCSVの紹介でも書きましたが、こちらのCSVファイルには100件分のデータが登録されています。
各行のデータごとに読み込んでいくわけですので、行ごとにくり返し処理が必要になります。

 こちらのサンプルコードでは、Do Untilステートメントをつかっています。

Do Untilステートメントは、Forステートメントとちがって具体的な回数や要素数ではなく、指定した条件の判定の結果に従ってくり返します。

ここでの条件式には、EOF関数をつかっていて、EOF関数からの戻り値がTrueになるまでくり返す処理を指定しています。

EOF関数は、RandamやInputモードで開いたファイルの末尾に達すると、真偽値(Boolean)のTrueを返します。それまでの間はFalseを返します。

開いたファイルの末尾までくり返す条件にしているよ。

Do Loopステートメントについての記事はこちらをご覧ください。

 つまりサンプルCSVのDo Loopステートメントでは、CSVファイルの最終行まで繰り返します。

次に処理の内容ですが、最初に配列である myArray の要素数を再定義します。

ReDim Preserveをつかうことで代入された値を保持しながら要素数を追加しています。

配列の宣言や再定義方法など、配列の基本的なつかいかたをお忘れになった人はこちら

 次にLine Input # ステートメントをつかって、サンプルCSVファイルの行をコンマで区切ったに文字列に代入していきます。Line Input # ステートメントについては以下のとおりです。

Line Input # ステートメントの構文

Line Input #ファイル番号, 変数名

ファイル番号・変数名ともに必須の指定項目です。

 サンプルコードでは、サンプルCSVの1行ずつを取り出し、変数 line に代入していきます。

くり返し1回目の処理では、変数 line に文字列として”氏名,年齢,性別,出身地,所属,役職“が代入されます。

くり返し2回目では”まなふ へゆさ,40,男,京都府,営業部,主任“が代入され、3行目、4行目…と処理が繰り返されます。

Split関数でコンマで区切られた文字列を分割し配列に代入する

 Split関数をつかって変数 line に代入した文字列を分割します。
Split関数は指定した区切り記号が含まれる文字列を指定して、記号でそれぞれの文字列を分割して配列を返します。

サンプルコードで2回目の繰り返し時の例だと、変数 line には”まなふ へゆさ,40,男,京都府,営業部,主任“が代入されていますので、コンマで区切った文字列を”まなふ へゆさ“・”40“・”“・”京都府“・”営業部“・”主任“の6つに分割され、1次元配列 arr の要素として代入します。

構造体(ユーザー定義型)のフィールドに配列の値を代入する

 さいごに、構造体(ユーザー定義型)の各フィールドに配列 arr のそれぞれの要素を代入する処理を実行します。

これで、サンプルCSVファイルの101行(100件)分のデータが構造体(ユーザー定義型)で読み込めました。
以下の画像はこのマクロで処理が完了した時点のVBEのローカルウィンドウです。

エクセルVBAでCSVファイルのデータをユーザー定義型(構造体)に読み込み処理を実行した時点のローカルウィンドウの画像

 CSVファイルのすべてのデータが、構造体(ユーザー定義型)に代入されました。

社内で使用しているシステムがある場合、そこから出力したCSVファイルなどをあつかう場合などは、構造体(ユーザー定義型)をもちいたサンプルコードのようなマクロをつかうことで、データを効率的に再利用ができます。

また、構造体(ユーザー定義型)をつかうことで、拡張が簡単なマクロが作れるため、将来的にマクロをの発展するときだけでなく、サンプルCSVファイル以外の、さまざまなCSVファイルのデータの読み込みにも対応ができる汎用性が高いマクロとして重宝します。

エクセルVBAの構造体(ユーザー定義型)を取り扱う時の注意点

 構造体(ユーザー定義型)は、さまざな種類の型の変数をひとまとめにしてくれる便利な機能であることを説明しました。
また、マクロで取り扱う変数をまとめられることで、VBAのコードの可読性が向上したり、アップデートしやすくなります。

そんな便利な構造体(ユーザー定義型)ですが、マクロで取り扱う上での注意点もいくつか存在しますので、ここではいくつか紹介していきます。

構造体(ユーザー定義型)のフィールドのデータ型には制限がある

 ユーザー定義型(構造体)のフィールドに設定できるデータ型は、基本的なデータ型とオブジェクト型です。
エクセルVBAのデータ型には整数型浮動小数点数型文字列型真偽値型などがあり、これらをフィールドに設定が可能です。

一方、オブジェクト型には、Worksheetオブジェクト、Rangeオブジェクト、Collectionオブジェクト、Dictionaryオブジェクトなどがあり、これらもフィールドとして設定することが可能です。

ただし、クラスモジュール内に定義されたクラスや、ActiveXコントロールのインスタンスなどはフィールドに設定することはできない点に注意が必要です。

構造体(ユーザー定義型)で発生するエラー処理に対応する

 構造体(ユーザー定義型)は変数をまとめる上で便利な機能ですが、その特性において、プログラム内でデータの整合性を保つことに注意する必要があります。

構造体のフィールドのデータ型に不正な値が代入されたエラー対処として、使用者にメッセージを表示し、正しい方法を促すことなどの処理を準備しておくことで、マクロやプログラムの異常終了(停止)の発生を未然にふせぐなどの対応が必要です。

エクセルVBAの構造体(ユーザー定義型)に関するまとめ

構造体(ユーザー定義型)の利用方法と注意点

 構造体(ユーザー定義型)の宣言方法は、モジュールの宣言セクションにて、Typeキーワードを使用することで実装できます。また、フィールドのデータ型や名前の指定は、プロシージャで使用する他の変数の宣言と同じ書きかたで設定ができます。

 構造体(ユーザー定義型)のフィールドへのアクセスには、ドット演算子を使用する方法や、Withステートメントを使用する方法があります。フィールドの値を変更する場合は、代入演算子を使用します。

Withステートメントの使い方はこちらの記事でまとめています。

 構造体(ユーザー定義型)を使って、大量のデータを効率的にまとめたりCSVファイルのデータを読み込む方法もあり、応用例も多数存在します。

 複数の構造体(ユーザー定義型)を定義する場合は、それぞれの構造体(ユーザー定義型)名が重複しないように注意する必要があります。

構造体(ユーザー定義型)をつかうことのメリット

ここまでの説明で、構造体(ユーザー定義型)は、複数の変数をひとまとめにできるもので、その効果として、コードの可読性を向上させることや、同じ型の変数を複数定義する必要がなくなることから、マクロにおけるコードの記述量を大きく削減できます。

さらに、実行する処理を書きこむプロシージャとは異なるエリア(宣言セクション)で宣言するためのコードを書きこむため、処理で利用する変数と明確に区別ができ、プログラムやマクロの拡張がしやすいテクニックだと言えます。

今回はここまで。

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント

タイトルとURLをコピーしました