2009-02-19 70 views
8

tôi là tạo ra nút tự động trên một userform với đoạn mã sau Excel:Gán trên chuột hàm VBA để một nút tự động tạo ra trên Excel UserForm

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

tôi muốn chỉ định một chức năng để chạy khi các nút này được nhấp, nhưng tôi không thể tìm thấy cách đơn giản để thực hiện việc này vì không có thuộc tính nào như một phần của nút.

Có cách nào để thực hiện việc này bằng cách sử dụng thành ngữ ở trên không? Tôi có nên đi về toàn bộ điều này theo một cách khác?

Trả lời

8

Bạn cần tự động tạo trình xử lý mã/sự kiện cho mỗi nút.

Nó mất một chút hoạt động - xem ở đây: http://navpadexcel.blogspot.com/2006/11/httpwwwcpearsoncomexcelvbehtm.html

Cách tốt hơn có thể là để tạo ra một loạt các nút trên hình thức (như nhiều như bạn nghĩ rằng bạn sẽ cần) trước thời hạn. Tạo mã xử lý sự kiện. Làm cho tất cả chúng bị ẩn ban đầu.

Sau đó, khi biểu mẫu của bạn mở, bạn có thể tự động thay đổi chú thích của nút, hiển thị chúng và di chuyển chúng xung quanh. Mã sự kiện bạn đã tạo ban đầu sẽ được liên kết với các nút được kích hoạt như mong đợi.

+2

Ý tưởng thông minh! Dường như mọi thứ trong VBA đòi hỏi phải thông minh. – notnot

0

Tôi cũng đã xem xét điều này. Dường như bạn có thể chạy macro bằng cách sử dụng thuộc tính onClick:

Command1.OnClick = "Macro1" 

Sau đó tạo macro bằng tên đó chạy chức năng mong muốn. Đây là hack của tôi xung quanh này cho đến khi tôi tìm thấy một cái gì đó tốt hơn.

+0

Đối với một điều khiển dạng người dùng excel, assingin "onClick" dẫn đến ... "Object không hỗ trợ thuộc tính hoặc phương thức" – PravyNandas

2

Mã dưới đây sẽ được làm việc

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

Ý tôi là đối với các nút được thêm vào userforms, không phải cho trang tính – notnot

13

Để thêm một sự kiện điều khiển tự động trong một hình thức Excel; trước tiên bạn cần thêm (các) sự kiện vào một mô-đun lớp học. Ví dụ của tôi, tôi sẽ để thêm một mô-đun lớp tên clsTEST với một sự kiện, 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 

Như bạn thấy, điều duy nhất này sẽ làm là thiết lập các chú thích vào nút để sau đó số lần bạn nhấp vào nó. Tiếp theo, trong mã biểu mẫu, hãy nhập như sau:

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 

Khi bạn kích hoạt biểu mẫu, nó sẽ tạo nút. mỗi khi bạn nhấp vào nút, chú thích sẽ thay đổi.

+0

Điều này làm việc rất tốt cho tôi. Tôi đã tự hỏi là có một cách tôi có thể gửi một biến cho lớp. Ví dụ, nếu tôi đã thay đổi .caption cho bất cứ điều gì tôi gửi. Private Sub btn_Click (var1 As String) Tôi đã thử điều này nhưng kết quả là "Object không hỗ trợ thuộc tính hoặc phương thức" – JahKnows

+0

Đúng vậy. Các sự kiện _Click() không chấp nhận bất kỳ tham số nào. Cách khác bạn có thể thử là đặt một biến riêng khác bên trong lớp và gán chú thích cho bạn trước, sau đó thiết lập sự kiện của bạn cho trình xử lý. – PravyNandas

Các vấn đề liên quan