HKokina Execl Soft

UserFormでClass

 ユーザーフォーム上にコマンドボタンをいくつか配置したとき,クラスを使うとボタン番号で処理ができる
 左のユーザーフォームは7つボタンがあるので,クラス側でそれぞれのボタンが押されたときのイベント処理を記述。
 ユーザーフォームでNewClass1でインスタンス化して,初期化でコマンドボタンの番号と関連づける。
コマンドボタンイベントクラス CommandButton オブジェクト名 myCommB ① 
'****************  myCommB に記述する部分 *****************
Option Explicit

'////////////////////////////////////////////
'コマンドボタンクラス
'UserFormのコマンドボタン1~7が押されたときの処理
'////////////////////////////////////////////

'イベントを持つコマンドボタン型の変数名をBtnと宣言②
Private WithEvents Btn As MSForms.CommandButton

'ボタン番号格納用の変数名をmyNOと宣言③
Private myNO As Integer                            

'New によって作成される時のメソッド(コンストラクタ処理?)
Public Sub NewClass(ByVal C As MSForms.CommandButton) 
' 引数C(任意)のコマンドボタンを変数②に格納
        Set Btn = C 
End Sub

'Letプロパティ名をMyIndexとした④
Public Property Let MyIndex(ByVal i As Integer) 
    myNO = i                                  'ボタン番号③myNOを入れ込む
End Property

'Getのプロパティ名をMyIndex⑤
Public Property Get MyIndex() As Integer           
    MyIndex = myNO                            'ボタン番号③を取り出す
End Property

Private Sub Btn_Click()
'----------------------------------
'コマンドボタンが押されたときの動作
'----------------------------------
       Select Case MyIndex       'MyIndexでボタン番号を取り出す 
          Case 1
     'コマンドボタン1が押されたときの処理をここに書く
          Case 2
          Case 3
          Case 4
          Case 5, 6
          Case 7
        End Select
       
End Sub

'**************** UserFormに記述する部分 *****************

Option Explicit

'モジュールレベルの変数Btnを 型myCommB(①と同じ)で宣言
'変数名は任意ここではBtn⑥
Private Btn(1 To 7) As New myCommB    

Private Sub UserForm_Initialize()
  Dim i As Integer     
      'コマンドボタンをクリックしたときイベントが実行されるようにする
      For i = 1 To 7
          'インスタンス化 コマンドボタンのイベントを登録し実体化
          'ここのBtnは⑥で宣言した変数名
          Btn(i).NewClass Controls("CommandButton" & i)
          '④でMyIndexプロパティにコマンドボタンの番号を登録
          Btn(i).MyIndex = i         
      Next
End Sub

オプションボタンクラス OptionButton ’オブジェクト名 myOpClass  ①
'****************  myOpClass に記述する部分 *****************
Option Explicit
'////////////////////////////////////////////
'オプションボタンクラス
'////////////////////////////////////////////
'イベントを持つオプションボタン型の変数名をOptと宣言②
Private WithEvents Opt As MSForms.OptionButton

'ボタン番号格納用の変数名をmyNOと宣言③
Private myNO As Integer 

'New によって作成される時のメソッド(コンストラクタ処理
Public Sub NewClass(ByVal c As MSForms.OptionButton)
' 引数C(任意)のコマンドボタンを変数②に格納
     Set Opt = c
End Sub

'Letプロパティ名をMyIndexとした④
Public Property Let MyIndex(ByVal i As Integer) 
    myNO = i                                     'ボタン番号myNoに番号を格納
End Property

'Getのプロパティ名をMyIndex⑤
Public Property Get MyIndex() As Integer
    MyIndex = myNO
End Property

Private Sub Opt_Click()
'----------------------------------
'オプションボタンがクリックされたとき
'----------------------------------
       Select Case MyIndex
          Case 1 
'    この部分に番号に応じた処理を書く 
          Case 2
'     ……
          case 15
      End Select
End Sub

'**************** UserFormに記述する部分 *****************
Option Explicit
'モジュールレベルの変数Optを 型myOpClass(①と同じ)で宣言
'変数名は任意ここではBtn⑥
Private Opt(1 To 15) As New myOpClass

Private Sub UserForm_Initialize()
   Dim i As Integer
   'オプションボタンをクリックしたときイベントが実行されるようにする
   For i = 1 To 15
       'インスタンス化 イベントを登録し実体化
       'ここのOptは⑥で宣言した変数名
       Opt(i).NewClass Controls("OptionButton" & i)
       '④でMyIndexプロパティにボタンの番号を登録
       Opt(i).MyIndex = i
   Next
   
End Sub

テキストボックスクラス TextBox ’オブジェクト名 myTBoxClass ①
'****************  myTBoxClass に記述する部分 *****************
Option Explicit
'////////////////////////////////////////////
'テキストボックスクラス
'////////////////////////////////////////////
'イベントを持つテキストボックス型の変数名をTBoxと宣言②
Private WithEvents TBox As MSForms.TextBox

'ボタン番号格納用の変数名をmyNOと宣言③
Private myNO As Integer 'ボタン番号用

'New によって作成される時のメソッド(コンストラクタ処理
Public Sub NewClass(ByVal mT As MSForms.TextBox)
' 引数mT(任意)のテキストボックスを変数②に格納
     Set TBox = mT
End Sub

'Letプロパティ名をMBoxNoxとした④
Public Property Let MBoxNo(ByVal i As Integer)  
    myNO = i
End Property

'Getのプロパティ名をMBoxNoとした⑤
Public Property Get MBoxNo() As Integer
    MBoxNo = myNO
End Property

Private Sub Tbox_change()
  'テキストボックスを書き換えたとき割り込みが発生しないように 
  Application.EnableEvents = False
    Select Case MBoxNo  'MBoxNoでテキストボックス番号を取り出す 
  '  この部分に処理 
          Case 1 
                TBox.Text = StrConv(TBox.Text, vbNarrow)
          Case 2
                
    End Select
  Application.EnableEvents = True

End Sub

'**************** UserFormに記述する部分 *****************
Option Explicit
'モジュールレベルの変数 TBoxを 型myTBoxClass(①と同じ)で宣言
'変数名は任意ここではTbox⑥
Private TBox(1 To 6) As New myTBoxClass

Private Sub UserForm_Initialize()
   Dim i As Integer
   'オプションボタンをクリックしたときイベントが実行されるようにする
   For i = 1 To 6
       'インスタンス化 コマンドボタンのイベントを登録し実体化
       'ここのTBoxは⑥で宣言した変数名
       TBox(i).NewClass Controls("TextBox" & i)
      '④でMBoxNoプロパティでコマンドボタンの番号を登録
       TBox(i).MBoxNo = i '④のプロパティ名がMBoxNoになっているから
   Next
   
End Sub

  スピンボタンクラス  Spb  ’オブジェクト名 mySpiClass ①
      
'****************  mySpiClass に記述する部分 *****************
Option Explicit

'////////////////////////////////////////////
'スピンボタンクラス 未使用のためバグがあるかも
'////////////////////////////////////////////
'イベントを持つスピンボタン型の変数名をSpbと宣言②
Private WithEvents Spb As MSForms.SpinButton

'ボタン番号格納用の変数名をmyNOと宣言③
Private myNO As Integer 'ボタン番号用

'New によって作成される時のメソッド(コンストラクタ処理
Public Sub NewClass(ByVal C As MSForms.SpinButton)
' 引数mT(任意)のテキストボックスを変数②に格納
     Set Spb = C
End Sub
'Letプロパティ名をmyNoとした④
Public Property Let mSPNo(ByVal i As Integer)
    myNO = i
End Property

'Getのプロパティ名をmGNoとした⑤
Public Property Get mSPNo() As Integer
    mSPNo = myNO
End Property

Private Sub Spb_SpinUp()
  '書き換えたとき割り込みが発生しないように
  Application.EnableEvents = False
    Select Case myNO  '番号を取り出す
  '  この部分に処理
          Case 1
                
          Case 2
                
    End Select
  Application.EnableEvents = True
End Sub

Private Sub Spb__SpinDown()
  '書き換えたとき割り込みが発生しないように
  Application.EnableEvents = False
    Select Case myNO  '番号を取り出す
  '  この部分に処理
          Case 1
                
          Case 2
                
    End Select
  Application.EnableEvents = True
End Sub

'**************** UserFormに記述する部分 *****************

'モジュールレベルの変数 宣言
Private Spb(1 To 6) As New mySpi

Private Sub UserForm_Initialize()
   Dim i As Integer
   'オプションボタンをクリックしたときイベントが実行されるようにする
   For i = 1 To 1
       'インスタンス化 コマンドボタンのイベントを登録し実体化
       'ここのTBoxは⑥で宣言した変数名
       Spb(i).NewClass Controls("SpinButton" & i)
      '④でMBoxNoプロパティでコマンドボタンの番号を登録
       Spb(i).mSPNo = i  '④のプロパティ名がMBoxNoになっているから
   Next

   With Worksheets("希望校入力")
        Label2.Caption = .Columns("g").ColumnWidth
   End With
End Sub