3月6日发表的同题的文章,现在想想其实只能算是小儿科,因为那个程序一方面太繁琐,另一方面还有着更致命的问题:如果遇到查不到的项目,那么很容易就会引起错误,从而得到错误的结果.
现在可以借助字典功能来实现更科学的查询,更严谨的结果.
分析如下:
表一为"一中二中信息总表.xls"示意图:
此表存储着所有学生的班级/姓名/学籍号.此为需要查询的目的表.
表二是需要填入班级号(行政班)的"第6学段模块学习成绩表.xls"的样表:
此表为需要填入班级号,假设其中已填写的班级号为教学班班级号,现在需要按注册学籍号从表一中提取对应原班级号,并填入表二中相应位置.
以前都是利用查找功能,但明显的速度太慢.现在可以利用字典功能来实现(忍不住有点小得意啊.
基本的思路是:
①先根据表一建立一个数组(动态),读取表一中的班级/姓名/学籍号,即建立一个三维数组:三列N行,第1列为班级/第2列为姓名/第3列为学籍号.注意一点:该动态数组的起始上标是从1开始的,不是从0开始的.
②建立一个字典对象,并通过一个循环结构,将该字典对象的关键字定义为①中所建数组中的第3列(学籍号),对应值为①中所建数组的第1列/班级,但要注意上标要从2开始,因为1对应着字段名(即纯粹的班级/姓名/学籍号),为节省空间,此时完全可以把①中所建数组清空了,因为它所起的作用已经结束.为第③步做准备.
③由于要在表二中填入班级号,这里最好把班级列与学籍号列相邻,这样可以便于操作.此时就可把清空后的数组用来存储表二中的班级号(此时为空)/学籍号,即建立一个二维数组:二列N'行,第1列为班级/第2列为学籍号.同样的要注意此动态数组的上标是从1开始的,不是从0开始的.
④建立好数组后,就可以在字典中逐一查找数组中的每一个数值,并把与之相对应的班级号,放到数组中的第一维,即班级号中.
⑤第④相当于把原来的为空的数组的中的班级列进行了填空.这样就存储下了表二中所有在表一可以查到的学籍号所对应的班级号了.为下一步的直接赋值做好了准备.
⑥最后一步就是定位到表二中的相应位置,然后直接赋值就可以了.注意行数的定位.
最终源程序如下:
Sub 验证字典功能()
Dim i As Integer, arr()
Dim dic As Object, wb As Object
Set wb = GetObject(ThisWorkbook.Path & "\20110124最终确认学生名单.xls")
With wb.Sheets("毕业证学生信息")
i = .Range("A65536").End(xlUp).Row
arr = .Range("A1").Resize(i, 2).Value
End With
wb.Close False
Set dic = CreateObject("scripting.dictionary")
For i = 2 To UBound(arr)
dic(arr(i, 1)) = arr(i, 2)
Next i
Erase arr
With ThisWorkbook.Sheets("sheet1")
i = .Range("A65536").End(xlUp).Row
arr = Range("A1").Resize(i, 2).Value
For i = 2 To UBound(arr)
arr(i, 2) = dic(arr(i, 1))
Next i
i = .Range("A65536").End(xlUp).Row
.Range("A1").Resize(.Range("A65536").End(3).Row, 2).NumberFormatLocal = "@"
.Range("A1").Resize(i, 2).Value = arr
End With
End Sub
最终的效果即如表二所示.
反思:实际上字典的功能肯定远远不止这些,但光这些,就已经让我心服口服了.Excel真的是无止境啊.微软说今后10-15年不会取消VBA看来是有道理的,就现在这些功能也不是大部分人都掌握啊.更没必要开发更新的功能了.