VBAのユーザー定義型変数の意味や使い方がわからない・・・
ユーザー定義型変数を使いこなすと、どんなことができるのだろう?
VBAで基礎的な変数を使った処理が作れるようになったあとに学ぶのが、ユーザー定義型変数です。使い方を見て使ってみたものの、いまいち使いどころがよくわからず悩んでいる人もいるのではないでしょうか。
こんにちは!フリーランスエンジニア兼テックライターのワキザカです。
この記事では、VBAのユーザー定義型変数の概要・使い方・使いどころについて徹底的に解説します!
VBAで値を扱う時の重要な考え方についても最後に解説しているので、ぜひ最後まで見てくださいね!
この記事はこんな人のために書きました。
- VBAのユーザー定義型変数の使い方・使いどころを知りたい人
- VBAで値を扱う時のコツについて詳しく知りたい人
VBAのユーザー定義型変数とは?
はじめに、ユーザー定義型変数について簡単に解説します。
ユーザー定義型変数とは、複数の型・値を1つの変数名で管理する事が出来る型のことです。
複数の値をセットで扱うことができる方法に配列がありますよね。配列は同じ型の値しか扱うことができませんが、ユーザー定義型変数は、数値型、文字列型など複数の型を一度に扱うことができるのでとても便利なのです。
使い方は、次のとおりです。
ユーザー定義型変数の使い方:
Type ユーザー定義型変数名 要素1 As 型 要素2 As 型 要素3 As 型 End Type Sub Test() Dim 変数1 As ユーザー定義型変数名 変数1.要素1 = 値 変数1.要素2 = 値 変数1.要素3 = 値 End Sub
「Type ユーザー定義型変数名」の中で複数の型を指定することができるため、Testプロシージャの中で「変数1.要素〇」のように「ユーザー定義型変数.〇〇」のように値を扱うことができます。
このように、複数の型をまとめて扱いたいときは、ユーザー定義型変数がとても便利です。
ちなみに、ユーザー定義型変数のことを「構造体」と言ったりもします。構造体については以下で詳しく解説しているので、興味がある方はぜひ見てみてくださいね!
VBAでユーザー定義型変数を使いこなす方法とは?
ユーザー定義型変数の解説だけ見ても、いまいち使いどころがよくわからない・・・という方も多いですよね。
そのため、次にVBAでユーザー定義型変数を使いこなす方法について解説します。
複数の型の値を1つにまとめて扱いたいとき
1つ目は、複数の型の値を1つにまとめて扱いたいときです。
サンプルをもとに解説しますね。
サンプルコード:
ype PersonInfo No As Integer '番号 Name As String '氏名 Sex As String '性別 Tel As String '電話番号 Address As String '住所 End Type Sub Test1() Dim person1(2) As PersonInfo '個人情報の入力 person1(1).No = 1 person1(1).Name = "侍1" person1(1).Sex = "男性" person1(1).Tel = "08000000000" person1(1).Address = "東京都品川区 XXXXXXXXXXXXXX" person1(2).No = 2 person1(2).Name = "侍2" person1(2).Sex = "女性" person1(2).Tel = "08000000000" person1(2).Address = "東京都品川区 XXXXXXXXXXXXXX" '配列の数分値を出力 Dim i As Integer For i = 1 To UBound(person1) Debug.Print person1(i).No Debug.Print person1(i).Name Debug.Print person1(i).Sex Debug.Print person1(i).Tel Debug.Print person1(i).Address Debug.Print "-----------------------------------" Next i End Sub
実行結果:
1 侍1 男性 08000000000 東京都品川区 XXXXXXXXXXXXXX ----------------------------------- 2 侍2 女性 08000000000 東京都品川区 XXXXXXXXXXXXXX -----------------------------------
person1というユーザー定義型変数を配列として宣言し、person1(1)、person1(2)にそれぞれNo、Name、Sex、Tel、Addressの値をセットしています。Noは数値ですが、Nameは文字列なので配列では表現できないですよね。
このように、複数の型を含んで使う時はとても便利です。仮にユーザー定義型変数を使わなかった場合は、次のようになってしまいます。
サンプルコード:
Sub Test2() '変数宣言 Dim No_1 As Integer Dim Name_1 As String Dim Sex_1 As String Dim Tel_1 As String Dim Address_1 As String Dim No_2 As Integer Dim Name_2 As String Dim Sex_2 As String Dim Tel_2 As String Dim Address_2 As String '個人情報の入力 No_1 = 1 Name_1 = "侍1" Sex_1 = "男性" Tel_1 = "08011111111" Address_1 = "東京都品川区 XXXXXXXX" No_2 = 2 Name_2 = "侍2" Sex_2 = "女性" Tel_2 = "08011111111" Address_2 = "東京都品川区 XXXXXXXX" '値の出力 Debug.Print No_1 Debug.Print Name_1 Debug.Print Sex_1 Debug.Print Tel_1 Debug.Print Address_1 Debug.Print "-----------------------------------" Debug.Print No_2 Debug.Print Name_2 Debug.Print Sex_2 Debug.Print Tel_2 Debug.Print Address_2 Debug.Print "-----------------------------------" End Sub
変数宣言、値のセット、値の出力全て個々の変数を扱う必要があるので、コードが無駄に長いですよね。また、ユーザーが増えるごとに変数を追加していく必要があるため、保守性も悪いです。
そのため、1つのグループとして複数の型の値をまとめたいときは、ユーザー定義型変数がおすすめなのです。
戻り値にまとめて値を返したいとき
2つ目は、戻り値にまとめて値を返したいときです。
サンプルをもとに解説しますね。
サンプルコード:
'ユーザー定義型変数をセット Type SumResult CalcResult As Integer '計算結果 ErrMsg As String 'エラーメッセージ End Type 'メインの処理 Sub Main() 'ユーザー定義型変数を宣言 Dim Result As SumResult 'AとBの合計を計算する関数を実行 Dim A As Integer: A = 32767 Dim B As Integer: B = 1 Result = CalcSum(A, B) 'ResultのErrMsgに「エラー」が入っていた時はメッセージを表示して処理終了 If Result.ErrMsg = "エラー" Then MsgBox "数値計算の処理でエラーが発生しました。" & vbCrLf & _ "Module1.CalcSum", vbCritical Exit Sub End If MsgBox "合計は" & Result.CalcResult & "です。" End Sub '引数A、Bの合計とエラー情報を返す関数 Function CalcSum(A As Integer, B As Integer) As SumResult On Error GoTo CalcSum_Err '変数宣言 CalcSum.CalcResult = A + B CalcSum.ErrMsg = "" Exit Function 'エラーのときは、エラーメッセージをセット CalcSum_Err: CalcSum.ErrMsg = "エラー" End Function
まず、ユーザー定義型変数SumResultの中で、計算結果を入れるためのCalcResultと、関数のエラーメッセージを返すためのErrMsgを定義しています。Mainプロシージャの処理の中で、CalcSum関数を呼び出して、CalcSumの中でエラーが起こった時だけユーザー定義型変数のErrMsgに「エラー」を入れて返すよう処理を組んでいます。
このように、「計算結果」 + 「エラーメッセージなど文字列」を返すことができるので、「エラー処理は入れたいけど、計算結果も返すような関数作りたい・・・」というときにとても便利です!
慣れるまでは大変かもしれませんが、ぜひ使ってみてくださいね!
VBAで値を扱うときに重要な考え方
ここまでユーザー定義型変数の使い方について解説してきました。
ただ、やみくもにユーザー定義型変数を使えばいいかというと、そうでもありません。たとえば、数値型で複数の値を扱うときは、次のように列挙型変数Enumを使って書く方がわかりやすいです。
サンプルコード:
'列挙型変数を用意 Enum ColNo No = 1 Name = 2 Tel = 3 End Enum Sub Test() '変数宣言 Dim No As Integer Dim Name As String Dim Tel As String 'セルの値をセット No = Cells(2, ColNo.No).Value Name = Cells(2, ColNo.Name).Value Tel = Cells(2, ColNo.Tel).Value '値を出力 Debug.Print "No:" & No Debug.Print "Name:" & Name Debug.Print "Tel:" & Tel End Sub
セルのデータ:
実行結果:
No:1 Name:侍エンジニア1 Tel:080-XXXX-XXXX
Enumで使う必要があるのか?と思う方もいるかもしれませんが、Enumを使う場合は、メインの処理で変数宣言する必要がありません。列挙型変数Enumに直接値が入るため、宣言する分のコードが減るのです。
また、同じ型で複数の値を使う時は、配列で表現することもできます。そのため、配列、Enum、ユーザー定義型変数を以下のように使い分けることがおすすめです!
- 同じ型のみで複数の値:配列
- 数値の型のみで複数の値:Enum
- 複数の型で複数の値:ユーザー定義型変数
慣れないうちは大変かもしれませんが、無駄なコードをなくして綺麗なコードが書けるようになると、コードを書く速度も圧倒的に上がります。メンテナンス性も高まるので、ぜひ使いどころを見極めて使ってみてくださいね!
ちなみに、配列やEnumについては以下で詳しく解説しています。あまり使ったことがない方は、以下を見てみてくださいね!
まとめ
今回は、VBAのユーザー定義型変数の使い方・使いどころについて解説しました。
最後にお伝えしたように、やみくもに使うのではなく使いどころを見極めて使っていくことがおすすめです。
メンテナンス性の高い綺麗なコードを書く力を、ぜひ身に着けてくださいね!