关于对象

第六篇、Excel VBA对象类型之:Range(单元格)对象

  接上一篇:假如我们能控制Exce对象,就能释放高效操作Excel的复杂功能。控制工作簿我们就可以移动它、删除它......,控制工作表,我们就可以拼接、复制......,控制单元格,我们就可以增加底色、合并、区域求和......。本篇从最基层的Range(单元格)对象开始

对象层级结构

  通过Excel对象的层级结构图,看到Excel对象模型是一个树状结构,从顶层的 Application 开始,逐级向下延伸:

复制成功!
1

Application

├─ Workbooks (所有打开的工作簿集合)
│   │
│   └─ Workbook (单个工作簿)
│       │
│       ├─ Worksheets (所有工作表集合)
│       │   │
│       │   └─ Worksheet (单个工作表)
│       │       │
│       │       ├─ Range (单元格及区域)   '最基础
│       │       │
│       │       ├─ ChartObjects (嵌入的图表集合)
│       │       │   └─ ChartObject → Chart (嵌入的图表)
│       │       │
│       │       └─ Shapes (形状/图形集合,如文本框、图片等)
│       │           └─ Shape (单个形状)
│       │
│       └─ Charts (独立的图表工作表集合)
│           └─ Chart (独立的图表工作表)

└─ Windows (所有窗口集合)

  自下往上,最最底层的是Shape对象(单个形状),它的父对象是Shapes。

  Excel表格强在数据处理,对图形、形状的控制并不是我们关注的重点。我们更关注的是单元格和单元格区域,如何对它进行操作?不准备单独对Shape和Shapes介绍(其实在了解其他对象后,对Shape和Shapes的用法也会有认识),遇到时查找资料即可,重点是Range(单元格)

Range单元格对象

1-单元格对象的引用:

  在Excel VBA中,单元格引用是操作数据的核心技能。在对任何单元格和单元格区域操作之前,都需要先找到并选定它们,然后在执行“清空、清除和删除,合并或拆分,复制和粘贴,添加背景色等等”操作。选定的方法,其实就是我们对单元格的各种引用方法的组合。

本节视频:
Range()、Cells()的使用

  单元格对象引用最常用的两种方式:Range()和Cells()。

  • 1:Range()-最直接的“门牌号”引用。是VBA中最基础的引用方式,常用来表示一个单元格或一个区域,如Range("A1")是一个单元格、Range("A1:B10")是一个单元格区域。
  • 2:Cells()-用“经纬度"定位。如果把Excel表格看做一个指标系统,Cells就是用“经纬度"来定位。有两个参数值x,y,它用行和列的位置来定位到单元格,如Cells(1,1)引用第一行、第一列的单元格,就是Range("A1")单元格,Cells(3,4)引用第3行、第4列的单元格,就是Range("D3")单元格。Cells(x,y)是单个单元格对象,而不能像Range那样可以是一个单元格区域。

Ragne和Cells这两种最基本的方式一定要掌握。它是你操控单元格对象时最常用的。在什么情况下应该用Ragne,什么时候用Cells呢?这得看在什么情境下:

  • 1.当需要处理固定单元格或单元格区域的时候,Range比较方便;
  • 2.Range也常用来结合变量,动态引用区域,(变量常是行变量);
  • 3.当有需要基于索引的操作,或需要动态遍历(循环)时,更高效的方式是使用Cells。
示例1:
  • Range、Cells,处理固定单元格或单元格区域时:
复制成功!
1

Sub 单元格对象()
    Range("A1").Value = 100  '处理固定单元格,给A1单元格赋值
    Range("B2:D5").Value = 105 '处理固定的单元格区域
End Sub

  • Range结合变量动态引用区域:
复制成功!
1

Sub 单元格对象_动态引用()
    Dim start_row As Long, end_row As Long

    start_row = InputBox("请输入一个正整数:", "输入验证")
    end_row = start_row + 5

    Range("A" & start_row & ":C" & end_row).Value = start_row  '结合变量,实现动态区域操作

End Sub

  • 需要基于索引的操作、或需要动态遍历(循环)时:
复制成功!
1

Sub Cells_引用_循环遍历单元格()
    Dim i As Long
    For i = 1 To 10
        Cells(i, i).value = i * 10  '更高效
    Next i
End Sub

Sub Cells_引用_动态行列()
    Dim row_num As Long, col_num As Long

    row_num = InputBox("请输入一个行数:", "输入正整数")
    col_num = InputBox("请输入一个列数:", "输入正整数")

    Cells(row_num, col_num).value = row_num + col_num  '行号或列号由变量决定时

End Sub

其他常见的引用方法
  • 3:Offfset-"相对位置”导航。和我们日常生活中描述的:“你先到KFC,再向前走3家店,右手边第一家店,我就在这家店里。”就是这个意思。Range("A1").offset(3,1),表示A1单元格下移3行、右移一行,就是Range("B4")单元格。也可以是负数,就表示向上或左移的意思。
  • 4:Resize-单元格的“扩张”。以某个单元格或单元格区域为基准,扩大单元格的引用范围。Range("A1").Resize(3,2),表示A1单元格为基准,向下占用3个单元格、向右占用2个单元格,就是A1:C4单元格区域。参数为负数时比如.Resize(-2,-4)表示向上和向左扩张。
  • 5:ActiveCell-"当前位置”。代表你当前选中的单元格
  • 6:End-“终点”。直到终点的意思。“商场3楼一直向东到尽头的这家店。”
  • 7:CurrentRegion当前区域和UsedRange已使用区域
  • Range("A1").currentRange,单元格A1所在的当前区域,就是行列和A1有依靠的非空的部分,也就是选中A1单元格后,使用Ctrl+A全选能选中的区域。
  • Sheet1.UsedRange,工作表Sheet1内已使用的区域,可以是整个区域块,也可以是多个区域块。
  • 8:EntireRow整行和EntireColumn整列。有时我们需要在某行或列中查找,不知道行和列最后一个非空单元格在哪里、需要在整行整列中查找单元格时,就需要整行或整列引用了。

  单元格的引用方式有多种,选择合适的引用方式就像选择合适的交通工具,要跟进具体情况来定。Range和Cells首先要掌握,其他的这些视情况而定,了解它们能使得你的代码更简洁和高效。

示例2:
  • 其他的单元格或单元格区域引用方法
复制成功!
1

Sub 其他引用方式()
    Range("B2").Value = ActiveCell.Address                  'ActiveCell-"当前位置”
    Range("B3").Value = ActiveCell.Offset(-3, 2).Address    'Offfset-"相对位置”
    Range("B4").Value = ActiveCell.Resize(3, 4).Address     'Resize-单元格的"扩张”
    Range("B5").Value = ActiveCell.End(xlUp).Address        'End(xlUp)-”列起点"
    Range("B6").Value = ActiveCell.End(xlDown).Address      'End(xlDown)-”列终点"
    Range("B7").Value = ActiveCell.End(xlToLeft).Address    'End(xlToLeft)-”行起点"
    Range("B8").Value = ActiveCell.End(xlToRight).Address   'End(xlToRight)-”行终点"
    Range("B9").Value = ActiveCell.CurrentRegion.Address    'CurrentRegion当前区域
    Range("B10").Value = Sheet1.UsedRange.Address            'UsedRange已使用区域
    Range("B11").Value = ActiveCell.EntireRow.Address       'EntireRow整行
    Range("B12").Value = ActiveCell.EntireColumn.Address    'EntireColumn整列
End Sub

单元格引用的常用方法小结:
点击放大的图片

2-单元格对象的操作和设置(方法和属性):

  上个小结了解到了“引用了单元格或单元格区域的方法”,相当于找到了符合要求的单元格。找到(引用)单元格之后呢?,操作控制它才是正解!

  我们对单元格和单元格区域操作的常规动作比如:清空、清除和删除、填充、合并\拆分、复制\粘贴、背景色增加、隐藏......。有些我们可以把它理解成操作方法,每个动作都有自己的方法(表达方式:对象.方法),用于改变对象的状态,对单元格对象使用这个方法就可以控制它做相应的动作来改变状态,比如清除、插入;有些我们可以理解成属性,即对象本身拥有的特性,通过改变对象的属性,用于以改变对象表现特征(表达方式:对象.属性=),比如隐藏、底色。

本节视频:
方法:对单元格和单元格区域操作

  可以对直接对选定的单元格或单元格区域进行操作,也可以用Set关键字定义单元格对象变量并赋值给它后,对该变量进行操作。

示例(方法):
复制成功!
1

Sub 单元格和单元格区域的操作()

    '选择A1:D5区域,清除
    Sheet2.Range("A1:D5").Select     '选择区域
    Selection.Clear                  '对选择的区域清除

    'A6:E8区域,只清空内容,格式不变
    Sheet2.Range("A6:E8").ClearContents       '直接对区域进行清空操作

    'A10:C12区域赋值给变量,删除该区域
    Dim Del_Range As Range
    Set Del_Range = Sheet2.Range("A10:C12")
    Del_Range.Delete                          '直接对区域进行删除操作,默认单元格上移

    'L3:O12区域赋值
    Sheet2.Range("L3:O12").Value = "A"

    'G3:J12区域合并
    Sheet2.Range("G3:J12").Select
    Selection.Merge                        '合并单元格
    Selection.UnMerge '                     '拆分合并单元格

    'H20:J23区域赋值,粘贴到 O20:P23单元格
    Sheet2.Range("H20:J23").Copy Destination:=Sheet2.Range("O20:P23")

    'H2单元格所属的行和列增加背景色
    Sheet2.Range("A2").EntireRow.Interior.Color = RGB(0, 0, 0)            '整行区域
    Sheet2.Range("A2").EntireColumn.Interior.Color = RGB(0, 0, 0)         '整列区域

    'L2单元格的当前区域增加背景色
    Sheet2.Range("l2").CurrentRegion.Interior.Color = RGB(100, 100, 100)   '当前非空行/列区域

    'Sheet2的已使用区域增加背景色
    Sheet2.UsedRange.Interior.Color = RGB(255, 100, 100)                    '工作表中已使用区域

    'L3:O12,A10:C12的合并区域增加背景色
    Dim rng1 As Range, rng2 As Range, Union_Rng As Range
    Set rng1 = Range("L3:O12")
    Set rng2 = Range("A10:C12")
    Set Union_Rng = Union(rng1, rng2)                                       '合并区域
    Debug.Print Union_Rng.Address
    Union_Rng.Interior.Color = RGB(255, 255, 255)

    'Sheet2的已使用区域,和A11:D15的相交区域 增加背景色
    Dim rng3 As Range, rng4 As Range, Inct_Rng As Range
    Set rng3 = Sheet2.UsedRange
    Set rng4 = Range("A11:D15")
    Set Inct_Rng = Intersect(rng3, rng4)                                    '交叉区域
    MsgBox Inct_Rng.Address
    Inct_Rng.Interior.Color = RGB(155, 155, 155)

End Sub

单元格对象的常用方法列表:
点击放大的图片
属性:对单元格和单元格区域设置

  同样可以对直接对选定的单元格或单元格区域设置,也可以用Set关键字定义单元格对象变量并赋值给它后,对该变量设置。

  进一步了解“属性”的概念:单元格的属性是指描述单元格特征或状态的信息

  比如我们的Range("A1").value = 1,这里的Value就的单元格的一个常见属性,它表示单元格对象的值。Range("A1").value = 1可以解释为对A1单元格赋值,值为1。相应的Range("A1").value也会返回1,可以解释为返回A1单元格对象的值属性,值为1。

  有些属性是Excel VBA中常见的对象是都拥有的,比如Name属性,表示对象的名称,它在Workbook、Worksheet、Chart等对象中都存在,有些属性只属于某个对象,比如Row只属于Range对象,表示单元格所在的行号。需要注意的是,不同对象的属性可能名字相同,但是在不同对象里的含义和用法可能不同,具体的用法可以在使用时注意通过Excel的帮助文献了解。

示例(属性):
复制成功!
1

Sub 属性_单元格属性()

    Range("A2").Value = "你好,VBA"          'A1单元格赋值
    Range("B2").Value = Range("A2").Value  '返回A1单元格对象Value属性

    Range("B3").Value = Range("A3").Row    'A3单元格所在的行号
    Range("B4").Value = Range("A4").Column    'A4单元格所在的列号

    Range("B5").Value = Range("A5").Address    'A5单元格地址

    Range("B6").Formula = "=Counta(B2:B5)"     '单元格公式(字符串)

    Range("B7").Value = Range("A7").RowHeight    'A7单元格所在行的行高
    Range("A7").RowHeight = 50                  '调整行高
    Range("B7").Value = Range("A7").RowHeight    '在查看行高

    Range("B8").Value = Range("A8").ColumnWidth    'A8单元格所在列的列宽
    Range("A8").ColumnWidth = 50                  '调整列宽
    Range("B8").Value = Range("A8").ColumnWidth    '在查看列宽

    Range("B9").Value = Range("A9").Interior.Color  '查看当前背景色,-格式属性
    Range("A9").EntireRow.Interior.Color = RGB(100, 100, 100)            '设置增加背景色
    Range("A9:B9").Interior.Color = RGB(155, 155, 155)
    Range("B9").Value = Range("A9").Interior.Color

    Range("B10").Value = Range("A10").Font.Name  '查看字体样式,-格式属性
    Range("A10").Font.Name = "黑体"            '设置字体
    Range("A10").Font.Color = RGB(255, 0, 0)
    Range("A10").Font.Size = 20

    Range("B11").Value = Range("A11").Borders(xlEdgeTop).LineStyle  '查看顶部边框样式
    Range("A11").Borders(xlEdgeTop).LineStyle = xlDash            '顶部虚线
    Range("A11").Borders(xlEdgeTop).Weight = xlThick            '顶部侧粗线
    Range("A11").Borders(xlEdgeTop).Color = RGB(255, 0, 0)       '顶部颜色

End Sub

对象的常用属性:
点击放大的图片

 本篇我们只了解Range单元格对象,对有关Range单元格的属性,通过示例了解它是如何工作的,其他对象的属性在了解其他对象类型时在做介绍。

浅浅了解:关于单元格的格式设置属性:

  • Range单元格对象在对象的层级结构图中,是位于最底层的,其实里面还有诸如:内部格式Interior(填充色Color),字体Font(字体大小Size、字体颜色Color),边框(边框粗细、颜色)等等,它们也是Range对象的属性,统称为Range对象的格式属性。
  • 如:Range→Interior →Color,这是一个典型的对象层级嵌套关系,我把它当做属性的属性来理解。
  • 比如:Range("A1").Font.size,可以看做是A1单元格内字体属性的字体大小属性;
  • Range("A1").Interior.Color,可以看做是A1单元格内部格式属性中的填充颜色属性;
  • 这样来分层级解释,显然就容易理解了!。
  • 因为我们在实际工作中,常常会用到依据某个条件来设置格式,目的是更清晰直观的凸显部分重要数据,这里有必要对“格式的相关属性做了解,介绍的不多,至少在以后使用到时知道从何处下手,窥一貌而知全身!
一些单元格对象的格式设置属性:
点击放大的图片

3-Specialcells查找匹配单元格和Find查找单元格(补充了解):

  在找到符合我们需要的单元格或单元格区域时,并不是所有的方法都必须用到:循环遍历 + 条件判断。

本节视频:

   例如:循环Sheet1工作表中的所有已使用的单元格,找到其中小于15、且大于等于8的数值,字体加粗并字体颜色为红色。我们运用已了解到的知识,就是循环遍历 + 条件判断:

复制成功!
1

Sub 查找1_循环和遍历()
    Dim rng As Range   '单元格对象

    For Each rng In Sheets("查找").UsedRange      '对表格中已使用的单元格区域遍历每一个
        If rng.Value < 15 And rng.Value >= 8 Then 'if判断单元格的值知否小于15且大于等于8
            rng.Font.Color = RGB(255, 125, 125)   '符合条件的单元格,字体红色
            rng.Font.Bold = True                  '字体加粗
        End If
    Next rng

End Sub

   这个方法简单直接,适用于多条件的、逻辑稍微复杂的场景,但遇到单元格区域较大时会牺牲不少执行效率。这里了解两个查找和定位数据列表中的特定值或文本字符串的方法:Specialcells查找匹配单元格和Find查找单元格,快速定位数据、便于批量编辑或格式化,对于提升执行效率特别明显。

复制成功!
1

Sub 查找2_specialcells()

    Sheets(查找).UsedRange.SpecialCells(xlCellTypeFormulas).Interior.Color = RGB(100, 100, 100)   '定位特定包含公式值的单元格、设置底色
    Sheets(查找).UsedRange.SpecialCells(xlCellTypeLastCell).Interior.Color = RGB(150, 0, 0)        '定位已用区域中的最后一个单元格、设置底色
    Sheets(查找).UsedRange.SpecialCells(xlCellTypeBlanks).Interior.Color = RGB(200, 0, 0) '定位特定包含空值的单元格、设置底色

    Sheets(查找).UsedRange.SpecialCells(xlCellTypeFormulas, xlNumbers).Font.Size = 20         '定位特定包含公式、返回的值是数值的单元格、字体大小
    Sheets(查找).UsedRange.SpecialCells(xlCellTypeFormulas, xlErrors).Interior.Color = RGB(50, 0, 0)        '定位特定包含错误值的单元格、设置底色

End Sub

Sub 查找3_find()

    Dim firstAddress As String
    Dim foundCell As Range

    '简单的释义就是:在名为查找的工作表内,对已使用区域,查找包含张字在字符串,底色标记为黄色
    '用Find方法,把查找到符合条件的单元格赋给fondCell变量,如果能找到符合条件的单元格(找到的地址不为空),就先把第一个找到的单元格地址的字符串赋值给firstAddress字符串变量
    '然后用Do Loop_While循环,接着找剩余的符合条件的单元格,条件就是下一个单元格地址和第一个单元格地址不同,如果相同表示查找结束了就退出循环
    With Sheets(查找).UsedRange
        Set foundCell = .Find(What=张, LookAt=xlPart)    '查找第一个符合条件的 并赋值
        If Not foundCell Is Nothing Then                       '如果不为空
            firstAddress = foundCell.Address                   '赋值
            Do
                foundCell.Interior.Color = vbYellow ' 标记为黄色
                Set foundCell = .FindNext(foundCell)           ' 将下一个找到的单元格,重新赋值给founCell
            Loop While Not foundCell Is Nothing And foundCell.Address  firstAddress  '循环直到 下一个单元格的地址和第一个单元格地址相同
        End If
    End With

End Sub

各自的使用场景和优点:
  • Specialcells:查找匹配单元格,主要用于查找和定位数据列表中的特定值(如公式、空白),快速直接定位,一次性查找并选择所有匹配的单元格,便于批量编辑或格式化;
  • Find:查找单元格,精准查找特定内容或模式,特别适用于文本内容的搜索,可以快速找到包含特定文字的单元格(支持通配符、大小写、方向等参数),便于查看或编辑。

   如果你需要查找数值或条件匹配(如特定类型单元格公式、空白等),使用“查找匹配项”更合适,如果你需要搜索包含特定文字的单元格,使用“Find查找”功能更合适。在查找的内容符合特定条件时,可以考虑选择以上两个方法,也可以暂时不去了解他们,大多数的情况下使用“循环遍历 + 条件判断”就可以搞定一切~~

   具体Specialcells的参数和Find的其他复杂用法,可以网络搜索相关教程!

下一篇:了解Excel VBA的对象之:WorkSheet(工作表)对象:

   通过不同用方式的组合运用,找到单元格并选定他们,通过方法(操作)和属性(设置),让单元根据我们的要求做出相应的改变。这就是操控单元格对象!

   Excel的强在数据处理和分析,单元格对象又是Excel工作表中不可再分最小对象,是构成Excel表格的基本单位。所以对单元格对象的操控也是办公自动化的重点。这一节我们通过一系列示例了解了它们,相信如果以后遇到需要批量处理的单元格对象,也能举一反三、知道通过何种方式来操作。至少也知道了应该检索哪些相关资料!

   单元格和单元格区域的父对象是WorkSheet(工作表),对它的了解,可能就不需要像对Range单元格对象这样,会有这么多的属性、方法和事件。对于工作表,我们平常做的无非也就是修改名称、移动位置、多表合并、一表拆分等等,这些只需掌握不多的操控工作表对象的方法,对于满足日产工作的需要就足够了,遇到在复杂一点的就向DeepSeek提问嘛,提问问题→返回代码→修改代码→适用自己,也是正解!。

请开发者喝杯咖啡 请开发者喝杯咖啡!