Developer

【ExcelVBA】ユーザ定義型②
2021.10.03
Lv1

【ExcelVBA】ユーザ定義型②

ユーザ定義型の復習

前回はユーザ定義型について紹介しました。
IntergerやStringといった型で宣言した変数や配列にはその型の値しか格納できず、年齢や名前を同じ配列に格納するといったことができません。
そうした場合に、ユーザが独自に型を定義することで異なる型のデータをひとまとめにして、値を保持しておきたい場合に使用することができるようになっているのがユーザ定義型です。
今回はユーザ定義型を使用したサンプルを見ていきましょう。

ユーザ定義型のサンプルコード

ではユーザ定義型を使用したコードを見ていきましょう。
以前の連載【ExcelVBA】配列の操作ではシートに記載されているスコアの合計値を表示させるコードを紹介しました。
得点だけが記載されたシートでしたが、それを少し変更してみましょう。

得点を競うゲームの参加者の名前と年齢、そしてゲームのスコアが記載されたシートがあり、そのシートの内容を配列に格納し平均点よりも高い参加者の名前と年齢、スコアを表示させるとします。

今回はスコアだけでなく、名前や年齢といったデータも保持します。
名前は文字列となり、年齢やスコアは数値となります。こういった異なる型のデータを複数保持するために名前を格納する配列、年齢を格納する配列、スコアを格納する配列と3つの配列を用意する方法もあります。

たださらに住所などそのほかの情報も保持しなければならなくなった場合、管理するのが容易ではありません。
そこで今回はユーザ定義型を使用します。

Private Type PlayerData
    name As String
    age As Integer
    score As Integer
End Type
    

Sub VBA基礎第31回()
    Dim sum As Integer
    Dim num As Integer
    Dim avg As Double
    Dim player() As PlayerData
    
    sum = 0
    num = Cells(2, 2).Value             '人数を読み取り(B2の値)
    ReDim player(num) As PlayerData     '読み取った人数の分で配列の要素数を指定
   
    'A4から下の列の値を順番に配列scoreに格納
    For i = 0 To num - 1
        player(i).name = Cells(4 + i, 1)    '要素nameにA列の値を格納
        player(i).age = Cells(4 + i, 2)     '要素ageにB列の値を格納
        player(i).score = Cells(4 + i, 3)   '要素scoreにC列の値を格納
        sum = sum + player(i).score
        
    Next
    
    avg = sum / num                     '平均値を算出
    
    '配列の中身が平均以上の値だけを取り出して文字を結合
    For i = 0 To num - 1
        If player(i).score >= avg Then
            message = message & "名前:" & player(i).name & " 年齢:" & player(i).age & " 点数:" & player(i).score & vbCrLf
        End If
    Next
    
    MsgBox "平均以上のスコアは" & vbCrLf & message
       
End Sub


プレイヤーの名前、年齢、スコアを格納するための新たな型PlayerDataを定義しています。
前回も説明しましたが、シートモジュール上でユーザ定義型を定義する場合、Privateをつけないとエラーとなります。
12行目でユーザ定義型PlayerData型の動的配列を宣言し16行目で要素数を指定しています。
今回の配列は配列の1つ要素に対してname、age、scoreの3つ値が入る形になります。

次For nextステートメントを使用して順番にA4、B4、C4とデータを読み込み配列に格納しています。
最初のループでは配列のインデックス番号0の要素に対して読み取った名前(A4)、年齢(B4)、スコア(C4)の値をユーザ定義型として定義したの要素name、age、scoreに格納しています。
ユーザ定義型の各要素にアクセスするには「.」で要素を指定します。
次にA5、B5、C5の値を配列のインデックス番号1の要素に格納といったようにデータの分だけ繰り返します。

実行結果は以下のようになります。

このように問題なくユーザ定義型が定義されていれば後はほかの型のように使用することが可能です。

まとめ

ユーザ定義型はほかの型のように使用することが可能です。
複数の異なる種類のデータを保持する際に向いています。

確認問題

社員ID(数値)、名前、住所、年齢を保持するためにEmployeeというユーザ定義型を定義し、10人分のデータを保持するための
配列を用意してください。
配列の先頭の要素にID:1、名前:鈴木、住所:東京、年齢:23を格納してください。

答え


解答例


[vb] Private Type Employee
id As Integer
name As String
address As String
age As Integer
End Type

Sub VBA基礎第31回_2()
Dim data(10) As Employee

data(0).id = 1
data(0).name = "鈴木"
data(0).address = "東京"
data(0).age = "23"

End Sub

[/vb]

次回は、「select caseステートメント」です。

 
 

連載目次リンク

ExcelVBA 入門 連載目次