除非注明,文章均为 战战如疯 原创,转载请保留链接: http://www.zhanzhanrufeng.com/cat4/166.html,VBA交流群273624828。
今天利用一个在贴吧看到的例子来讲一下Excel中字典的应用。题目要求是这样的,我有如下面左图格式的一批学生成绩
现在呢想从这个表格中将考过语文的学生的成绩保留下来,而将没考过语文的学生所有成绩都删去,即如上面右图格式的结果。首先上面这种记录数据的方法就很不科学,因为从程序的角度来看这些数据的话,B3单元格的数学和A2单元格的小李是扯不上什么关系的,所以我们要先对数据进行一下预处理,将原数据中A列空的单元格都填充上相应的数据。熟悉Excel的朋友应该知道Excel本身有个向下自动填充的功能,不过一次只能真一块区域,这里我们用VBA程序来实现全部空白区域的一次性填充,填充的代码如下:
Sub test1()
Dim rng
For Each rng In Range("A1:A" & Range("B" & Rows.Count).End(xlUp).Row).SpecialCells(xlCellTypeBlanks).Areas
Range(rng, rng(0)).FillDown
Next
End Sub
上面的代码稍微解释一下,Range("A1:A" & Range("B" & Rows.Count).End(xlUp).Row)表示A列有数据的区域,.SpecialCells(xlCellTypeBlanks)表示空白单元格.那Range("A1:A" & Range("B" & Rows.Count).End(xlUp).Row).SpecialCells(xlCellTypeBlanks).Areas自然就表示A列的每个空白区域了,FillDown函数就是自动向下填充了,Range(rng,rng(0))就是空白区域及其上面的一个单元格,这步其实就是在模拟Excel的填充功能,你如果会了填充功能这步自然就了解了。
完成了上面的处理之后下面的思路就简单了,我们只要判断出哪些人考了语文哪些人没考语文,然后从A列按人名判断,没考语文的就把这行删除就可以了。这里自然就想到了字典,只要将所有考语文的学生名字放入字典,然后依次判断A列的人名是否在字典中,不在的就删除该行就可以了,直接看代码:
Sub test2()
Dim d, j, m
Set d = CreateObject("scripting.dictionary")
For j = 2 To Range("B" & Rows.Count).End(xlUp).Row '遍历B列
If Range("B" & j) = "语文" Then '如果B列出现语文
d(Range("A" & j).Value) = "" '将A列的人名放入字典
End If
Next
For m = Range("B" & Rows.Count).End(xlUp).Row To 2 Step -1 '依次判断A列的人名
If Not d.exists(Range("A" & m).Value) Then '如果人名不在字典中
Rows(m).Delete '删除该行
End If
Next
Set d = Nothing
End Sub
上面的代码思路也很简单了,这里只是需要你掌握字典的一些基本用法。到现在为止我们已经将没考语文的人的数据都删除了,不过现在的数据A列还是填充的,那为了所谓的好看我们再把那些填充的数据删除好了,看下面代码
Sub test3()
Dim i
For i = Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1 '从下往上依次访问A列
If Range("A" & i) = Range("A" & i - 1) Then '如果单元格和上一单元格的值相等
Range("A" & i) = "" '则让该单元格为空
End If
Next
End Sub
执行完了上面三步我们的目的也就达到了,有兴趣的朋友可以把这三步自己组合起来,当然更简单的是依次调用这三步就可以了
Sub 运行()
Call test1
Call test2
Call test3
End Sub
本节示例文件下载地址:http://pan.baidu.com/s/1ntNsJGH。
联系客服