实战:单元格处理应用举例

掌握了Excel中最常见的range对象的属性和方法过后,再利用上VBA里的判断和循环控制结构语句,我们就可以自己慢慢解决一些小的需求了。

今天A哥就带大家从实例出发,来把我们之前学习的知识给串起来。

案例:删除零值单元格所在行,在一个range区域,如果有任何一个单元格的值为零值,则删除本行。数据大家可以自行举例,可以使用rand函数配合int函数来随机生成含有零值的区域。

在解决实际需求前,我们都需要拟定大体的思路。对于这个问题,我们很直观的可以想到:遍历每一个单元格,判断如果是零的话,就删除行。

那么,我们可以写这样一个程序:

Sub delete_zero()Dim Rng As RangeDim i%, j%, Row_Num%, Col_Num%Row_Num = Range('a1').CurrentRegion.Rows.CountCol_Num = Range('a1').CurrentRegion.Columns.CountFor i = 1 To Row_Num    For j = 1 To Col_Num        If Cells(i, j).Value = 0 Then            Cells(i, j).EntireRow.Delete            Exit For        End If    NextNextEnd Sub

个中的逻辑也很简单,利用i循环行,j循环列。如果单元格的数值为0,那么就删除这行,并不再执行列的循环,跳出来继续执行行的循环。

看起来不错,运行一下看看吧!

F5结果执行如下图

等等,怎么里面还有零?

我们的逻辑似乎没有问题,但我们在执行过程中没有考虑excel删除行的执行方式问题。一般来说,执行行删除操作,下面的行会自动上移。因此,执行过一次行删除之后,每一行的行号相对于原始表已经发生了变化,自然会漏删一些行。

解决方法很简单,只要把行的循环进行倒序删除就可以。

Sub delete_zero()Dim Rng As RangeDim i%, j%, Row_Num%, Col_Num%Row_Num = Range('a1').CurrentRegion.Rows.CountCol_Num = Range('a1').CurrentRegion.Columns.CountFor i = Row_Num To 1 Step -1    For j = 1 To Col_Num        If Cells(i, j).Value = 0 Then            Cells(i, j).EntireRow.Delete            Exit For        End If    NextNextEnd Sub

F5运行看看,结果里面还有0吗?

这个需求的解决,到这里,似乎是结束了,然而并没有。我们刚才处理的是很小一部分数值,这种循环方式速度也还可以,但如果是大量数据,例如1000 行呢?

我们用上述方式,对1000 行数据进行了处理,处理时间为0.71秒,如果是处理10000条数据岂不是要更长?

有没有更快的运行方式呢?

我们再仔细观察一下上面的代码,我们发现,Excel每发现一行,就要执行一次删除操作,这会相当浪费时间。可不可以一次性把发现的单元格都删除呢?

这就要用到我们之前将的union方法了。

修改后的代码如下:

Sub delete_zero_new()Dim Rng As RangeDim i%, j%, Row_Num%, Col_Num%Row_Num = Range('a1').CurrentRegion.Rows.CountCol_Num = Range('a1').CurrentRegion.Columns.CountFor i = Row_Num To 1 Step -1    For j = 1 To Col_Num        If Cells(i, j).Value = 0 Then            If Rng Is Nothing Then                Set Rng = Cells(i, j)            Else                Set Rng = Union(Rng, Cells(i, j))            End If            Exit For        End If    NextNextRng.EntireRow.DeleteSet Rng = NothingEnd Sub

这里要注意的是object的使用。

一定要用set来给object赋值。例如这里,如果只写rng=cells(i,j),像函数那样赋值,则会出现对象错误报错。要改成 set rng =rn

在判断是否为nothing的时候需要用is,而不是用=。

改进了代码之后,F5运行程序只需要0.32秒,是不是比之前快了很多?

根据以上这个案例,我们可以直观的得到一个经验:在处理大量数据的时候,要尽量减少excel的固有操作,如select, activate, delete等等,这样可以大大提高运行速度。

总结一下:

使用for来遍历所有单元格

使用一次性excel操作,避免多次重复操作

掌握了Excel中最常见的range对象的属性和方法过后,再利用上VBA里的判断和循环控制结构语句,我们就可以自己慢慢解决一些小的需求了。

今天A哥就带大家从实例出发,来把我们之前学习的知识给串起来。

案例:删除零值单元格所在行,在一个range区域,如果有任何一个单元格的值为零值,则删除本行。数据大家可以自行举例,可以使用rand函数配合int函数来随机生成含有零值的区域。

在解决实际需求前,我们都需要拟定大体的思路。对于这个问题,我们很直观的可以想到:遍历每一个单元格,判断如果是零的话,就删除行。

那么,我们可以写这样一个程序:

Sub delete_zero()Dim Rng As RangeDim i%, j%, Row_Num%, Col_Num%Row_Num = Range('a1').CurrentRegion.Rows.CountCol_Num = Range('a1').CurrentRegion.Columns.CountFor i = 1 To Row_Num    For j = 1 To Col_Num        If Cells(i, j).Value = 0 Then            Cells(i, j).EntireRow.Delete            Exit For        End If    NextNextEnd Sub

个中的逻辑也很简单,利用i循环行,j循环列。如果单元格的数值为0,那么就删除这行,并不再执行列的循环,跳出来继续执行行的循环。

看起来不错,运行一下看看吧!

F5结果执行如下图

等等,怎么里面还有零?

我们的逻辑似乎没有问题,但我们在执行过程中没有考虑excel删除行的执行方式问题。一般来说,执行行删除操作,下面的行会自动上移。因此,执行过一次行删除之后,每一行的行号相对于原始表已经发生了变化,自然会漏删一些行。

解决方法很简单,只要把行的循环进行倒序删除就可以。

Sub delete_zero()Dim Rng As RangeDim i%, j%, Row_Num%, Col_Num%Row_Num = Range('a1').CurrentRegion.Rows.CountCol_Num = Range('a1').CurrentRegion.Columns.CountFor i = Row_Num To 1 Step -1    For j = 1 To Col_Num        If Cells(i, j).Value = 0 Then            Cells(i, j).EntireRow.Delete            Exit For        End If    NextNextEnd Sub

F5运行看看,结果里面还有0吗?

这个需求的解决,到这里,似乎是结束了,然而并没有。我们刚才处理的是很小一部分数值,这种循环方式速度也还可以,但如果是大量数据,例如1000 行呢?

我们用上述方式,对1000 行数据进行了处理,处理时间为0.71秒,如果是处理10000条数据岂不是要更长?

有没有更快的运行方式呢?

我们再仔细观察一下上面的代码,我们发现,Excel每发现一行,就要执行一次删除操作,这会相当浪费时间。可不可以一次性把发现的单元格都删除呢?

这就要用到我们之前将的union方法了。

修改后的代码如下:

Sub delete_zero_new()Dim Rng As RangeDim i%, j%, Row_Num%, Col_Num%Row_Num = Range('a1').CurrentRegion.Rows.CountCol_Num = Range('a1').CurrentRegion.Columns.CountFor i = Row_Num To 1 Step -1    For j = 1 To Col_Num        If Cells(i, j).Value = 0 Then            If Rng Is Nothing Then                Set Rng = Cells(i, j)            Else                Set Rng = Union(Rng, Cells(i, j))            End If            Exit For        End If    NextNextRng.EntireRow.DeleteSet Rng = NothingEnd Sub

这里要注意的是object的使用。

一定要用set来给object赋值。例如这里,如果只写rng=cells(i,j),像函数那样赋值,则会出现对象错误报错。要改成 set rng =rn

在判断是否为nothing的时候需要用is,而不是用=。

改进了代码之后,F5运行程序只需要0.32秒,是不是比之前快了很多?

根据以上这个案例,我们可以直观的得到一个经验:在处理大量数据的时候,要尽量减少excel的固有操作,如select, activate, delete等等,这样可以大大提高运行速度。

总结一下:

使用for来遍历所有单元格

使用一次性excel操作,避免多次重复操作


相关文章

  • yqxx复习计划
  • 玉泉小学六年级语文复习计划 一. 指导思想: 以教材为依据,充分利用现有的教材,面向全体学生,切实抓好基础知识和基本技能的复习,对班级的学生状况做详尽的分析,采取切实有效的措施,使好.中.差不同的学生都能得到提高. 二.复习目标: (一). ...查看


  • 计算机应用基础课程excel综合实训材料
  • 第1章 O ffice Excel 2010高级应用技术 1.1学生成绩管理 一.考查知识点 数据清单.格式设置.公式与函数.排序.筛选.分类汇总和图表等级知识,利用多种公式和函数对单元格中的数据进行运算:对各种数据可以进行格式设置:分析汇 ...查看


  • [标准化班组管理]课程大纲
  • [经典课程内容简介]   ------ 实战技能培训 [ 45  ] 作为 "兵头将尾"的班组长,是一线战斗的直接组织者和指挥者,直接关系到企业运营与效率.班组这个企业细胞的生命质量,是企业肌体是否健康的标志. 本课程针 ...查看


  • 工厂中生产成本怎样控制
  • 工厂成本控制及制造绩效提升高级研修班 电 培训时间: 2014年 8月02-03 北京 话 培训费用: 3800元/人(含培训费.教材费.午餐费.茶点费等) 8 主办单位: 北京万博汇管理顾问有限公司 5 培训对象:工厂总经理.厂长及各制造 ...查看


  • 心理迷宫--情境心理测验案例
  • 北京合君惠友科技有限公司 情境模拟测验 多维体验式智能心理迷宫 训练平台设计方案 心理迷宫训练平台设计方案 目 录 目 录 .......................................................... ...查看


  • 研发项目管理高级实战演练
  • 研发项目管理高级实战 课程背景 如果你没有系统学习过项目管理知识,却要管理好研发项目.或者虽然学习过了PMP 之类的基础课程,却无法应用到实战当中.如果你有多年的项目管理实战经验,但却对实际工作中的诸多问题存在困惑,那么这门课程就是你所需要 ...查看


  • 店面业绩倍增销售培训-全能店长特训营(广州-上海-深圳)
  • ------让店面业绩快速倍增全能店长2天1夜特训营夜特训营------------让店面业绩快速倍增 [时间地点]2011年9月27-28日深圳|2011年10月20-21日上海|2011年10月27-28日广州 [参加对象]店长.储备店 ...查看


  • [问题解决与分析技巧] 课程大纲
  • [经典课程内容简介] --- 问题引导式实战技能培训 人们并不是被问题本身所困扰,而是被解决问题的方式所困扰.大多数企业缺乏系统.规范的途径,来迅速有效地解决问题.经理人往往面对多种多样的可选方案,但却缺乏必要的技能来制定迅速.有效的决策. ...查看


  • Excel表格函数公式大全
  • 目录 按顺序整理,便于打印学习 EXCEL 函数大全 . ........................................................................................... ...查看


热门内容