2009-02-19 2 views
8

을 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

나는 이것을보고 있습니다. onClick 속성을 사용하여 매크로를 실행할 수있는 것으로 보입니다.

Command1.OnClick = "Macro1" 

그런 다음 원하는 기능을 실행하는 이름으로 매크로를 만듭니다. 뭔가 더 좋은 것을 찾을 때까지 이것은 내 주변의 해킹입니다.

+0

엑셀 userform 컨트롤에 대해 assingin "onClick"결과가 ... "개체가이 속성 또는 메서드를 지원하지 않습니다." – PravyNandas

2

아래의 코드는 엑셀 형태로 동적으로 제어 이벤트를 추가하려면

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을 내가 보내는 것으로 변경해야하는 경우. 개인 하위 btn_Click (var1 As String) 나는 이것을 시도했지만 "개체가이 속성 또는 메서드를 지원하지 않습니다." – JahKnows

+0

맞습니다. _Click() 이벤트는 매개 변수를 허용하지 않습니다. 다른 방법으로 시도해 볼 수있는 것은 클래스 내에 다른 private 변수를 설정하고 캡션을 먼저 지정한 다음 이벤트를 처리기에 설정하는 것입니다. – PravyNandas

관련 문제