ExcelマクロVBA入門
第110回.ユーザー定義型・構造体(Type)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2019-11-04

第110回.ユーザー定義型・構造体(Type)


ユーザー定義型は、名前の通りユーザーが定義できるデータ型になります。
普通の変数は、1つの値しか入れられませんが、
ユーザー定義型は、複数の異なるデータ型を入れる事が出来ます。
プログラミング言語での一般的な呼び方としては、構造体とも呼ばれます。


ユーザーが定義(構造体)は、オブジェクトとも言えます。
(プログラミング言語によっては、オブジェクトそのものです)
オブジェクトが、複数のデータ型の違うプロパティを持っていることと同様に考えてよいものです。

ユーザー定義型は、Typeステートメントで宣言します。

Typeステートメントの構文

Type ステートメントを使って、異なるデータ型を組み合わせた独自のデータ型を作成できます。
ユーザー定義型には 1 つまたは複数のデータ型の要素、配列、または事前に定義したユーザー定義型を格納することができます。

[Private | Public] Type varname
  elementname [([subscripts])] As type
  [elementname [([subscripts])] As type]
  ・・・

End Type



Public 省略可能です。
すべてのプロジェクトのすべてのモジュールのどのプロシージャからも参照できるユーザー定義型を宣言するときに指定します。
Private 省略可能です。
宣言が行われたモジュール内でのみ参照できるユーザー定義型を宣言するときに指定します。
varname 必ず指定します。
宣言するユーザー定義型の名前です。
変数の標準的な名前付け規則に従って指定します。
elementname 必ず指定します。
ユーザー定義型を構成する要素の名前です。要素名は、変数の標準的な名前付け規則に従って指定します。
ただし、キーワードを使うこともできます。
subscripts 省略可能です。
配列の要素の次元を指定します。
動的配列を宣言する場合は、かっこだけを指定します。引数 subscripts の構文は次のとおりです。
[lower To] upper [,[lower To] upper] . . .
引数 lower を省略すると、配列の添字の最小値は Option Base ステートメントによって制御されます。
Option Base ステートメントが記述されていない場合は、添字の最小値は 0 になります。
type 必ず指定します。
要素のデータ型を指定します。バイト型 (Byte)、ブール型 (Boolean)、整数型 (Integer)、長整数型 (Long)、通貨型 (Currency)、単精度浮動小数点数型 (Single)、倍精度浮動小数点数型 (Double)、10 進型 (Decimal) (現在はサポートされていません)、日付型 (Date)、文字列型 (String) (可変長の場合は String、固定長の場合は String * length)、オブジェクト型 (Object)、バリアント型 (Variant)、ほかのユーザー定義型、オブジェクトの種類のいずれかを指定できます。

Type ステートメントは、モジュール レベルでのみ使用できます。
ユーザー定義型は、その型の変数を宣言して使用します。
つまり、Type ステートメントは型(LongやString等と同様)を定義しているだけです。
ユーザー定義型は、複数のフィールド(項目)を持つレコードのような使い方が出来ます。

注意点
ユーザー定義型は参照渡しだけで引き渡すことができ、値渡しでは引き渡せません。
ユーザー定義型の変数全体を、直接バリアント型 (Variant) に代入できません。

ユーザー定義型の使い方

ユーザー定義型を使用するときは、通常の変数と同様に、
Dim
Private
Public
これらで変数宣言します。
変数宣言のデータ型として、
モジュールレベルで宣言してある、ユーザー定義型の名前を指定します。

Type type社員
  ・・・
End Type

Sub sample()
  Dim 社員 As type社員
  ・・・
End Sub

ユーザー定義型の使用例

社員を管理する場合、
番号
氏名
所属
住所
電話
このような項目があるとした場合、
これをユーザー定義型として定義します。



Type type社員
  番号 As Long
  氏名 As String
  所属 As String
  住所 As String
  電話 As String
End Type

Sub sample()
  Dim 社員 As type社員
  社員.番号 = 1101
  社員.氏名 = "名前"
  ・・・
End Sub

ユーザー定義型の変数は、インテリセンスが有効となります。
メンバーが自動表示されるので、VBA記述がとても楽になります。

VBA マクロ ユーザー定義型 Type

これだけでは、さほど有効な使い方に見えないかもしれません。
ユーザー定義型を配列として定義し、大量データを扱うような場面には非常に強力な機能となります。

ユーザー定義型の制限

ユーザー定義型は、
・Variant変数に入れることはできません。
・Collectionに入れることはできません。
・Dictionaryに入れることはできません。

以下で詳しく解説しています。
ユーザー定義型の制限とクラスとの使い分け
VBAにはユーザー定義型(Type)があり、複数の要素(複数のデータ型)を含むデータ型を定義できます。複数の値をひとまとめで扱う方法として配列がありますが、配列は同じ型の値しか扱うことができませんが、ユーザー定義型の変数には、文字列型、数値型等々の複数のデータ型をひとまとめにして入れることができます。

最後に

ユーザー定義型を使いこなせるようになるには、相応の時間が必要かもしれません。
しかし、これを使いこなすことで得られるメリットはすくなくありません。
ユーザー定義型を配列と組み合わせて大量データ処理をするVBAを、
効率的に作成できるようになることは、VBA習得の一つの目標といえるでしよう。

以下でユーザー定義型を使用していますので参考にしてください。
オートフィルタを退避回復するVBAクラス
シートにオートフィルタが適用されていて、かつ絞り込みされている場合は、VBAでは、何かと注意が必要になります。このような場合、オートフィルタを解除するか、フィルタ絞り込みをクリアして対応している事が多くなります。しかし、オートフィルタを解除したり、フィルタをクリアしてしまうと、それまでの絞り込み条件が消えてしまい、

先々クラスを使うようになった時にもユーザー定義型の知識がとても役に立ちます。
VBAクラスの作り方:列名の入力支援と列移動対応
クラスを使う良さとして、入力支援が使えてコーディングが楽になるという利点があります、列番号をクラスに持てば、列名が候補表示されて非常に便利です。しかし、これを実装するには、かなりの手間がかかります。つまり、クラス作成に手間をかけて、その後を楽にするということになります。



同じテーマ「マクロVBA入門」の記事

第107回.プロシージャーの引数
第108回.変数の適用範囲(スコープ,Private,Public)
第109回.列挙型(列挙体)Enum
第110回.ユーザー定義型・構造体(Type)
第111回.静的配列
第112回.動的配列(Redim)
第113回.配列に関連する関数
第114回.セル範囲⇔配列(マクロVBA高速化必須テクニック)
第115回.Split関数
第116回.ファイル操作Ⅱ(OpenとClose)
第117回.ファイル操作Ⅱ(Line Input #)


新着記事NEW ・・・新着記事一覧を見る

VBAにおける変数のメモリアドレスについて|VBA技術解説(11月8日)
空文字列の扱い方と処理速度について(""とvbNullString)|VBA技術解説(1月7日)
Errオブジェクトとユーザー定義エラー|VBA入門(11月5日)
シングルクォートの削除とコピー(PrefixCharacter)|VBA技術解説(11月4日)
ユーザー定義型の制限とクラスとの使い分け|VBA技術解説(11月3日)
クリップボードに2次元配列を作成してシートに貼り付ける|VBA技術解説(11月1日)
VBAクラスを使ったイベント作成(Event,RaiseEvent,WithEvents)|VBA技術解説(10月31日)
VBAクラスのAttributeについて(既定メンバーとFor Each)|VBA技術解説(10月19日)
VBAの用語について:ステートメントとは|VBA技術解説(10月16日)
VBAのマルチステートメント(複数のステートメントを同じ行に)|VBA技術解説(10月14日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • ユーザー定義型・構造体(Type)

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。




    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ