1 クラスモジュールを使ってボタンの処理を共通化する
やりたいこと。ワークブックの各シートやユーザーフォームのコマンドボタンで機能が同じものには、記述を1つだけで処理の共通化をさせたい。
例 シート1、シート2、シート3があり、それぞれボタン1、ボタン2があるとする。
clsButtonProcessing(クラスモジュール)
Option Explicit
Private WithEvents btn As MSForms.CommandButton
Public Property Let Button(ByVal obj As MSForms.CommandButton)
Set btn = obj
End Property
Private Sub btn_Click()
Select Case btn.Name
Case “CommandButton1”
MsgBox “ボタン1”
Case “CommandButton2”
MsgBox “ボタン2”
End Select
End Sub
各シートのコマンドボタンを指定する。
標準モジュール
Option Explicit
Private cls() As New clsButtonProcessing → 動的配列
Public Sub startClass()
Dim ws As Worksheet
Dim obj As OLEObject
ReDim cls(0)
For Each ws In ThisWorkbook.Sheets
For Each obj In ws.OLEObjects
If obj.progID = “Forms.CommandButton.1” Then
ReDim Preserve cls(UBound(cls) + 1)
cls(UBound(cls)).Button = obj.Object → Object指定
End If
Next obj
Next ws
End Sub
各フォームのコマンドボタンを指定する
Private cls() As New clsButtonProcessing
Private Sub UserForm_Initialize()
Dim c As Control
ReDim cls(0)
For Each c In Me.Controls
If TypeName(c) = “CommandButton” Then → TypeName関数を使用
ReDim Preserve cls(UBound(cls) + 1)
cls(UBound(cls)).Button = c
End If
Next c End Sub
