encel userform에서 동적으로 생성 된 버튼에 VBA 기능을 클릭 할당
-
05-09-2019 - |
문제
다음 코드로 Excel Userform에서 버튼을 동적으로 만들고 있습니다.
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/httpwwcpearsoncomexcelvbehtm.html
더 나은 방법은 미리 양식에 많은 버튼을 만드는 것일 수 있습니다. 이벤트 핸들러 코드도 만듭니다. 처음에는 모두 숨겨지게하십시오.
그런 다음 양식이 열리면 버튼 캡션을 동적으로 변경하여 표시하고 이동할 수 있습니다. 처음에 만든 이벤트 코드는 예상대로 활성화 된 버튼에 연결됩니다.
다른 팁
Excel 형태로 동적으로 제어 이벤트를 추가합니다. 먼저 클래스 모듈에 이벤트를 추가해야합니다. 내 예를 들어, 나는 하나의 이벤트 인 btn_click ()와 함께 clstest라는 클래스 모듈을 추가 할 것입니다.
'#### 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"
그런 다음 원하는 기능을 실행하는 이름으로 매크로를 만듭니다. 이것은 내가 더 나은 것을 찾을 때까지 이것에 대한 나의 해킹입니다.