[Excel VBA]ポリモーフィズムを用いて、IF文を使わずラジオボタンごとの処理分岐を行う
概要
この記事について
VBAにおいてポリモーフィズムの考え方によりコーディングを行う一例。
CallByName関数によるポリモーフィズムの考え方と、
ラジオボタン(オプションボタン)オブジェクトのtagプロパティを用いて、
IFステートメントやSelect Caseステートメントを使わずに処理分岐を行う実装例。
説明のために作成したExcelファイルとソースコードはこちらでダウンロードできます。
作成環境
Windows10
MSOffice 2016
前提
下のような画面があり、
ラジオボタンを選択し、実行ボタンを押下することで
ラジオボタンの種類に応じた処理を行う。
名称 | 画像 |
---|---|
フォーム | |
現在時刻を表示するラジオボタンを選択 | |
ユーザ名を表示するラジオボタンを選択 | |
あいさつを表示するラジオボタンを選択 |
オブジェクトのプロパティ
名前 | 種類 | Caption | GourpName | Tag | Value(初期値) |
---|---|---|---|---|---|
rdo_showCurrent | ラジオボタン | 現在時刻を表示する | Group01 | Current | True |
rdo_showUser | ラジオボタン | ユーザ名を表示する | Group01 | User | False |
rdo_showGreeting | ラジオボタン | あいさつを表示する | Group01 | Greeting | False |
btn_execute | コマンドボタン | 実行 | -- | -- | -- |
関数概要
名前 | 所属モジュール/クラス | 種類 | 機能 |
---|---|---|---|
btn_execute_Click | F_Main | Subプロシージャ | btn_executeのClickメソッド ラジオボタンの種類に応じた処理を実行する |
btn_execute_Click_Current | clsPolymo | Functionプロシージャ | 現在時刻を表示する |
btn_execute_Click_User | clsPolymo | Functionプロシージャ | ユーザ名を表示する |
btn_execute_Click_Greeting | clsPolymo | Functionプロシージャ | あいさつを表示する |
コード
[btn_execute_Click]
1'******************************************************************************************
2'*関数名 :btn_execute_Click
3'*機能 :
4'*引数(1) :
5'******************************************************************************************
6Private Sub btn_execute_Click()
7
8 '定数
9 Const FUNC_NAME As String = "btn_execute_Click"
10
11 '変数
12 Dim suffix As String
13 Dim objPolymo As clsPolymo
14
15 On Error GoTo ErrorHandler
16
17 Set objPolymo = New clsPolymo
18
19 '選択された処理を取得
20 '再帰的なファイル検索の有無
21 suffix = _
22 WorksheetFunction.Rept(Me.rdo_showCurrent.Tag, Abs(CLng(CBool(Me.rdo_showCurrent.Value)))) & _
23 WorksheetFunction.Rept(Me.rdo_showUser.Tag, Abs(CLng(CBool(Me.rdo_showUser.Value)))) & _
24 WorksheetFunction.Rept(Me.rdo_showGreeting.Tag, Abs(CLng(CBool(Me.rdo_showGreeting.Value))))
25 If suffix = "" Then MsgBox "ラジオボタンの選択が不正です", vbCritical, Tool_Name: GoTo ExitHandler
26
27 '処理関数の呼出
28 If Not CallByName(objPolymo, FUNC_NAME & "_" & suffix, VbMethod) Then GoTo ExitHandler
29
30
31ExitHandler:
32
33 Set objPolymo = Nothing
34
35 Exit Sub
36
37ErrorHandler:
38
39 MsgBox "エラーが発生したため、マクロを終了します。" & _
40 vbLf & _
41 "関数名:" & FUNC_NAME & _
42 vbLf & _
43 "エラー番号:" & Err.Number & vbNewLine & _
44 Err.Description, vbCritical, Tool_Name
45
46 GoTo ExitHandler
47
48End Sub
WorksheetFunction.Rept関数は
①引数の文字列を②引数の数だけ繰り返した文字列を返す。
1'abcabcabc
2WorksheetFunction.Rept("abc",3)
Abs(CLng(CBool(Me.rdo_showCurrent.Value)))は、
ラジオボタンが選択された状態であれば、1を、
非選択の状態であれば、0を返す。
よって、
suffix変数には、選択されたラジオボタンのみのTagプロパティの文字列が
代入される。
CallByName関数によって、
clsPolymoクラスに用意されている、
btn_execute_Click+〇〇(Tagの文字)の関数が呼び出される。
[btn_execute_Click_Current]
1'******************************************************************************************
2'*関数名 :btn_execute_Click_Current
3'*機能 :現在時刻を表示する
4'*引数(1) :
5'*戻り値 :True > 正常終了、False > 異常終了
6'******************************************************************************************
7Public Function btn_execute_Click_Current() As Boolean
8
9 '定数
10 Const FUNC_NAME As String = "btn_execute_Click_Current"
11
12 '変数
13
14 On Error GoTo ErrorHandler
15
16 btn_execute_Click_Current = False
17
18 '現在時刻を表示する
19 MsgBox "現在時刻:" & Now, , Tool_Name
20
21 btn_execute_Click_Current = True
22
23ExitHandler:
24
25 Exit Function
26
27ErrorHandler:
28
29 MsgBox "エラーが発生したため、マクロを終了します。" & _
30 vbLf & _
31 "関数名:" & FUNC_NAME & _
32 vbLf & _
33 "エラー番号:" & Err.Number & vbNewLine & _
34 Err.Description, vbCritical, Tool_Name
35
36 GoTo ExitHandler
37
38End Function
[btn_execute_Click_User]
1'******************************************************************************************
2'*関数名 :btn_execute_Click_User
3'*機能 :ユーザ名を表示する
4'*引数(1) :
5'*戻り値 :True > 正常終了、False > 異常終了
6'******************************************************************************************
7Public Function btn_execute_Click_User() As Boolean
8
9 '定数
10 Const FUNC_NAME As String = "btn_execute_Click_User"
11
12 '変数
13
14 On Error GoTo ErrorHandler
15
16 btn_execute_Click_User = False
17
18 With CreateObject("WScript.Network")
19 'ユーザ名を表示する
20 MsgBox "ユーザ名:" & .UserName, , Tool_Name
21 End With
22
23 btn_execute_Click_User = True
24
25ExitHandler:
26
27 Exit Function
28
29ErrorHandler:
30
31 MsgBox "エラーが発生したため、マクロを終了します。" & _
32 vbLf & _
33 "関数名:" & FUNC_NAME & _
34 vbLf & _
35 "エラー番号:" & Err.Number & vbNewLine & _
36 Err.Description, vbCritical, Tool_Name
37
38 GoTo ExitHandler
39
40End Function
41
[btn_execute_Click_Greeting]
1'******************************************************************************************
2'*関数名 :btn_execute_Click_Greeting
3'*機能 :あいさつを表示する
4'*引数(1) :
5'*戻り値 :True > 正常終了、False > 異常終了
6'******************************************************************************************
7Public Function btn_execute_Click_Greeting() As Boolean
8
9 '定数
10 Const FUNC_NAME As String = "btn_execute_Click_Greeting"
11
12 '変数
13
14 On Error GoTo ErrorHandler
15
16 btn_execute_Click_Greeting = False
17
18 MsgBox "こんにちは。", , Tool_Name
19
20 btn_execute_Click_Greeting = True
21
22ExitHandler:
23
24 Exit Function
25
26ErrorHandler:
27
28 MsgBox "エラーが発生したため、マクロを終了します。" & _
29 vbLf & _
30 "関数名:" & FUNC_NAME & _
31 vbLf & _
32 "エラー番号:" & Err.Number & vbNewLine & _
33 Err.Description, vbCritical, Tool_Name
34
35 GoTo ExitHandler
36
37End Function
ポリモーフィズムによって、
clsPolymoから呼び出される関数が
suffixの値に従って決定されるため、
IFステートメントの使用無しで処理分岐を実行できる。
この仕組みを使用したツール
↓↓こちらの記事で紹介しました。 ↓↓
[Excel VBA]選択フォルダ配下のエクセルブックの全シートでA1にカーソル移動させるツールを作成した
関連記事
- [Excel VBA]選択フォルダ配下のエクセルブックの全シートでA1にカーソル移動させるツールを作成した
- [Excel VBA] 見積書作成ツールを作成した
- [Access VBA] デザインビューのテーブル定義を表形式でエクスポートするAccessツールを作成した
- [Access VBA] デザインビューのテーブル定義を表形式でエクスポートする関数を作成した
- 【Excel】非マクロのメール作成ツールを作成した