ActiveX控件 实例002——ComboBox控件的多级联动(下)

您好,这里是“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, dWith Sheet2a = .Range("AA1").End(1).Columnarr = .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 Thenk = k + 1d(arr(1, i)) = kEnd IfNext ist1 = d.keys.ComboBox1.List = st1End WithErase arrSet d = NothingEnd Sub

此时当我们将光标点选在Combobox1组合框中时,就会激活代码,下拉菜单中就会出现不重复的“书名”,效果和源数据1的一样,但是请注意其单元格区域赋值给数组arr时的表示方式是不同的

步骤3:

在选择ComboBox1_Change事件,输入下面代码:

Private Sub ComboBox1_Change()Dim arr, dOn Error Resume NextWith 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 ist2 = d.keys.ComboBox2.List = st2.ComboBox2.Text = .ComboBox2.List(0)End WithErase arrSet d = NothingEnd Sub

到此我们源数据2格式下的,二级下拉菜单内容就做完了,展示一下效果。

【编后语】

因为在上一篇,有的同学问起,选择一级菜单的书名后,二级菜单框中的内容依然显示之前的内容,如果不改动的话,就会使“书名”和“姓名”对应不上,所以本例中我们做了调整,加了两条代码:

● 当一级菜单的值改变时,二级菜单的值为空

● 二级菜单的值显示List列表中的第一个值(外国人把0作为数组的第一位编号)

这两句写在一段代码中,其实是重复的。只是想给大家多介绍一点功能,所以就都写了出来,根据情况自己选择使用吧。

另外,大家有没有发现代码中有一句Application.WorksheetFunction.Match的用法,这个就是“调用的工作表函数Match”,语法结构和日常使用Match函数一样,只不过,函数的参数一定要用VBA可以识别的方式来写。

好了,先写到这里,作者下次再给大家带来其他关于ActiveX控件的知识!

打开APP阅读更多精彩内容