2009-02-19 12 views
8

Tworzę przyciski dynamicznie na UserForm Excel z następującego kodu:Przypisywanie kliknąć na funkcję VBA do dynamicznie utworzony na przycisk Excel UserForm

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

Chciałbym przypisać funkcję uruchomienia kiedy Przyciski te są klikane, ale nie mogę znaleźć prostego sposobu, aby to zrobić, ponieważ nie ma właściwości jako części samego przycisku.

Czy można to zrobić za pomocą powyższego idiomu? Czy powinienem zajmować się tym wszystkim w inny sposób?

Odpowiedz

8

Musisz dynamicznie tworzyć programy obsługi kodu/zdarzenia dla każdego przycisku.

minąć trochę robi - patrz tutaj: http://navpadexcel.blogspot.com/2006/11/httpwwwcpearsoncomexcelvbehtm.html

Lepszym rozwiązaniem może być stworzenie kilka przycisków na formularzu (tyle ile trzeba myśleć) wyprzedzeniem. Utwórz także kod obsługi zdarzenia. Najpierw je wszystkie ukryj.

Następnie, po otwarciu formularza można dynamicznie zmieniać podpisy przycisków, udostępniać je i przenosić. Utworzony początkowo kod zdarzenia zostanie połączony z aktywowanymi przyciskami zgodnie z oczekiwaniami.

+2

Sprytny pomysł! Wydaje się, że wszystko w VBA wymaga sprytności. – notnot

0

Ja też na to patrzyłem. Wydaje można uruchomić makro za pomocą właściwości onClick:

Command1.OnClick = "Macro1" 

Następnie utworzyć makro o tej nazwie, która biegnie żądaną funkcję. To jest mój hack dookoła tego, dopóki nie znajdę czegoś lepszego.

+0

Dla formantu excel formant, assingin "onClick" spowodował ... "Obiekt nie obsługuje tej właściwości lub metody" – PravyNandas

2

Poniższy kod powinien pracować

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

Mam na myśli dla przycisków dodanych do userforms, a nie do arkusza roboczego – notnot

13

Aby dodać zdarzenie sterowania dynamicznie w formie Excel; musisz najpierw dodać wydarzenie (y) do modułu klasy. Na moim przykładzie mam zamiar dodać moduł klasy o nazwie clsTEST z jednego zdarzenia, 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 

Jak widać, jedyną rzeczą, to będzie zrobić, to ustawić napis na przycisku, aby następnie liczba razy, gdy go kliknąłeś. Następnie w kodzie formularza wprowadź następujące informacje:

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 

Po uaktywnieniu formę, będzie utworzyć przycisk. za każdym razem, gdy klikniesz przycisk, napis zmieni się.

+0

To działało bardzo dobrze dla mnie. Zastanawiam się, czy istnieje sposób, w jaki mogę wysłać zmienną do klasy. Na przykład, jeśli mam zmienić .caption na cokolwiek wysyłam. Private Sub btn_Click (var1 As String) Próbowałem tego, ale spowodowało "Obiekt nie obsługuje tej właściwości lub metody" – JahKnows

+0

Zgadza się. Zdarzenia _Click() nie akceptują żadnych parametrów. Alternatywnie możesz spróbować ustawić inną prywatną zmienną wewnątrz klasy i najpierw przypisać Ci podpis, a następnie skonfigurować wydarzenie do obsługi. – PravyNandas

Powiązane problemy