阳光石油网|石油技术交流|石油人论坛

 找回密码
 欢迎注册
查看: 3037|回复: 1

如何查找不及格学生姓名并突出显示?

[复制链接]
  • TA的每日心情
    开心
    2012-10-14 19:24
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2012-8-19 05:46:16 | 显示全部楼层 |阅读模式

    马上注册,下载丰富资料,享用更多功能,让你轻松玩转阳光石油论坛。

    您需要 登录 才可以下载或查看,没有账号?欢迎注册

    x
    解决方案

    Find方法无法使用比较运算符进行按范围查找,只能采用For...Next循环或者Loop循环语句遍历C列成绩区域,对每个非空单元格进行数值判断。如果符合条件“不及格”则逐一合并所有单元格到同一个Range对象变量中,最后将该变量所代表的区域进行背景着色。


    操作方法

    步骤1 确定活动工作表为“语文成绩”,按<Alt+F11>组合键打开VBE窗口

    步骤2 单击菜单“插入”→“模块”,并录入以下代码:



    Sub 查询并标示()
           Dim rng As Range, RngTemp As Range, cell As Range'
    声明三个Range对象变量

    'C2C列最后一个非空单元格所代表的区域赋值给变量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&#8209;2所示:


    24&#8209;2执行结果

    原理分析

    本例中涉及两个重要的知识点:让程序自动适应查询的目标区域,以及合并已找到的多个单元格。

    其中获取待查询的目标区域使用了“Range([c2], Cells(Rows.Count, "C").End(xlUp))”语句,表示C2C列最后一个非空单元格之间的整个区域。它具有延展性,即可以提升程序的通用性能,可以随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'声明一个数组和一个变体型变量

    'C2C列最后一个非空单元格所代表的区域赋值给数组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未初始化,那么将Ai行单元格赋值给变量RngTemp

    Set RngTemp = Cells(i, "A")

    Else

    '否则将变量RngTempAi行单元格合并,然后赋值给变量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


  • TA的每日心情
    开心
    2021-11-1 03:35
  • 签到天数: 956 天

    [LV.10]以坛为家III

    发表于 2014-12-9 13:07:41 | 显示全部楼层
    支持楼主顶顶顶顶顶顶顶

    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 欢迎注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|阳光石油网 ( 鲁ICP备2021003870号-1 )

    GMT+8, 2025-1-9 06:40 , Processed in 0.073655 second(s), 23 queries .

    Powered by Discuz! X3.4 Licensed

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表