エクセルユーザーフォームで動的に作成したボタンをオンクリックVBAの機能の割り当て

StackOverflow https://stackoverflow.com/questions/566770

質問

私は、次のコードを使用してExcelのユーザーフォームで動的にボタンを作成しています:

With Me.CurrentFrame.Controls.Add("Forms.CommandButton.1")
    .Caption = "XYZ"
    .name = "AButton"
    .Font.Bold = True
    .ForeColor = &HFF&
    ... blah blah blah
End With

私は、これらのボタンがクリックされたときに実行する機能を割り当てたいのですが、ボタン自体の一部として、何のプロパティがありませんので、私はこれを行うための簡単な方法を見つけることができません。

上記のイディオムを使ってこれを行う方法はありますか?私は別の方法でこの全体のことについては行くべきでしょうか?

役に立ちましたか?

解決

あなたは、動的に各ボタンのコード/イベントハンドラを作成する必要があります。

これはやってのビットを取る - ここを参照してください: http://navpadexcel.blogspot.com /2006/11/httpwwwcpearsoncomexcelvbehtm.htmlする

より良い方法は、事前に(あなたはあなたが必要と思うほど多くの)フォーム上のボタンの束を作成するかもしれません。同様のイベントハンドラのコードを作成します。それらすべてが最初に隠さ確認します。

フォームが開いたときに、

次に、あなたは、動的に、ボタンのキャプションを変更する彼らが見えるようにし、それらを動き回ることができます。あなたが最初に作成したイベントコードが期待通りに動作ボタンにリンクされます。

他のヒント

Excelのフォームで動的にコントロールイベントを追加するには、最初にクラスモジュールでイベント(複数可)を追加する必要があります。私の例では、私は1つのイベントでのclsTestという名前のクラスモジュールを追加するつもりです、btn_click()

    '#### CLASS NAMED clsTEST
    Public WithEvents btn As MSForms.CommandButton
    Public frm As UserForm

    Dim iCount As Long

    Private Sub btn_Click()

    iCount = IIf(iCount < 1, 1, iCount + 1)
    btn.Caption = "Count " & Str(iCount)

End Sub
'### END CLASS

あなたが見ることができるように、これがどうなる唯一のことは、あなたがそれをクリックした回数の後、数にボタンのキャプションを設定されています。 次に、フォームのコードで次のように入力します。

    Dim mColButtons As New Collection    '## SET A NEW COLLECTION

    Private Sub UserForm_Activate()
    '
    Dim btnEvent As clsTEST
    Dim ctl As MSForms.Control
    '
    Set ctl = Me.Controls.Add("Forms.CommandButton.1")
    '
    With ctl
    .Caption = "XYZ"
    .Name = "AButton"
    END With
    '
    Set btnEvent = new clsTEST   
    Set btnEvent.btn = ctl
    set btnEvent.frm = Me
    '
    mColButtons.add btnEvent
    'End Sub

フォームをアクティブにすると、それがボタンを作成します。毎回あなたがキャプションが変更されますボタンをクリックします。

以下のコードが動作する必要があります。

Dim NewButton As OLEObject
Dim CodeModule As Object

Set NewButton = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
    Link:=False, DisplayAsIcon:=False, Left:=52.5, Top:=Hght, _
    Width:=202.5, Height:=26.25)
NewButton.Object.Caption = "Click Me!"
Set CodeModule = ActiveWorkbook.VBProject.VBComponents.VBE.ActiveCodePane.CodeModule
CodeModule.InsertLines CodeModule.CreateEventProc("Click", NewButton.Name) + 1, vbTab & "MsgBox ""Hello world"""
Sub Oval1_Click()
    file = ActiveWorkbook.Name
    Set Output = Workbooks.Add()
    ActiveWorkbook.SaveAs Filename:="Try.xls"        
    Sheets(1).Select        
    ActiveSheet.Buttons.Add(460, 10, 140, 30).Select
    ActiveSheet.Buttons.Text = "DATA"      
    ActiveSheet.Shapes("Button 1").Select
    Selection.OnAction = "Book1.xlsm!data_Click"
End Sub

Sub data_Click()      
    MsgBox "you have clicked me"       
    ActiveSheet.DrawingObjects.Delete        
End Sub

私もこれを見てきました。あなたはonClickのプロパティを使用してマクロを実行することができそうです。

Command1.OnClick = "Macro1"

次に、所望の機能を実行し、その名前でマクロを作成します。 私はより良いものを見つけるまで、これは、この周りに私のハックです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top