关于如何实现表间查询并提取班号的再研究(字典功能)
2010-03-06 14:57
281 查看
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看来是有道理的,就现在这些功能也不是大部分人都掌握啊.更没必要开发更新的功能了.
这就是菊子曰啦!
现在可以借助字典功能来实现更科学的查询,更严谨的结果.
分析如下:
表一为"一中二中信息总表.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看来是有道理的,就现在这些功能也不是大部分人都掌握啊.更没必要开发更新的功能了.
这就是菊子曰啦!
相关文章推荐
- 关于如何实现表间查询并提取班号的再研究(字典功能)
- 关于Excel操作编写的一个软件设计构思案例[连载] --如何实现从字符串中提取需要的字符并赋值给指定单元格内
- 关于JavaWeb如何实现用户注册 后台即时提醒(类似站内信功能)
- Informix 中如何实现 Oracle rownum 功能的研究
- 关于linux系统如何实现fork的研究(二)
- 关于hibernate中如何实现limit查询,就要考测试了,我还在调代码
- 关于如何利用Keil C实现51单片机中断功能(interrupt、using关键字的用法)
- 关于同步(字典)功能实现的相关积累
- 浅析C#如何连接数据库实现查询功能
- 关于android程序自动更新功能的实现,如何去除安装提示
- 求助:关于一个查询的SQL语句,请高人指点如何实现,谢谢!
- 关于如何实现javascript for supermap调用arcgis切片的关键技术研究
- 关于如何实现美团网的导航功能并且能重用ListView的Item(下载免费了)
- 关于安卓如何实现计时器chronometer的暂停和继续计时功能
- 关于JavaWeb如何实现用户类似站内信功能
- 关于Android 如何实现mobile data on/off功能
- 关于ipad wifi版 如何实现高精度定位功能探究
- 关于linux系统如何实现fork的研究(一)
- 如何定制一款12306抢票浏览器——实现自动查询和预订功能
- AutoCompleteBox如何实现鼠标点击后实现查询功能