EXCEL VBA フォームの動的に作成した各コントロールのイベントについて
2013/2/700:54:35
EXCEL VBA フォームの動的に作成した各コントロールのイベントについて
EXCEL VBAについてのアドバイス願います。
ユーザーフォームのInitializeイベントにてコードを入力し、コマンドボタンを作成しました。
シートのセルA1~A6にデータが入力されており、このデータ数は増減します。
増減したデータ数に応じてフォーム上にコマンドボタンを作成し、各ボタンをクリックした際に別のマクロを起動させたいと考えています。
このような挙動を行うことができるようご教授ください。
以下、コマンドボタン作成の現在のコードです。
Private Sub UserForm_Initialize()
Dim btn As MSForms.CommandButton
Dim Top As Integer
Dim N As Integer
N = Cells(1, 1).End(xlDown).Row ’データ数
Do While i < N
i = i + 1
Top = (i * 40) - 20
Set btn = Me.Controls.Add("forms.commandbutton.1", "cells(i,1).value")
With btn
.Caption = Cells(i, 1).Value
.Top = Top
.Left = 20
End With
Loop
With Me
.Width = 120
.Height = Top + 60
End With
End Sub
- 閲覧数:
- 7,288
- 回答数:
- 3
- お礼:
- 250枚
ベストアンサーに選ばれた回答
ja7awuさん
編集あり2013/2/712:01:39
こんな感じで如何でしょうか。
取敢えず上2つのボタンについてです。
たぶん、分り易いと思いますが・・・
◎ UserFormのモジュールに記述 (既存 変更/追加)
Option Explicit ' <-- 通常記述するようにする。(VBE Option設定)
Public NewBtn As New Class1 ' <------ 追加
Private Sub UserForm_Initialize()
Dim btn As MSForms.CommandButton
Dim Top As Integer
Dim N As Integer
Dim i As Long ' <-- 何でこれだけ宣言なし?
N = Cells(1, 1).End(xlDown).Row 'データ数
Do While i < N
i = i + 1
Top = (i * 40) - 20
Set btn = Me.Controls.Add("forms.commandbutton.1", "cells(i,1).value")
Select Case i ' <--- ここから追加
Case 1
Set NewBtn.button1 = btn
Case 2
Set NewBtn.button2 = btn
End Select ' <--- ここまで追加
With btn
.Caption = Cells(i, 1).Value
.Top = Top
.Left = 20
End With
Loop
With Me
.Width = 120
.Height = Top + 60
End With
End Sub
◎ クラスモジュールに記述
Option Explicit
Public WithEvents button1 As CommandButton
Public WithEvents button2 As CommandButton
Private Sub button1_Click()
MsgBox "button1"
End Sub
Private Sub button2_Click()
MsgBox "button2"
End Sub
この質問は投票によってベストアンサーに選ばれました!
このQ&Aで解決しましたか?質問する
閉じる
ベストアンサー以外の回答
1〜2件/2件中
- 並び替え:回答日時の
- 新しい順
- |古い順
2013/2/710:35:41
A1からA3までデータがある場合のコードです。
ユーザーフォームのコード
Option Explicit
Private btncls() As Class1
Private Sub UserForm_Initialize()
Dim btn As MSForms.CommandButton
Dim Top As Integer
Dim N As Integer
Dim i As Integer
N = Cells(1, 1).End(xlDown).Row 'データ数
ReDim btncls(N)
Do While i < N
i = i + 1
Top = (i * 40) - 20
Set btn = Me.Controls.Add("forms.commandbutton.1", "cells(i,1).value")
With btn
.Caption = Cells(i, 1).Value
.Top = Top
.Left = 20
Set btncls(i) = New Class1
btncls(i).SetBtn = btn
btncls(i).SetMacro = "test" & i
End With
Loop
With Me
.Width = 120
.Height = Top + 60
End With
End Sub
Public Sub test1()
MsgBox "test1"
End Sub
Public Sub test2()
MsgBox "test2"
End Sub
Public Sub test3()
MsgBox "test3"
End Sub
クラスモジュールを挿入して以下のコードを貼り付けてください。
Option Explicit
Private WithEvents btn As MSForms.CommandButton
Private macro As String
Private Sub btn_Click()
CallByName UserForm1, macro, VbMethod
End Sub
Public Property Let SetBtn(ByVal vNewValue As Variant)
Set btn = vNewValue
End Property
Public Property Let SetMacro(ByVal vNewValue As Variant)
macro = vNewValue
End Property
2013/2/709:28:30
基本は
http://oshiete.goo.ne.jp/qa/504573.html
こんな感じなのでしょうけど、
複数に対してどうするのかは・・・?
⇒各ボタンのイベントがどうなっているのかわからないし、
何よりクラスモジュールは難しい・・・・・
http://qanda.rakuten.ne.jp/qa4033874.html
こちらも参考になりそうな気もするのですが
私の頭では難解で。。。
この質問につけられたタグ
教えて先輩!恋愛のあれこれ
回答受付中の質問