初投稿です。
内容
VBAは久しぶりに触ると色々忘れてて都度調べがちなので、
ユーザ定義型のリストを読み込んだり判定したりするサンプルとして以下に備忘する。
データは衆議院参議院それぞれのHPから名前を引っ張りだしたものを使用。
サンプルの判定として自民党であれば先頭の一文字をH列に設定する。
[データ]シート
呼び出し部
※ボタンは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
'************************************************
'* ボタンが押されたときに実行される主処理プロシージャ
'* 処理の流れは以下
'* 1.データの読み込み&セルのクリア → 「init」
'* 2.各種判定 → 「判定」モジュールの「自民党」
'* 3.結果の貼り付け
'************************************************
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
'お試しで人の名前の先頭1文字を返却
自民党 = Left(data.氏名, 1)
End Function
不足していると思う処理
別にフルでここにメモする必要はないと思うが、使用するにおいて不足している処理
- エラー処理
- 不正なデータ等の場合(例:0件)の処理
- セルのクリア
- 実行前や後のメッセージ
- サンプルとしての例文
さいごに
もう少しキレイに修正したいっちゃしたい。