vba個人的メモ（ユーザ定義型＆データ読み込み＆プロシージャによる返却＆共通変数）

初投稿です。

# 内容
VBAは久しぶりに触ると色々忘れてて都度調べがちなので、
ユーザ定義型のリストを読み込んだり判定したりするサンプルとして以下に備忘する。

データは衆議院参議院それぞれのＨＰから名前を引っ張りだしたものを使用。
サンプルの判定として自民党であれば先頭の一文字をＨ列に設定する。

# ［データ］シート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300735/d9ec4bd9-5f34-9eb1-f2e1-0a5db60170c2.png)

# 呼び出し部
![呼び出し部キャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300735/8edfaa46-8109-c04e-c7b2-a6843885861e.png)
※ボタンはActiveX コントロールのボタンを使用。ボタン名はbtn_1

# モジュール1
```
'全てのモジュールで使用可能の共通変数
'※初期化しないと再実行時に前回の値を保持してるので注意
Public myDic As Object
Public データ先頭_row As Long, データ先頭_col As Long, データ終端_row As Long, データ終端_col As Long, データ件数 As Long
Public resultList() As String
Type データ定義
    ID As String
    氏名 As String
    しめい As String
    会派 As String
    選挙区 As String
    院 As String
End Type

'************************************************
'* ボタンが押されたときに実行される主処理プロシージャ
'* 処理の流れは以下
'* 　１．データの読み込み＆セルのクリア　→　「init」
'* 　２．各種判定　→　「判定」モジュールの「自民党」
'* 　３．結果の貼り付け
'************************************************
Public Sub main()
    With ThisWorkbook.Sheets("データ")
    Dim data() As データ定義
    data = init()
        
    '各判定処理の呼び出し
    For i = 0 To UBound(data)
        If data(i).会派 = "自民" Then
            resultList(i) = 判定.自民党(data(i))
        End If
    Next
    
    '結果出力
    .Range(.Cells(データ先頭_row, データ終端_col + 1), .Cells(データ終端_row, データ終端_col + 1)) _
    = WorksheetFunction.Transpose(resultList)
    End With
End Sub

'データをユーザ定義型のリストとして読み込み、呼び出し元に返却するプロシージャ
'セルのクリアや共通変数などの初期化はこのタイミング
Function init() As データ定義()
    With ThisWorkbook.Sheets("データ")
    
    'Dim データ先頭_row As Long, データ先頭_col As Long, データ終端_row As Long, データ終端_col As Long, データ件数 As Long
    データ先頭_row = 4 '4行目から開始
    データ先頭_col = 2 'B列から開始
    データ終端_row = .Cells(Rows.Count, データ先頭_col).End(xlUp).Row
    データ終端_col = 7 'G列で終了
    データ最大index = データ終端_row - データ先頭_row
    
    Dim rangeWork As Range
    Set rangeWork = .Range(.Cells(データ先頭_row, データ先頭_col), .Cells(データ終端_row, データ終端_col))
    
    Dim dataX() As データ定義
    ReDim dataX(データ最大index) As データ定義
    ReDim resultList(データ最大index) As String
    
    For i = 0 To データ最大index
        dataX(i).ID = rangeWork(i + 1, 1).Value
        dataX(i).氏名 = rangeWork(i + 1, 2).Value
        dataX(i).しめい = rangeWork(i + 1, 3).Value
        dataX(i).会派 = rangeWork(i + 1, 4).Value
        dataX(i).選挙区 = rangeWork(i + 1, 5).Value
        dataX(i).院 = rangeWork(i + 1, 6).Value
        resultList(i) = "" 'ついでに初期化
    Next
    
    End With
        
    'dictionaryを使用してみたり
    Set myDic = CreateObject("Scripting.Dictionary")
    myDic.Add "orange", 80
    myDic.Add "apple", 120
    
    '返却
    init = dataX
End Function


```

# 判定
```
Function 自民党(data As データ定義) As String
    'Select Case文使ったり    
    Select Case data.氏名
        Case "山田なにがし"
        Case Else
    End Select
    
    'IF文使ったり
    If data.ID = 3 Then
    ElseIf data.ID = 4 Then
    ElseIf data.ID = 6 Then
    ElseIf data.ID = 7 Then
    Else
    End If
    
    'お試しで人の名前の先頭１文字を返却
    自民党 = Left(data.氏名, 1)
End Function
```

# 不足していると思う処理
別にフルでここにメモする必要はないと思うが、使用するにおいて不足している処理
* エラー処理
* 不正なデータ等の場合（例：０件）の処理
* セルのクリア
* 実行前や後のメッセージ
* サンプルとしての例文

# さいごに
もう少しキレイに修正したいっちゃしたい。