ここから本文です

EXCEL VBA フォームの動的に作成した各コントロールのイベントについて

for_million_smile_of_lilyさん

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件中

並び替え:回答日時の
新しい順
|古い順

fortunecityさん

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

rio_koringoさん

2013/2/709:28:30

基本は
http://oshiete.goo.ne.jp/qa/504573.html
こんな感じなのでしょうけど、
複数に対してどうするのかは・・・?
⇒各ボタンのイベントがどうなっているのかわからないし、
何よりクラスモジュールは難しい・・・・・

http://qanda.rakuten.ne.jp/qa4033874.html
こちらも参考になりそうな気もするのですが
私の頭では難解で。。。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

お得情報

(PR)日本最大級のお試しサイト!
1700円相当の商品が864円で試せる♪
先着順のため、お早めに!(モラタメ)
<応募者全員にプレゼント>
グンゼYGインナー「ダブルホット」が
お得になるクーポンプレゼント中!
Tポイントをためるなら、この1枚!
Yahoo! JAPANカード≪年会費永年無料≫
最大7,000円相当のTポイントもらえる

その他のキャンペーン

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。