2012-02-28 56 views
1

我在Excel中遇到了與我的VBA腳本有關的問題。我所做的是基本上創建按鈕,當按下時會在其中一張表中創建一組兩個額外的組合框。可以連續按下此按鈕以添加更多組合框。運行時在Excel上檢測組合框上的事件

這些新創建的組合框將像這樣:

  1. 創建2組合框
  2. Combobox1將在控制片加載一些列表
  3. 只要選擇在Combobox1一個項目,Combobox2將加載產品清單要添加到Combobox2

的代碼,用於將按鈕是這樣

Sub Add_Criteria() 

     Dim controlNum As Integer 
     Dim name1 As String 
     Dim name2 As String 
     Dim oOle1 As OLEObject 
     Dim oOle2 As OLEObject 
     Dim uniqueString As String 

     Dim cb1 As Object 

     controlNum = Sheets("Controls").Range("A16").Value 

     'adding Control 
     Set oOle1 = Sheets("System").OLEObjects _ 
      .Add(ClassType:="Forms.ComboBox.1", Left:=10, _ 
      Top:=75 + (controlNum * 20), Width:=100, Height:=18) 
     Set oOle2 = Sheets("System").OLEObjects _ 
      .Add(ClassType:="Forms.ComboBox.1", Left:=120, _ 
      Top:=75 + (controlNum * 20), Width:=100, Height:=18) 

     'adding properties 
     oOle1.Name = "Criteria" & controlNum * 2 - 1 
     oOle2.Name = "Criteria" & controlNum * 2 

     'adding control var 
     Sheets("Controls").Range("A16").Value = controlNum + 1 

     With oOle1.Object 
      .List = Sheets("Controls").Range("A5:A13").Value 
     End With 

    End Sub 

問題是,我無法檢測到它的事件。我需要更改在combobox1中的值更改時創建的第二個組合框上顯示的值。我試圖使用下面的參考,我仍然不能。任何人都可以指導我如何做到這一點

參考(一直在這個問題天):

http://www.dbforums.com/microsoft-excel/1641165-detecting-click-event-dynamically-created-controls.html(這是爲用戶窗體,我不知道爲什麼我不能複製這片)

回答

0

您可以以編程方式添加事件。以下代碼爲每個組合框添加了一個事件

Pearson Programming The VBA Editor的此參考文件也可能有用。

enter image description here

Sub Add_Criteria() 

    Dim controlNum As Integer 
    Dim name1 As String 
    Dim name2 As String 
    Dim oOle1 As OLEObject 
    Dim oOle2 As OLEObject 
    Dim uniqueString As String 
    Dim cb1 As Object 
    Dim strCode As String 
    Dim vbProj As Object 
    Dim vbCodeMod As Object 

    Set vbProj = ActiveWorkbook.VBProject 
    Set vbCodeMod = vbProj.vbcomponents(ActiveSheet.CodeName).codemodule 

    controlNum = Sheets("Controls").Range("A16").Value 

    'adding Control 
    Set oOle1 = Sheets("System").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=10, Top:=75 + (controlNum * 20), Width:=100, Height:=18) 
    Set oOle2 = Sheets("System").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=120, Top:=75 + (controlNum * 20), Width:=100, Height:=18) 


    vbCodeMod.AddFromString AddEvent(oOle1.Name) 
    vbCodeMod.AddFromString AddEvent(oOle2.Name) 


    'adding properties 
    oOle1.Name = "Criteria" & controlNum * 2 - 1 
    oOle2.Name = "Criteria" & controlNum * 2 

    'adding control var 
    Sheets("Controls").Range("A16").Value = controlNum + 1 

    With oOle1.Object 
     .List = Sheets("Controls").Range("A5:A13").Value 
    End With 

End Sub 

Function AddEvent(strIn As String) As String 
    AddEvent = "Private Sub " & strIn & "_Click()" & Chr(10) & _ 
       "MsgBox ""Event Added""" & Chr(10) & _ 
       "End Sub" 
End Function 
+1

正是我所需要的。當組合框被添加和刪除時,這個答案增加了另一個問題。 每當我添加組合框,它將被命名爲標準1,Criteria2,等等 當我刪除,我會刪除最後2個標準,也就是說,如果我有10個組合框,我會刪除Criteria10和Criteria9 但隨着這樣,添加到工作表的事件不會被刪除,並且會創建一個模糊的子項,因爲存在具有相同名稱的子項。我可以在不減少的情況下添加一個增量命名,但它並不優雅。有沒有辦法將其刪除 PS:我想+1這個答案,但我需要15 rep =。= – 2012-02-28 10:39:07

1

分別打開新的工作簿並重命名工作表1和2「系統」和「控件」。 打開VBA編輯器並將上面的代碼粘貼到一個通用模塊中。 運行你的代碼。 返回Excel。 (Alt + F11) 右鍵單擊系統工作表選項卡並選擇查看代碼。 粘貼在模塊中執行以下操作:

Sub FillCombo() 
    With Sheets("System").Criteria299 'Change the name of the control as needed. 
    .AddItem 1 
    .AddItem 2 
    End With 
End Sub 

Private Sub Criteria299_Change() 
'Example of triggering the Change Event using Select Case 
    With Sheets("System") 
    Select Case .Criteria299.Value 
     Case 1 
      .Criteria300 = "Dog" 'Change the name of the control as needed. 
     Case 2 
      .Criteria300 = "Cat" 
    End Select 
End With 
End Sub 

看項目資源管理器,你會看到代碼是系統工作模塊中,而不是在一個通用模塊。

添加到工作表的控件的任何事件過程都必須存儲在該工作表的模塊中。

只要您參考具有所示控件的工作表名稱,FillCombo子文件就可以放在通用模塊中。

相關問題