您好,这里是“E图表述”为您讲述的Excel各种知识。
【前言】
接续前文实例001的话题,我们今天再来看看源数据2的做法。源数据2的数据类型,也是比较常见的,但是这种类型的数据有一个最大的特点——它是二维表,我们需要考虑的的内容,思路和源数据1就大不一样了。
【数据源】
再看一遍源数据2的格式,每一列的首行是一级下拉菜单的备选值,此列从第2行开始是二级下拉菜单的备选内容,如何下手?我们最主要判断的是:二级菜单的显示是根据一级菜单到底引用了第几列的内容,确定了几个列号,才可以给Combobox.List赋值
那么我们需要怎么做到这种判断呢?方法有很多,本文我们采用“调用工作表函数”的做法,估计比较“合同学们的口味”吧。
【正文】
第二种数据源做法
步骤1:
添加两个Combobox控件到工作表区域,作为两个下拉菜单,具体方法可以参阅:
步骤2:
按Alt+F11打开VBE界面,打开sheet2工作表的代码区,源数据1的下拉菜单我们使用了Combobox的GotFocus和Change事件,今天的问题一样需要这两个事件实现,但是因为数据源的不同,代码也会有不同改变。
在第一篇刊登出后,大家有的提出问题,Private Sub ComboBox1_GotFocus()这个工程名称是手动打上去的吗?不是的,确切的说,它是选择出来的,如下:
我们选择ComboBox1_GotFocus事件,输入下面代码:
Private Sub ComboBox1_GotFocus()
Dim arr, d
With Sheet2
a = .Range("AA1").End(1).Column
arr = .Range(.Cells(1, 1), .Cells(1, a))
Set d = CreateObject("scripting.dictionary")
For i = 1 To UBound(arr, 2)
If d.exists(arr(1, i)) = False Then
k = k + 1
d(arr(1, i)) = k
End If
Next i
st1 = d.keys
.ComboBox1.List = st1
End With
Erase arr
Set d = Nothing
End Sub
此时当我们将光标点选在Combobox1组合框中时,就会激活代码,下拉菜单中就会出现不重复的“书名”,效果和源数据1的一样,但是请注意其单元格区域赋值给数组arr时的表示方式是不同的。
步骤3:
在选择ComboBox1_Change事件,输入下面代码:
Private Sub ComboBox1_Change()
Dim arr, d
On Error Resume Next
With Sheet2
.ComboBox2.Text = ""
a = Application.WorksheetFunction.Match(.ComboBox1.Text, .Range("A1:AA1"), 0)
b = .Cells(1, a).End(4).Row
arr = .Range(.Cells(2, a), .Cells(b, a))
Set d = CreateObject("scripting.dictionary")
For i = 1 To UBound(arr)
d(arr(i, 1)) = ""
Next i
st2 = d.keys
.ComboBox2.List = st2
.ComboBox2.Text = .ComboBox2.List(0)
End With
Erase arr
Set d = Nothing
End Sub
到此我们源数据2格式下的,二级下拉菜单内容就做完了,展示一下效果。
【编后语】
因为在上一篇,有的同学问起,选择一级菜单的书名后,二级菜单框中的内容依然显示之前的内容,如果不改动的话,就会使“书名”和“姓名”对应不上,所以本例中我们做了调整,加了两条代码:
● 当一级菜单的值改变时,二级菜单的值为空
● 二级菜单的值显示List列表中的第一个值(外国人把0作为数组的第一位编号)
这两句写在一段代码中,其实是重复的。只是想给大家多介绍一点功能,所以就都写了出来,根据情况自己选择使用吧。
另外,大家有没有发现代码中有一句Application.WorksheetFunction.Match的用法,这个就是“调用的工作表函数Match”,语法结构和日常使用Match函数一样,只不过,函数的参数一定要用VBA可以识别的方式来写。
好了,先写到这里,作者下次再给大家带来其他关于ActiveX控件的知识!