马上注册,下载丰富资料,享用更多功能,让你轻松玩转阳光石油论坛。
您需要 登录 才可以下载或查看,没有账号?欢迎注册
x
解决方案:
Find方法无法使用比较运算符进行按范围查找,只能采用For...Next循环或者Loop循环语句遍历C列成绩区域,对每个非空单元格进行数值判断。如果符合条件“不及格”则逐一合并所有单元格到同一个Range对象变量中,最后将该变量所代表的区域进行背景着色。
操作方法
步骤1 确定活动工作表为“语文成绩”,按<Alt+F11>组合键打开VBE窗口;
步骤2 单击菜单“插入”→“模块”,并录入以下代码:
Sub 查询并标示()
Dim rng As Range, RngTemp As Range, cell As Range'声明三个Range对象变量
'将C2到C列最后一个非空单元格所代表的区域赋值给变量Rng,这是被查找的区域
Set rng = Range([c2], Cells(Rows.Count, "C").End(xlUp))
For Each cell In rng'利用For...Next循环遍历Rng区域每个单元格
If Len(cell) > 0 Then'仅仅对长度大于0的单元格进行查询
If cell.Value < 60 Then'如果值小于60
If RngTemp Is Nothing Then
'如果变量RngTemp未初始化,那么将找到的单元格左边偏移两位的单元格赋值给变量RngTemp
Set RngTemp = cell.Offset(0, -2)
Else'否则将变量RngTemp与找到的单元格向左偏移两位的单元格合并,然后赋值给变量RngTemp
Set RngTemp = Union(RngTemp, cell.Offset(0, -2))
End If
End If
End If
Next cell'如果变量RngTemp未初始化则提示
If RngTemp Is Nothing Then
MsgBox "不存在不及格学生", 64, "提示"
Else'否则对变量所代表的区域添加黄色背景并选择目标单元格
RngTemp.Interior.ColorIndex = 6
RngTemp.Select
End If
End Sub
步骤2 返回工作表,单击功能区的“开发工具”选项卡→“宏”按钮,并执行过程“查询并标示”。程序执行结果如图24‑2所示:
图 24‑2执行结果
原理分析
本例中涉及两个重要的知识点:让程序自动适应查询的目标区域,以及合并已找到的多个单元格。
其中获取待查询的目标区域使用了“Range([c2], Cells(Rows.Count, "C").End(xlUp))”语句,表示C2到C列最后一个非空单元格之间的整个区域。它具有延展性,即可以提升程序的通用性能,可以随C列数据的增减变化而自动适应。其通用性主要体现在两个方面:首先是利用Cells(Rows.Count, "C")获取C列最后一个单元格,使程序可以在Excel 2003早期版本和Excel 2010都能正确执行,防止出错。而采用“Range(“C65536”)”或者“Range(“C1048576”)”则兼容性不足;其次,配合End(xlUp)属性取C列最后一个非空单元格。它可以让程序自动适应成绩表的增减变化,从而提升程序的适应性能。远远优于Range(“C2:C21”)这种硬性定位区域的思路
合并已找到的多个单元格则主要是为了提升程序的性能。本例中采用Union方法将所有找到的符合条件的单元格合并为一个Range对象,最后对这个对象进行着色操作,即仅仅需要一次着色操作。如果每找到一个目标就进行着色则在效率上会有偏差。
知识扩展
For Each...Next 语句表示针对一个数组或集合中的每个元素,重复执行一组语句。其语法如下:
For Each 变量 In 集合
一条或多条语句
[Exit For]
一条或多条语句
Next [变量
其中Exit For是可选参数,用于中途退出循环。
本例也可以采用数组来执行,当工作表中数据较多时,执行效率会有明显的提升。代码如下:
Sub 查询并标示2()
Dim rng As Range, RngTemp As Range, i As Integer, j As Integer
Dim arr(), cell'声明一个数组和一个变体型变量
'将C2到C列最后一个非空单元格所代表的区域赋值给数组Arr
arr = Range([c2], Cells(Rows.Count, "C").End(xlUp)).Value
i = 1'因第一行是标题,不参与查找,所以初始化变量值为1
For Each cell In arr'利用For...Next循环遍历数组arr,比遍历单元格区域更快
i = i + 1'累加变量i,该值对应于查到的目标值所在行
If Len(cell) > 0 Then'仅仅对长度大于0的成绩进行查询
If cell < 60 Then
j = j + 1'如果值小于60则累加变量J,该变量对应于目标值数量
If j = 1 Then'如果变量RngTemp未初始化,那么将A列i行单元格赋值给变量RngTemp
Set RngTemp = Cells(i, "A")
Else
'否则将变量RngTemp与A列i行单元格合并,然后赋值给变量RngTemp
Set RngTemp = Union(RngTemp, Cells(i, "A"))
End If
End If
End If
Next cell'如果J=0则提示,否则对变量所代表的区域添加黄色背景
If j = 0 Then MsgBox "不存在不及格学生", 64, "提示" Else RngTemp.Interior.ColorIndex = 6: RngTemp.Select
End Sub
|