ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【转载】EXCEL VBA 选取非连续的单元格区域——Areas集合

2021-11-13 18:02:14  阅读:364  来源: 互联网

标签:VBA Selection 单元格 EXCEL A1 Range 区域 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返回符合常量值的条件的区域所组成的集合。

标签:VBA,Selection,单元格,EXCEL,A1,Range,区域,Areas
来源: https://www.cnblogs.com/reakal/p/15549249.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有