VBAのユーザー定義型変数とは?使いどころも徹底解説!


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のユーザー定義型変数の使い方・使いどころについて解説しました。

最後にお伝えしたように、やみくもに使うのではなく使いどころを見極めて使っていくことがおすすめです。

メンテナンス性の高い綺麗なコードを書く力を、ぜひ身に着けてくださいね!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次