😺

【ExcelVBA】クラスモジュール使ったテストの順位付けマクロ

に公開

はじめに

VBAの機能にある、クラスモジュールとプロパティを使ったテストの順位付けマクロを実装しました。

テストデータ

下記の画像のようにテストデータを作成しました

実装した標準モジュール

実装した標準モジュールは以下の通りです

'メイン処理
Sub main()
    
    'Class1のインスタンス変数の定義
    Dim cls1 As Class1
    'Class1のインスタンス変数の設定
    Set cls1 = New Class1
    
    'Class2のインスタンス変数の定義
    Dim cls2 As Class2
    'Class2のインスタンス変数の設定
    Set cls2 = New Class2
    
    
    'dataシートの順位クリアメソッドを呼び出す
    cls2.clear_data
    
    '語学の順位付けメソッドを語学の得点列と順位列を引数にして呼び出す。
    cls1.target_point_col = 8
    cls1.target_degree_col = 10
    Call cls1.calc_degree
    '全体の順位付けメソッドを全体の得点列と順位列を引数にして呼び出す。
    cls1.target_point_col = 9
    cls1.target_degree_col = 11
    Call cls1.calc_degree
    
    ThisWorkbook.Save
   

End Sub
    

データシートの順位列のデータクリア処理のクラスモジュール

実装した順位のデータクリア処理のクラスモジュールは以下の通りです

'データクリアメソッド

Public Sub clear_data()
    
    'worksheet変数の定義
    Dim ws1 As Worksheet
    '開始行変数
    Dim first_row As Long
    '最終行変数
    Dim last_row As Long
    '「data」シートをws1変数にセットする。
    Set ws1 = ThisWorkbook.Worksheets("data")
    
    first_row = 3
    last_row = ws1.Cells(Rows.count, 3).End(xlUp).Row
    
    ws1.Range("J" & first_row & ":" & "K" & last_row).ClearContents
    
    ThisWorkbook.Save
    
End Sub

順位付けのクラスモジュール

順位付けのクラスモジュールは以下の通りです。

Option Explicit

'クラス変数の定義
Private Ctarget_point_col As Long
Private Ctarget_degree_col As Long


'順位付けメソッドを順位付けする得点列と、順位付け列の列番号を引数にして、呼び出す。
'メソッドの呼び方
' 1.インスタンス変数(オブジェクト変数)で以下を宣言してください。
'    Dim [変数名] As Class1
'    例 clsというインスタンス変数をClass1に定義する場合
'    Dim cls As Class1
'  インスタンスを設定する場合
'    Set [変数名] = New [クラス名]
'    例 Classをclsというインスタンス変数に設定する場合
'    Set cls = New Class1


'プロパティの設定方法
'①target_point_colプロパティの設定
'[インスタンス変数].target_point_colでtarget_pont_colプロパティを設定し、集計対象の点数の列番号を設定する。
'[インスタンス変数].target_point_col = x
'設定例
' 10列目に順位付け対象の得点列がある場合
' cls.target_point_col = 10

'②target_degree_colプロパティの設定
'[インスタンス変数].target_degree_colでtarget_degree_colプロパティを設定し、順位を出力する列番号を設定する。
'[インスタンス変数].target_degree_col = y
'設定例
' 12列目に順位を出力する場合
' cls.target_degree_col = 12

'①、②のプロパティを設定してから、メソッドを呼ぶ
' Call [インスタンス変数].calc_degree
'
'インスタンス変数がcls変数で、calc_degreeメソッドを呼ぶ場合
' Call cls.calc_degree


Public Sub calc_degree()
    '最高スコア変数の定義
    Dim max_score As Long
    '順位変数の定義
    Dim degree As Long
    'worksheet変数の定義
    Dim ws1 As Worksheet
    '順位列のセルの値を受け取る変数
    Dim degree_data As Variant
    '開始行変数
    Dim first_row As Long
    '最終行変数
    Dim last_row As Long
    'データ件数の変数定義
    Dim record_count As Long
    '得点入力変数
    Dim point_data As Long
    '順位入力済カウント
    Dim device_degree_count As Long
    
    
    '「data」シートをws1変数にセットする。
    Set ws1 = ThisWorkbook.Worksheets("data")
    'degree変数に1をセット
    degree = 1
    
    'first_row変数に3をセット
    first_row = 3
    'last_row変数に氏名の最終行をセット
    last_row = ws1.Cells(Rows.count, 2).End(xlUp).Row
    'record_count変数にレコード件数を代入する。
    record_count = last_row - first_row + 1
    
    
    '順位がデータ変数の値の間、繰り返す
    While degree <= record_count
        'カウント変数
        Dim i As Long
        'max_score変数に0をセット
        max_score = 0
        'device_degree_count変数に0を代入する
        device_degree_count = 0
        
        'データの開始行から終了行まで繰り返す
        For i = first_row To last_row
            '得点データを変数に代入する。
            point_data = ws1.Cells(i, target_point_col).value
            '順位データを変数に代入する
            degree_data = ws1.Cells(i, target_degree_col).value
            '得点データが最高点より大きく、順位データに何も文字列が入っていない場合
            'point_data変数の値を、max_score変数に代入する。
            If point_data > max_score And degree_data = "" Then
                max_score = point_data
            End If
        Next i
        
        'データの開始行から終了行まで繰り返す
        For i = first_row To last_row
            '得点データを変数に代入する。
            point_data = ws1.Cells(i, target_point_col).value
            '順位データを変数に代入する
            degree_data = ws1.Cells(i, target_degree_col).value
            
            '得点データが最高点と等しく、順位データに何も文字列が入っていない場合
            'i行目のtarget_degree_col列目のセルに、degree変数の値を代入する。
            If point_data = max_score And degree_data = "" Then
                ws1.Cells(i, target_degree_col).value = degree
                  
            End If
        Next i
        
        'データの開始行から終了行まで繰り返す
        For i = first_row To last_row
            '順位列の値をdegree_data変数に代入する。
            degree_data = ws1.Cells(i, target_degree_col).value
            'degree_data変数の値に何かが入っていれば、device_degree_count変数の値に1を足す。
            If degree_data <> "" Then
                device_degree_count = device_degree_count + 1
                                
            End If
        Next i
        'device_degree_count変数の値をdegree変数に代入する。
        degree = device_degree_count
        'degree変数の値を1加算する。
        degree = degree + 1
        
    Wend
    
End Sub

'集計対象の得点列をクラス変数Ctarget_point_colに代入する(setter)

Public Property Let target_point_col(value As Long)
    Ctarget_point_col = value
End Property
'集計対象の得点列をプロパティに代入するメソッド(getter)
Public Property Get target_point_col() As Long
    target_point_col = Ctarget_point_col
End Property

'順位出力列をCtarget_degree_col変数に代入するメソッド(setter)
Public Property Let target_degree_col(value As Long)
    Ctarget_degree_col = value
End Property

'順位出力列をプロパティに代入するメソッド(getter)
Public Property Get target_degree_col() As Long
    target_degree_col = Ctarget_degree_col
End Property

テスト結果

テスト結果は以下の画像の通りです。

最後に

クラスモジュールを使うと便利なので、これを機に積極的にクラスモジュールを使いたいと思います。

Discussion