次のコードを使用して、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フォームで制御イベントを動的に追加するには;最初に、クラスモジュールにイベントを追加する必要があります。私の例では、clsTESTという名前のクラスモジュールを1つのイベント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"
次に、目的の関数を実行するその名前のマクロを作成します。これは、より良いものが見つかるまでの私のハックです。