VBAプログラミング日記(Excel)

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です