106 多個(gè)文本框數(shù)據(jù)相加 在▲102 中,,我們?cè)?/span>TextBox1、TextBox2中輸入完數(shù)據(jù)后,,利用文本框的Change事件使TextBox3顯示其兩者相乘的金額,,但是如果窗體中有多個(gè)文本框,需要在每一個(gè)文本框的Change事件中寫(xiě)上相同的重復(fù)代碼,,因此使用類模塊可以簡(jiǎn)化代碼,。 在附件的窗體有七個(gè)文本框,其中六個(gè)用來(lái)輸入數(shù)據(jù),,一個(gè)用來(lái)顯示其他六個(gè)文本框相加后的合計(jì)數(shù),,首先打開(kāi)VBE,插入一個(gè)類模塊建立一個(gè)類,,類模塊的名字就是類的名字修改為“cmds”,,在類模塊中輸入下面的代碼: Public WithEvents cmdAs MSForms.TextBox 代碼解析: 使用Public語(yǔ)句聲明變量cmd是用來(lái)響應(yīng)由TextBox對(duì)象觸發(fā)的事件的對(duì)象變量。 在窗體的Initialize事件中寫(xiě)入下面的代碼: Dim col As New Collection Private Sub UserForm_Initialize() Dimi As Integer Dimmyc As cmds Fori = 1 To 6 Set myc = New cmds Set myc.cmd = Me.Controls('TextBox'& i) col.Add myc Next Setmyc = Nothing End Sub 代碼解析: 第1行代碼在模塊頂部聲明變量col的類型為集合,。 第5行到第9行代碼,,將窗體中的六個(gè)文本框賦給col集合。 在類模塊中寫(xiě)入下面的代碼: Private Sub cmd_Change() Dimi As Integer DimDval As Double Fori = 1 To 6 Dval = Dval + Val(UserForm1.Controls('TextBox'& i)) UserForm1.TextBox7.Value = Dval Next End Sub 代碼解析: 窗體中的六個(gè)文本框統(tǒng)一的Change事件,,當(dāng)任何一個(gè)文本框中的數(shù)據(jù)發(fā)生變化時(shí),,所有文本框相加的合計(jì)數(shù)顯示在最后一個(gè)文本框中。 運(yùn)行窗體在文本框中輸入數(shù)據(jù)結(jié)果,。
▲107 控件跟隨活動(dòng)單元格 在工作表中使用控件時(shí)一般都把控件放在工作表的上部,,如果工作表中數(shù)據(jù)較多,當(dāng)頁(yè)面滾動(dòng)到工作表下面的區(qū)域時(shí),,控件會(huì)離開(kāi)當(dāng)前可視區(qū)域,,這時(shí)操作起來(lái)很不方便。解決方法除了凍結(jié)工作表的第一行放置控件的外,,還可以使控件出現(xiàn)在選定的單元格位置,,如下面的代碼所示,。 Private Sub Worksheet_SelectionChange(ByVal TargetAs Range) WithMe.CommandButton1 .Top = Target.Top .Left = Target.Left + Target.Width EndWith End Sub 代碼解析: 工作表的SelectionChange事件,使工作表中的按鈕控件出現(xiàn)在選定單元格的右邊,。 第3行代碼,,設(shè)置按鈕的Top屬性等于選定單元格的Top屬性。Top屬性設(shè)置對(duì)象頂端到第一行頂端的距離,。 第4行代碼,,設(shè)置按鈕的Left屬性等于選定單元格的Left屬性加上選定單元格的寬度,即按鈕出現(xiàn)在選定單元格的右邊,。Left屬性設(shè)置對(duì)象左邊界至 A 列左邊界的距離,。 當(dāng)單擊工作表區(qū)域的任一單元格,按鈕出現(xiàn)在單元格的右邊,。
▲108 高亮顯示按鈕 為了達(dá)到當(dāng)鼠標(biāo)掠過(guò)按鈕時(shí)以高亮和凸起顯示按鈕的效果,,可以在窗體和按鈕的MouseMove事件中進(jìn)行模擬,如下面的代碼所示,。 Private Sub CommandButton1_MouseMove(ByVal ButtonAs Integer,,ByVal Shift As Integer,ByVal X As Single,,ByVal Y As Single) WithMe.CommandButton1 .BackColor = &HFFFF00 .Width = 62 .Height = 62 .Top = 69 .Left = 31 EndWith End Sub Private Sub UserForm_MouseMove(ByVal Button AsInteger,ByVal Shift As Integer,,ByVal X As Single,,ByVal Y As Single) WithMe.CommandButton1 .BackColor = Me.BackColor .Width = 60 .Height = 60 .Top = 70 .Left = 32 EndWith End Sub 代碼解析: 窗體和按鈕的MouseMove事件過(guò)程,以高亮和凸起顯示按鈕,。 當(dāng)用戶在窗體中移動(dòng)鼠標(biāo)時(shí),,分別在窗體和按鈕的MouseMove事件設(shè)置按鈕的BackColor屬性值,指定按鈕的背景色,,當(dāng)鼠標(biāo)移動(dòng)到按鈕時(shí)以高亮顯示,,當(dāng)鼠標(biāo)移動(dòng)到窗體時(shí)恢復(fù)原來(lái)的設(shè)置。接下來(lái)分別設(shè)置按鈕不同的Width屬性,、Height屬性,、Top屬性和Left屬性值,以模擬按鈕凸起的效果,。
▲109 組合框和列表框添加列表項(xiàng)的方法 組合框和列表框是Excel中最常用的控件,,可以用來(lái)顯示工作表中的數(shù)據(jù)。為組合框和列表框添加列表項(xiàng)的方法有多種,,下面以列表框?yàn)槔菔咎砑恿斜眄?xiàng)的方法,。 109-1 使用RowSource屬性添加列表項(xiàng) 使用RowSource屬性將列表框直接與工作表上的一個(gè)單元格區(qū)域相鏈接,如下面的代碼所示,。 Private Sub UserForm_Initialize() DimiRow As Integer iRow= Sheet1.Range('A65536').End(xlUp).Row Me.ListBox1.RowSource= 'sheet1!a1:a' & iRow End Sub 代碼解析: 在窗體初始化時(shí)使用RowSource屬性為列表框添加列表項(xiàng),。 RowSource屬性的語(yǔ)法如下: object.RowSource [=String] 參數(shù)object是必需的,,一個(gè)有效的對(duì)象。 參數(shù)String是可選的,,組合框或列表框列表的來(lái)源,。 RowSource屬性也可以使用單元格地址,第4行代碼可以改成下面的代碼: Me.ListBox1.RowSource= Sheet1.Range('A1:A' & iRow).Address(External:=True) 需要注意的是,,如果RowSource屬性指定的工作表區(qū)域不是活動(dòng)工作表的話,,Address屬性的External參數(shù)是不可缺的,設(shè)置為True表示是外部引用,,如果缺省此參數(shù)或?yàn)?/span>False,,將不能為列表框添加列表項(xiàng)。 RowSource屬性還可以使用命名的單元格區(qū)域,,如果已把工作表區(qū)域命名為“城市”,,第4行代碼可以改成下面的代碼: Me.ListBox1.RowSource= '城市' 對(duì)于工作表中的列表框控件或使用窗體添加的列表框控件不能使用RowSource屬性,需要使用ListFillRange屬性指定填充列表框的工作表區(qū)域,,如下面的代碼所示,。 Sub ListFillRange() DimiRow As Integer iRow= Sheet1.Range('A65536').End(xlUp).Row Sheet2.ListBox1.ListFillRange= 'Sheet1!a1:a' & iRow Sheet2.Shapes('列表框').ControlFormat.ListFillRange = 'Sheet1!a1:a'& iRow End Sub 代碼解析: ListFillRange過(guò)程為工作表中的列表框的填充區(qū)域,ListFillRange屬性用于指定填充列表框的工作表區(qū)域,。 對(duì)于使用窗體添加的列表框控件需要使用ControlFormat屬性來(lái)返回窗體控件以后才能設(shè)置其ListFillRange屬性,。 109-2 使用List屬性添加列表項(xiàng) 使用List屬性為列表框添加列表項(xiàng),如下面的代碼所示,。 Private Sub UserForm_Initialize() DimArr As Variant DimiRow As Integer iRow= Sheet1.Range('A65536').End(xlUp).Row Arr= Sheet1.Range('A1:A' & iRow) Me.ListBox1.List= Arr End Sub 代碼解析: 在窗體初始化時(shí)使用List屬性為列表框添加列表項(xiàng),。 List屬性的語(yǔ)法如下: object.List( row,column ) [= Variant] 參數(shù)object是必需的,,一個(gè)有效對(duì)象,。 參數(shù)row是必需的,取值范圍為 0 到列表?xiàng)l目數(shù)減 1 之間的數(shù)值,。 參數(shù)column是必需的,,取值范圍為 0 到總列數(shù)減 1 之間的數(shù)值。 參數(shù)Variant是可選的,,列表框中指定條目的內(nèi)容,。 第6行代碼,使用List屬性把數(shù)組復(fù)制到列表框控件上,。 除了使用數(shù)組外,,List屬性還可以使用命名的單元格區(qū)域,如果已把工作表區(qū)域命名為“城市”,,可以改成下面的代碼: Private Sub UserForm_Initialize() Me.ComboBox1.List= Range('城市').Value End Sub對(duì)于工作表中使用窗體添加的列表框控件使用List屬性添加列表項(xiàng),,如下面的代碼所示。 Sub List() DimArr As Variant DimiRow As Integer DimmyObj As Object iRow= Sheet1.Range('A65536').End(xlUp).Row Arr= Sheet1.Range('A1:A' & iRow) SetmyObj = Sheet2.Shapes('列表框 10').ControlFormat myObj.List= Arr End Sub 代碼解析: List過(guò)程設(shè)置列表框的List性,,用于指定填充列表框的工作表區(qū)域,。 |
|