エクセルユーザーフォームで動的に作成したボタンをオンクリックVBAの機能の割り当て
-
05-09-2019 - |
質問
私は、次のコードを使用して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"
次に、所望の機能を実行し、その名前でマクロを作成します。 私はより良いものを見つけるまで、これは、この周りに私のハックです。