存档在 ‘窗体控件’ 分类中.

在工作表中动态添加窗体控件

下面的内容及程序代码模仿自《Excel 2007 VBA Programmer’s Reference》,可能在某些情形下极其有用,因此特辑录于此,供参考。
如下图所示,双击工作表Sheet1的列A中的任一单元格,将出现一组合框,允许用户选择其中的项目。当用户选取某项目后,将自动输入到该单元格,并在该单元格右侧的单元格中输入相应的价格数字,组合框同时消失。
addcomboxdynamic1
下面是程序代码。在工作表Sheet1的代码模块中输入BeforeDoubleClick事件代码:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
     If Not Intersect(Target, Columns(”A”)) Is Nothing Then
         Call AddDropDown(Target)
         Cancel = True
    End If
End Sub

在任一模块中,输入下面的代码:
Sub AddDropDown(Target As Range)
    Dim ddBox As DropDown
    Dim vProducts As Variant
    Dim i As Integer
    ‘创建产品数组
    vProducts = Array(”香蕉”, “苹果”, “菠萝”, “葡萄”)
    ‘在目标单元格中添加下拉控件
    With Target
        Set ddBox = Sheet1.DropDowns.Add(.Left, .Top, .Width, .Height)
    End With
    ‘定义执行的宏并填充列表
    With ddBox
        .OnAction = “EnterProdInfo”
        For i = LBound(vProducts) To UBound(vProducts)
            .AddItem vProducts(i)
        Next i
    End With
End Sub

Private Sub EnterProdInfo()
    Dim vPrices As Variant
    ‘创建价格数组
    vPrices = Array(6, 8, 5, 4)
    ‘输入所选项到相应的单元格
    With Sheet1.DropDowns(Application.Caller)
        .TopLeftCell.Value = .List(.ListIndex)
        .TopLeftCell.Offset(0, 1).Value = vPrices(.ListIndex + LBound(vPrices) - 1)
        ‘删除
        .Delete
    End With
End Sub

如下图所示:
addcomboxdynamic2

窗体组合框和选项按钮的使用

本例使用了组合框和选项按钮来跟踪和调整物品的状态,如下图所示。当在组合框中选择相应的物品后,下面的方框上方的文字会相应改变为该组合框物品名称,方框中的选项按钮根据该物品是否充足进行相应的选择。同时,在组合框中选择物品后,如果更改方框中选项按钮的状态,则下方库存状态列表中的文字也相应更改。单元格区域B11:C18为物品及相应的库存状态列表。

例如,在组合框中选择物品“潜水泵”,单元格B5会显示“潜水泵 充足还是不充足?”,因为在B11:C18中的潜水泵库存状态为充足,所以方框中名为“充足”的选项按钮被选中。此时,若将选项按钮更改为名为“不足”的选项按钮,那么B11:C18中潜水泵所对应的库存状态也会更改为“不足”。

comboboxandoptionbutton1

下面来看看这个示例是如何实现的。

第一步:在工作表中放置一个组合框、两个选项按钮,并调整格式如上图。在B11:C18区域录入数据,当然可以将数据录入到工作表的其他区域或其他工作表中,并且可以为区域命名,以方便调用和扩展。在本例中,为了演示方便,将数据区域与窗体控件放置在一起。

第二步:设置组合框,如下图所示。

comboboxandoptionbutton2 

第三步:设置选项按钮,将选项按钮的单元格链接为C8。

第四步:设置单元格B5,使之显示相关的提示信息。在单元格B5中输入公式:

=INDEX(B12:B18,D3) & ” 充足还是不充足?”

第五步:编写组合框和选项按钮相关联的代码。在VBE的标准模块中输入下面的代码:

   1: Sub GetStates()
   2:     Dim ws As Worksheet
   3:     Dim iWPNumber As Integer
   4:     Dim sStates As String
   5:     On Error Resume Next
   6:     Set ws = ThisWorkbook.Worksheets(“组合框示例”)
   7:     iWPNumber = ws.Range(“D3″)
   8:     ‘获取组合框中当前所选物品的状态
   9:     sStates = ws.Range(“B11″).Offset(iWPNumber, 1)
  10:     If sStates = “充足” Then
  11:         ‘激活名为”充足”的选项按钮
  12:         ws.Range(“C8″).Value = 1
  13:     Else
  14:         ‘激活名为”不足”的选项按钮
  15:         ws.Range(“C8″).Value = 2
  16:     End If
  17:     Set ws = Nothing
  18: End Sub
  19:  
  20: Sub SetStates()
  21:     Dim ws As Worksheet
  22:     Dim iWPNumber As Integer
  23:     On Error Resume Next
  24:     Set ws = ThisWorkbook.Worksheets(“组合框示例”)
  25:     iWPNumber = ws.Range(“D3″)
  26:     If ws.Range(“C8″).Value = 1 Then
  27:         ‘更新物品的状态为充足
  28:         ws.Range(“B11″).Offset(iWPNumber, 1).Value = “充足”
  29:     Else
  30:         ‘更新物品的状态为不足
  31:         ws.Range(“B11″).Offset(iWPNumber, 1).Value = “不足”
  32:     End If
  33:     Set ws = Nothing
  34: End Sub

其中,GetStates过程为组合框对应的宏代码,当组合框选项发生变化时更改对应的选项按钮。SetStates过程为选项按钮对应的宏代码,当组合框选项选定后,更改选项按钮设置时,相应更改库存列表中物品的库存状态。

第六步:为组合框指定宏为GetStates,为两个选项按钮指定宏为SetStates。

标签: 没有标签

用窗体复选框控制工作表是否可见

窗体控件在Excel 5中引入,使用窗体控件也能够创建出丰富的用户体验。这篇文章和下篇文章将分别列举一个例子。

控制工作簿中工作表的显示和隐藏是复选框控件的一种典型应用。如下图所示,首先在工作表中放置一个分组框,然后在该分组框中放置三个复选框,将这四个控件的标题分别改为如图所示的文字。

controlvisiblestate1

接下来,设置这三个复选框分别链接至其背后的单元格B4、B5、B6,并设置它们的“颜色与线条”为“自动”,使其覆盖背后的单元格,这样该单元格中的文字就会被遮住。

注意,要想复选框后面的单元格文字不可见,以避免与复选框文本相冲突,须设置该复选框的“颜色与线条”格式为“自动”。

设置控件格式的方法为,在某控件中单击右键,选择“设置控件格式”。在“设置控件格式”对话框(如下图所示)中,选择相应的选项卡,对该控件的格式进行设置。

controlvisiblestate2

在VBE中编写的代码如下:

   1: Sub SetWorksheetVisibility()
   2:     Dim ws As Worksheet
   3:     On Error Resume Next
   4:     Set ws = ThisWorkbook.Worksheets(“控制工作表可视状态”)
   5:     Application.ScreenUpdating = False
   6:     ThisWorkbook.Worksheets(“Sheet1″).Visible = ws.Range(“B4″).Value
   7:     ThisWorkbook.Worksheets(“Sheet2″).Visible = ws.Range(“B5″).Value
   8:     ThisWorkbook.Worksheets(“Sheet3″).Visible = ws.Range(“B6″).Value
   9:     Application.ScreenUpdating = True
  10: End Sub

最后,分别在这三个复选框中单击右键,选择“指定宏”,在“指定宏”对话框分别将宏均指定为SetWorksheetVisibility。

这样,当在工作表中选中某复选框时,该复选框标题所对应的工作表可见,当取消复选框选择时,相应的工作表将隐藏。

标签: 没有标签