【转载】EXCEL VBA 选取非连续的单元格区域——Areas集合
出处:http://www.360doc.com/content/21/1113/17/77710807_1004011085.shtml
前面我们讲的大多是**并操作单个的单元格,或者是连续的单元格区域,如果这些单元格区域不连续,如下图所示,单元格区域A1:B2、A4:B5、A7:B8分别隔开,各自独立,此时,有没有什么办法在VBA中一次获取这些区域(不能包含区域之间的空行)并对其进行相应的操作呢?
VBA提供了一个Areas集合对象,用来解决这方面的情形。
如上图,在Excel中按Ctrl键,依次选中单元格区域A1:B2、A4:B5、A7:B8。然后,在VBE中输入下面的代码:
Sub testAreas1()
MsgBox '所选区域中连续区域块的个数是:'& Selection.Areas.Count
MsgBox '第1块区域是:'& Selection.Areas(1).Address
MsgBox '第2块区域是:'& Selection.Areas(2).Address
MsgBox '第3块区域是:'& Selection.Areas(3).Address
End Sub
按F5键,运行代码。结果如下图所示:
结合上述代码及运行的结果,我们接下来详细解析Areas集合。
通过上述代码的运行可以看出,Areas集合表示所选择范围内的所有区域的集合,或者说连续区域块的集合。前面我们首先依次选择了单元格区域A1:B2、A4:B5、A7:B8,那么代码:
Selection.Areas
将返回一个Areas集合,这个集合中包含了我们选择的三个单元格区域,因此,代码:
Selection.Areas.Count
返回值3,即选择区域的个数。
Count属性返回一个值,代表集合中对象的数量。
代码:
Selection.Areas(1).Address
Selection.Areas(2).Address
Selection.Areas(3).Address
依次返回这3个单元格区域的地址。
使用:
Areas(索引值)
从集合中返回由索引值指定的单个的Range对象。索引值是集合中各个区域的索引号,索引号与选择区域的顺序一致。上例中,我们依次选择了单元格区域A1:B2、A4:B5、A7:B8,因此索引值1代表单元格区域A1:B2,索引值2代表单元格区域A4:B5,索引值3代表单元格区域A7:B8。
如果您改变选择顺序,例如先选择A7:B8,再选择A1:B2和A4:B5,运行代码会显示不同的结果。试试看。
说明:没有单个的Area对象,Areas集合的成员是Range对象。Areas集合包含一个个Range对象,这些对象代表所选范围内每个独立而连续的单元格区域。如果所选择的范围仅包含一个区域,那么Areas集合包含单个的Range对象,与该选择的范围一致。
示例:为不同单元格区域设置不同的背景色
对下图所示的工作表中的3个区域分别设置不同的背景颜色,使其成为右侧的样子。
代码如下:
Sub testAreas2()
Selection.Areas(1).Interior.Color =RGB(255, 0, 0)
Selection.Areas(2).Interior.Color = RGB(0,255, 0)
Selection.Areas(3).Interior.Color = RGB(30,144, 255)
End Sub
代码中设置单元格背景色的方法请参考:《Excel VBA解读33:装修匠来了—初步应用单元格格式》。
在一些情况下,不能够在所选取范围内的多个区域中同时执行某些操作,此时,必须遍历所选范围内的每个区域并分别执行操作。
仍以上面的示例为例,为不同的单元格区域设置不同的背景色。当单元格区域的第1个单元格中的值为1时,将该区域的背景色设置为红色;当单元格区域的第1个单元格中的值为2时,将该区域的背景色设置为绿色;当单元格区域的第1个单元格中的值为3时,将该区域的背景色设置为蓝色。代码如下:
Sub testAreas3()
Dim rngArea As Range
'遍历选择的区域中的每个连续区域块
For Each rngArea In Selection.Areas
'如果某块区域的第1个单元值中的值为1,则设置单元格背景色为红色
If rngArea.Range('A1') = 1Then rngArea.Interior.Color = RGB(255, 0, 0)
'如果某块区域的第1个单元值中的值为2,则设置单元格背景色为绿色
If rngArea.Range('A1') = 2Then rngArea.Interior.Color = RGB(0, 255, 0)
'如果某块区域的第1个单元值中的值为3,则设置单元格背景色为蓝色
If rngArea.Range('A1') = 3Then rngArea.Interior.Color = RGB(30, 144, 255)
Next rngArea
End Sub
拾遗:如何表示单元格区域中的单元格
在上面的代码中,我们使用了rngArea.Range(“A1”)来指定某单元格区域中的第1个单元格。以下图为例来说明。
我们首先选取了单元格区域A1:B2、A4:B5、A7:B8,这就是上面代码中的Selection所代表的区域。其中,对于所选区域中的第1块单元格区域A1:B2,代码rngArea.Range(“A1”)代表A1;对于所选区域中的第2块单元格区域A4:B5,代码rngArea.Range(“A1”)代表A4;对于所选区域中的第3块单元格区域A7:B8,代码rngArea.Range(“A1”)代表A7。也就是说,指定参数”A1”的属性Range返回区域中的第1个单元格。
在《Excel VBA解读(31):Range对象—从选取单元格说起》中,我们详细介绍了选取单元格的各种方法,其隐含的前提是我们都在当前工作表中进行操作。如果在属性Range对象中加上一个代表单元格区域的对象限定,那么就是在该单元格区域中进行操作,即在该文中介绍的选取单元格的方法也都适用于在该单元格区域中选取单元格。
为了便于理解,举个例子说明。如下图所示,我们所选的区域是B2:D4,如何操作单元格图中箭头指向的单元格呢?
当然,对于整个工作表来说,该单元格是C3,但是对于所选单元格区域B2:D4来说,它是单元格B2,或者说位于单元格区域的第2行第2列。试着运行下面的代码:
Sub testRange()
'获取所选区域中第2行第2列单元格的地址及值
MsgBox '所选区域中第2行第2列单元格的地址是' & Selection.Range('B2').Address
MsgBox '所选区域中第2行第2列单元格中的值是' & Selection.Range('B2').Value
End Sub
结果如图:
回顾《Excel VBA解读(31):Range对象—从选取单元格说起》,我们也可以使用下面的代码选择单元格C3:
Selection.Cells(2, 2)
Selection.Cells(2, 'B')
Selection.Cells (5)
总之,在所选区域中,以左上角的单元格为基点来定位所要操作的单元格。其第1列为列A、第2列为列B,以此类推,而不管其位于工作表中的实际列号,行类似。
示例:将工作表中的常量区域的背景色设置为红色
如上图所示的工作表,需要将分数单元格的背景设置为红色。代码如下:
Sub testAreas4()
Dim rng As Range
'遍历工作表中含有常量值的单元格区域
For Each rng InCells.SpecialCells(xlCellTypeConstants, 1).Areas
rng.Interior.Color = RGB(255, 0, 0) '设置背景色为红色
Next rng
End Sub
代码中,Cells代表当前工作表中的所有单元格,带参数xlCellTypeConstants的SpecialCells方法获取工作表中单元格内容为常量值的单元格区域(参见《Excel VBA解读(43):快速定位到特定的单元格——SpecialCells方法》),Areas返回符合常量值的条件的区域所组成的集合。
【转载】EXCEL VBA 选取非连续的单元格区域——Areas集合的更多相关文章
- Excel VBA入门(八)单元格边框
本文基于以下文件 http://pan.baidu.com/s/1nvJtsu9 (部分)内容预览: 1. 边框样式 Sub cell_format() Dim sht As Worksheet Di ...
- 个人永久性免费-Excel催化剂功能第62波-单元格区域内数据加解密处理,最有效地保护数据方式
Excel的数据保护能力有限,诸如之前提及过的工作表保护.工作薄保护等,都是十分微弱的保护措施,而对于强保护的工作薄打开密码来说,它像是个总开关一样,要么全不能看,要么就全看到.有这样的场景需求,一份 ...
- excel 快速填充所有非连续空白单元格
工作中经常会碰到这样的表,需要把空白的单元格填充完成.变成后图.下面就是方法. 工具/原料 EXCEL 方法/步骤 首先选中你要填充的区域, 按“F5"或者 Ctrl + ...
- 基于.NET的Excel开发:单元格区域的操作(读取、赋值、边框和格式)
引用 using Excel = Microsoft.Office.Interop.Excel; 定义 Excel.ApplicationClass app; Excel.Workbooks book ...
- 填报表导出excel非可写单元格锁定问题
问题描述: 填报表单元格分为可写和不可写两种状态,当填报表在web上展现的时候可写单元格可以进行数据填报和修改,非可写单元格不可操作. 报表导出为excel时,润乾导出excel包默认情况下不对 ...
- 个人永久性免费-Excel催化剂功能第81波-指定单元格区域内容及公式填充
在日常数据处理过程中,需要对缺失数据进行填充时,按一定逻辑规则进行处理,实现快速填充,规范数据源.此篇给大家带来多种填充数据的场景. 业务使用场景 对各种系统中导出的数据,很多时候存在数据缺失的情况, ...
- Excel催化剂开源第15波-VSTO开发之DataTable数据导出至单元格区域
上篇提到如何从Excel界面上拿到用户的数据,另外反方向的怎样输出给用户数据,也是关键之处. VSTO最大的优势是,这双向的过程中,全程有用户的交互操作. 而一般IT型的程序,都是脱离用户的操作,只能 ...
- Excel催化剂开源第14波-VSTO开发之单元格区域转DataTable
在Excel开发过程中,大部分时候是和Range单元格区域打交道,在VBA开发中,大家都知道的一点是,不能动不动就去遍历所有单元格,那性能是非常糟糕的,很多时候,是需要把整个单元格区域装入数组中再作处 ...
- EXCEL在改动某几个单元格时隐藏空列
概述 今天我哥来找我帮他搞下excel表格,本着程序猿对程序无所不能的精神,我爽快的答应了.结果查了半天才搞定.现在记录在此,供自己以后参考,相信对其他人也有用. PS:这几天正在弄博客,马上就要弄完 ...
随机推荐
- TCP和UDP的区别与联系以及网络字节序和主机字节序的转换函数实践
TCP和UDP的区别 TCP是一个面向连接的.可靠的.基于字节流的传输层协议. 而UDP是一个面向无连接的传输层协议. 具体来分析,和 UDP 相比,TCP 有三大核心特性: 面向连接:所谓的连接,指 ...
- gitee仓库上传文件的步骤
一:Git是什么? Git是一种代码托管技术.在开发中,Git是一种代码托管技术,很多代码托管平台也是基于Git来实现的.Git可以帮我们做到很多的 事情,比如代码的版本控制,分支管理等. 可以把Gi ...
- SpringMVC访问不到默认页的问题。
在web.xml中配置了 <welcome-file-list> <welcome-file>index.html</welcome-file> </welc ...
- 一键生成通用高亮代码块到剪贴板,快捷粘贴兼容 TT/WX/BJ 编辑器
有些在线图文编辑器不支持直接插入代码块,但可以直接粘贴 HTML 格式的高亮代码块. 花了一点时间研究了一下各家的编辑器,规则却各不相同.有的要求代码块被包含于 <code> ... &l ...
- Java8新特性之Stream流(含具体案例)
一.概述 Stream 流是 Java 8 新提供给开发者的一组操作集合的 API,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选.排序.聚合等.元素 ...
- paddle&蜜度 文本智能较对大赛经验分享(17/685)
引言 我之前参加了一个中文文本智能校对大赛,拿了17名,虽然没什么奖金但好歹也是自己solo拿的第一个比较好的名次吧,期间也学到了一些BERT应用的新视角和新的预训练方法,感觉还挺有趣的,所以在这里记 ...
- [Go疑难杂症]为什么nil不等于nil
现象 在日常开发中,可能一不小心就会掉进 Go 语言的某些陷阱里,而本文要介绍的 nil ≠ nil 问题,便是其中一个,初看起来会让人觉得很诡异,摸不着头脑. 先来看个例子: type Custom ...
- SpringBoot自定义注解+异步+观察者模式实现业务日志保存
一.前言 我们在企业级的开发中,必不可少的是对日志的记录,实现有很多种方式,常见的就是基于AOP+注解进行保存,但是考虑到程序的流畅和效率,我们可以使用异步进行保存,小编最近在spring和sprin ...
- Linq--取group分组后的每组第一条数据
Linq对指定字段分组并取每组第一个值 先排序后分组 目的:取每个RequestID组内的最大HistoryID的数据 //对RequestID进行分组降序排序,去每组的第一条数据 IList< ...
- C# String.Empty和""的区别
个人观点 Empty其实是string类中的一个静态的只读字段,因为是静态成员变量,所以String.Empty是在设计String类的时候就已经在内存上分配好了空间,故在使用Empty这个变量的时候 ...