TOP

VBA-第 12.3 课。控件 (Controls)

控件 (Controls) 也可以在表单之外使用。在下面的示例中,我们将直接在工作表上使用控件。

请注意,必须激活“设计器模式”(“Design mode”)才能修改工作表上的特定控件(并且还必须停用才能使用此控件)。


滚动条(ScrollBar)

在看下一个示例之前,让我们先看一下:

现在,我们要为单元格添加背景颜色,并根据滑块在 30 行 x 10 列的定义区域中的位置来选择它们。

滚动屏幕的垂直滑块的属性如下:

  • Min:1
  • Max:30(30 行)
  • Value :滑块位置(在本例中为 1 到 30 之间)
  • 水平滑块是相同的,除了 Max : 10。

    以下是每当垂直滑块 (Value) 的值发生变化时就会运行的代码:

     '细胞中的灰色背景
     Cells.Interior.Color = RGB(240, 240, 240)
    
     '我们应用颜色并选择一个单元格
     With Cells(ScrollBar_vertical.Value, ActiveCell.Column) '使用 Value (Value) 定义单元格
         .Interior.Color = RGB(255, 220, 100) '我们使用橙色
         .Select '我们选择一个单元格
     End With
    

    此代码在 Change 和 Scroll 事件发生时被触发,并执行指令,无论我们单击滑块的哪一部分。

    以下是垂直滑块的代码:

    Private Sub vertical_bar()
         '为单元格应用灰色背景
         Cells.Interior.Color = RGB(240, 240, 240)
         
         '应用背景并选择单元格
         With Cells(ScrollBar_vertical.Value, ActiveCell.Column)
             .Interior.Color = RGB(255, 220, 100) '橙子
             .Select '我们选择一个单元格
         End With
    End Sub
    
    Private Sub ScrollBar_vertical_Change()
         vertical_bar
    End Sub
    
    Private Sub ScrollBar_vertical_Scroll()
         vertical_bar
    End Sub
    

    接下来是水平滑块的代码:

    Private Sub horizontal_bar()
         '为单元格应用灰色背景
         Cells.Interior.Color = RGB(240, 240, 240)
    
         '应用背景并选择单元格
         With Cells(ActiveCell.Row, ScrollBar_horizontal.Value)
             .Interior.Color = RGB(255, 220, 100) '橙子
             .Select '我们选择一个单元格
         End With
    End Sub
    
    Private Sub ScrollBar_horizontal_Change()
         horizontal_bar
    End Sub
    
    Private Sub ScrollBar_horizontal_Scroll()
         horizontal_bar
    End Sub
    

    下拉菜单和列表框(ComboBox 和 ListBox)

    这是我们下一个示例的起点:

    您可以下载Excel示例文件:userform4.xls

    运行表单时,我们希望将 4 个国家/地区加载到下拉列表中(使用 AddItem 方法):

    Private Sub UserForm_Initialize()
         For i = 1 To 4 '=> 填写4个国家
            ComboBox_Country.AddItem Cells(1, i) '我们使用循环将 A1 到 A4 单元格的值相加
        Next
    End Sub
    

    当下拉列表的值发生变化时,我们希望使用与前一个类似的循环来添加所选国家/地区的城市。

    为此,我们需要知道列的数量,以及该列中城市(行)的数量。

    ListIndex 属性包含下拉列表中所选项目的序列号(与 Value 不同,后者包含列表项目的值)。请注意,ListIndex 以数字 0 开头。

    列号通过以下方式获得:

    column_number = ComboBox_Country.ListIndex + 1
    

    要获取特定国家/地区所选列中的行数,我们可以找到最后一个非空单元格的编号:

    rows_number = Cells(1, column_number).End(xlDown).Row
    

    使用此信息,现在可以创建一个循环将城市添加到列表中:

    Private Sub ComboBox_Country_Change()
         '清除列表(否则,将立即添加城市)
         ListBox_Cities.Clear
         
         Dim column_number As Integer, rows_number As Integer
         
         '所选元素的序列号(ListIndex以0开头):
         column_number = ComboBox_Country.ListIndex + 1
         '所选列中包含国家/地区的行数:
         rows_number = Cells(1, column_number).End(xlDown).Row
    
         For i = 2 To rows_number '=> 用城市填充列表
            ListBox_Cities.AddItem Cells(i, column_number)
         Next
    End Sub
    

    注意:我们可以缩短代码,但这会降低其可读性:

    Private Sub ComboBox_Country_Change()
         ListBox_Cities.Clear
         For i = 2 To Cells(1, ComboBox_Country.ListIndex + 1).End(xlDown).Row
             ListBox_Cities.AddItem Cells(i, ComboBox_Country.ListIndex + 1)
         Next
    End Sub
    

    我们选择的城市将被输入到“选择”文本字段中(“Choice”):

    Private Sub ListBox_Cities_Click()
         TextBox_Choice.Value = ListBox_Cities.Value
    End Sub
    

    您可以在此 Excel 文件中看到完成的示例: userform4b.xls