2009-02-19 16 views
8

私は次のコードでExcelのユーザーフォームで動的にボタンを作成しています:私はときに実行する機能を割り当てたいのですが割り当てにクリックVBA機能

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

これらのボタンはクリックされますが、ボタン自体の一部としてプロパティがないため、これを行うための簡単な方法はありません。

上記のイディオムを使用してこれを行う方法はありますか?私はこの全部を別のやり方で進めていくべきでしょうか?

答えて

8

ボタンごとにコード/イベントハンドラを動的に作成する必要があります。

それはやってのビットを取る - ここを参照してください:前もって(あなたはあなたが必要と思うほど多くの)フォーム上のボタンの束を作成することであるかもしれないhttp://navpadexcel.blogspot.com/2006/11/httpwwwcpearsoncomexcelvbehtm.html

良い方法。イベントハンドラコードも作成します。それらをすべて最初に隠すようにしてください。

フォームが開いたら、ボタンのキャプションを動的に変更して表示させ、移動することができます。最初に作成したイベントコードは、期待どおりに有効化されたボタンにリンクされます。

+2

賢いアイデア! VBAのすべてが賢明である必要があるようです。 – notnot

0

私もこれを見てきました。

Command1.OnClick = "Macro1" 

マクロを作成するには、目的の関数を実行する名前でマクロを作成します。 これは私が何か良いものを見つけるまでこれを巡るハックです。

+0

優れたユーザーフォームコントロールの場合、assingin "onClick"の結果は... "オブジェクトはこのプロパティまたはメソッドをサポートしていません" – PravyNandas

2

以下のコードは、Excel形式で動的に制御イベントを追加する

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""" 
1
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 
+0

ワークフォームではなくuserformsに追加されたボタンを意味します – notnot

13

作業しなければなりません。最初にクラスモジュールにイベントを追加する必要があります。あなたが見ることができるように、これがどうなる唯一のことは、その後に、ボタンの上にキャプションを設定数のさ

'#### 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 

私例えば、私は一つのイベントでのclsTestという名前のクラスモジュールを追加するつもりです、btn_click()あなたがそれをクリックした回数。フォームコードで 次は、次のように入力します。

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 

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

+0

これは私にとってはうまく機能しました。私はクラスに変数を送ることができる方法があるのだろうかと思っていました。たとえば、私が送信したものに.captionを変更するとしたら、 Private Sub btn_Click(var1 As String) 私はこれを試しましたが、「オブジェクトはこのプロパティまたはメソッドをサポートしていません」 – JahKnows

+0

そうです。 _Click()イベントはパラメータを受け付けません。別の方法として、クラス内に別のプライベート変数を設定し、最初にキャプションを割り当ててから、イベントをハンドラに設定することができます。 – PravyNandas

関連する問題