Excel中有兩種不同的控件,。一種是窗體工具條控件(Forms toolbar controls),通過點擊菜單“視圖”->“工具欄”,,在彈出菜單上選擇“窗體”,,將出現(xiàn)“窗體”工具條控件窗口。另外一種是ActiveX控件,,通過點擊菜單“視圖”->“工具欄”,,在彈出菜單上選擇“控件工具箱”(也可以選擇“Visual Basic”,然后再在工具欄上選擇“控件工具箱”),,將出現(xiàn)“控件工具箱”窗口,。
窗口工具條控件是Excel5和Excel95留下來的東西(在Excel 97后的版本中,,添加一個Dialog Sheet后,將可以看到這個窗體工具條窗口),,從Excel 97開始,,Dialog Sheet被UserForm代替,并且開始使用ActiveX控件,。
從某些角度來講,,窗體控件甚至比ActiveX控件更有優(yōu)勢。
- 如果你需要在Chart工作表中添加控件,,只能使用窗體工具條控件,。
- 更加方便使用VBA代碼創(chuàng)建窗體控件以及定義事件過程。
- 窗體控件的事件過程可以放在標準模塊,,可以使用任何有效的VBA過程名稱,,可以在控件創(chuàng)建之前就創(chuàng)建事件過程。
- 可以給多個控件賦于一個相同的過程,。
- 可以使用Application.Caller來獲取窗體控件的名稱,。
窗體控件比ActiveX控件簡單,基本上只有一個Click事件,。而ActiveX控件可以響應(yīng)豐富的事件,,ActiveX控件的事件只能放在控件所在的類模塊(工作表模塊)或窗體模塊。過程名稱由控件名和事件名稱組成,。如果你在控件不存在的時候就創(chuàng)建這個控件的事件過程,,然后再在代碼中引用這個控件,將會出現(xiàn)編譯錯誤,,所以必須使用代碼創(chuàng)建事件過程,。
在VBA中控制窗體控件的方法有點不同,可以使用對象名稱,,但這些對象名稱在對象瀏覽器中被隱藏,,這樣輸入代碼時沒有方法和屬性提示(你可以在“對象瀏覽器”的“類”一欄中單擊右鍵,然后選擇“顯示隱含成員”查看這些窗體控件),。另外有一個簡單的方法就是所有的窗體控件都用DrawingObjects來表示,。
下面就是窗體控件的示例代碼,相對應(yīng)的控件從字面上很容易理解,。對于復(fù)選框和選項按鈕,,賦值xlOn給Value屬性表示選擇,賦值xlOff則表示取消選擇,。下拉和列表框的Value屬性則表示選擇的第幾個項目,,從1開始。
Sub ChangeControls() 'Sheet1.Labels("標簽 1").Caption = "我是標簽1" 'Sheet1.Buttons("按鈕 2").Caption = "點擊我吧!" 'Sheet1.CheckBoxes("復(fù)選框 3").Value = xlOn 'Sheet1.OptionButtons("選項按鈕 4").Value = xlOn 'Sheet1.ListBoxes("列表框 5").Value = 2 'Sheet1.DropDowns("下拉框 6").Value = 4 Sheet1.DrawingObjects("標簽 1").Caption = "我是標簽1" Sheet1.DrawingObjects("按鈕 2").Caption = "點擊我吧!" Sheet1.DrawingObjects("復(fù)選框 3").Value = xlOn Sheet1.DrawingObjects("選項按鈕 4").Value = xlOn Sheet1.DrawingObjects("列表框 5").Value = 2 Sheet1.DrawingObjects("下拉框 6").Value = 4 End Sub
這個是使用VBA代碼在工作表中添加窗體控件的例子。
Sub InsertDropDown() Dim ctl As DropDown ' 聲明下列列表變量 Sheet2.Select Cells(3, 3).Select With ActiveCell ' 在活動單元格位置創(chuàng)建下列列表 Set ctl = Sheet2.DropDowns.Add(.Left, .Top, .Width, .Height) ' 給下拉列表指定事件過程 ctl.OnAction = "EnterData" ctl.AddItem "Item 1" ctl.AddItem "Item 2" ctl.AddItem "Item 3" ctl.AddItem "Item 4" ctl.AddItem "Item 5" ctl.ListIndex = 1 ' 第一個項目的ListIndex是0 End With End Sub Sub EnterData() ' 通過Application.Caller來獲得下拉列表對象 With Sheet2.DropDowns(Application.Caller) Cells(1, 1) = .List(.ListIndex) End With End Sub
這是使用VBA代碼添加ActiveX控件的例子,。
Sub InsertComboBox() Dim ole As OLEObject Dim ctl As MSForms.ComboBox Dim iLine As Long Dim objCodeModule As Object Sheet2.Select Cells(3, 5).Select ' 插入復(fù)合框 Set ole = Sheet2.OLEObjects.Add(ClassType:="Forms.ComboBox.1") ' 命名 ole.Name = "Combo" Set ctl = ole.Object ctl.Name = "Combo" ctl.AddItem "Item1" ctl.AddItem "Item2" ctl.AddItem "Item3" ctl.AddItem "Item4" ctl.AddItem "Item5" ctl.ListIndex = 0 ' 第一個項目的ListIndex是0 ' 添加Click事件,需要引用Microsoft Visual Basic for Application Extensibility庫 Set objCodeModule = ThisWorkbook.VBProject.VBComponents("Sheet2").CodeModule iLine = objCodeModule.createeventproc("Click", "Combo") Call objCodeModule.ReplaceLine(iLine + 1, " EnterData1") End Sub Sub EnterData1() ' 要使用OLEObject對象的Object屬性來獲得ComboBox對象 With Sheet2.OLEObjects("Combo") Cells(2, 1) = .Object.Text End With End Sub
過程InsertComboBox將在Sheet2的工作表模塊中自動生成復(fù)合框的Click事件過程,。
Private Sub Combo_Click() EnterData1 End Sub