ET疑难千寻千解丛书之EXCEL2010编程与实践 罗刚君 章兰新 黄朝阳 编著
疑难34
如何在具有合并单元格的区域中多条件逐步查找 如图所示的A、B列都有合并单元格,如何在这类表格中查询评分? è解决方案 创建一个用户窗体,并使用三个组合框分别引用部门、项目组和姓名。利用组合框的Change事件实现修改“部门”、“项目组”和“姓名”三者之一时自动从工作表中查找得分。 í操作方法 步骤1
确定活动工作表为“程序员评分”,按【Alt+F11】组合键打开VBE窗口。 步骤2
选择菜单“插入”→“用户窗体”,并在工具箱中将标签控件、组合框控件和文本框控件拖到窗体中,按图所示方式排列及命名;并且将三个组合框和Label5的“名称属性”分别修改为“部门”、“项目组”、“姓名”和“得分”。
步骤3
双击窗体任意位置进入代码窗口,删除自动产生的代码并输入以下新的代码:
- Dim rng As Range '声明一个公共变量
- Private Sub UserForm_Activate() '窗体激活时执行
- For Each rng In [A2].Resize(ActiveSheet.UsedRange.Rows.Count - 1, 1)
- If Len(rng) > 0 Then 部门.AddItem rng.Text
- '将A列除A1之外的所有非空单元格添加到“部门”组合框
- Next
- 部门 = 部门.List(0) '默认显示列表中第一个值
- End Sub
- Private Sub 部门_Change()
- 项目组.Clear '当“部门”组合框修改时清除“项目组”的列表
- Dim i As Integer
- '在A列查找“部门”组合框的值,并记录其行号
- i = [a:a].Find(What:=部门.Text, After:=[a1], LookIn:=xlValues, LookAt:=xlPart).Row
- '在A列查找到的单元格所在的合并区域对应的B列单元格中循环,如A2:A5对应B2:B5
- For Each rng In Cells(i, 2).Resize(Cells(i, 1).MergeArea.Rows.Count, 1)
- If Len(rng) > 0 Then Me.项目组.AddItem rng.Text '如果非空则追加到组合框
- Next rng
- 项目组=项目组.List(0) '默认显示列表中第一个值
- End Sub
- Private Sub 项目组_Change()
- If Len(项目组) = 0 Then Exit Sub '如果组合框“项目组”为空时则退出程序
- 姓名.Clear '清空“姓名”组合框
- Dim i As Integer
- '在B列查找“项目组”组合框的值,并记录其行号
- i = [B:B].Find(What:=项目组.Text, After:=[B1], LookIn:=xlValues, LookAt:=xlPart).Row
- For Each rng In Cells(i, 3).Resize(Cells(i, 2).MergeArea.Rows.Count, 1)
- If Len(rng) > 0 Then 姓名.AddItem rng.Text '如果非空则追加到组合框
- Next rng
- 姓名 = 姓名.List(0) '默认显示列表中第一个值
- End Sub
- Private Sub 姓名_Change()
- If Len(姓名) = 0 Then Exit Sub '如果“姓名”组合框为空时则退出程序
- Dim i As Integer
- '在C列查找“姓名”组合框的值,并记录其行号
- i = [C:c].Find(What:=姓名.Text, After:=[C1], LookIn:=xlValues, LookAt:=xlPart).Row
- 得分 = Cells(i, 4) '将D列i行的值赋予“得分”控件,即最后需要查询的目标值
- End Sub
复制代码步骤4
选择菜单“插入”→“模块”,并在模块中输入以下代码:
- Sub 评分查询()
- UserForm1.Show 0
- End Sub
复制代码步骤5
执行过程“评分查询”,将显示图所示的窗体,默认显示第一个部门第一个项目第一个人的评分。 修改部门、项目或者姓名时,得分会相应变化,如图所示。
============================= 以上摘自《EXCEL2010编程与实践》
|