使用Range对象

引用单元格区域

使用A1引用样式

Range属性的语法格式如下:

Range(cell1,cell2)

可以对指定的区域进行赋值,也可以清空单元格区域

Range("B2").value = "Microsoft Excel 2016"
Range("B2").ClearContents

使用行列编号

在VBA中可使用Cells属性通过行列编号引用单个单元格,Cells属性的语法格式如下。

Cells(RowIndex,ColumnIndex)
  1. 两个参数都是可选参数,分别表示行序号与列序号。默认参数的cells属性返回引用对象的所有单元格。

  2. 如果仅指定了一个参数,则表示引用单元格的索引号,其顺序为由左至右,再由上至下,逐个索引

Sub CellsIndexDemo()
Dim i As Integer
For i = 1 To Selection.Cells.Count
    Selection.Cells(i) = i
Next i
End Sub

运行代码后,单元格区域内显示为

image-20240501144448123

  1. 当指指定ColumnIndex时,则RowIndex的默认值为1。例如Cells(,3)相当于Cells(1,3)

使用快捷记号

将A1引用样式或命名区域名称使用“[ ]”括起来,作为range属性的快捷方式,这样就不必输入关键字“Range",以实现快捷输入。例如:

dim rng as Range
set rng = [B3:E6]

使用Rows和Columns属性

Rows,Columns属性可以应用于Application对象、Worksheet对象和Range对象,分别返回对象指定区域的所有行和所有列,通过索引号可以返回其中的一行/列或多行/列

Sub selectRows()
    Rows("3:5").Select
End Sub

image-20240501151724433选择了当前sheet的第3到第5行

Sub selectRows()
    Range("A1:D10").Rows("3:5").Select
End Sub

image-20240501152053861选择了Range(“A1:D10”)的第3到第5行

使用offset属性

Range对象Offset属性代表位于指定单元格区域的一定偏移量位置上的与指定单元格区域大小相同的单元格区域。Offset属性的语法格式如下:

Offset(RowOffset,ColumnOffset)

使用Resize属性

Range对象Offset属性用于指定区域的大小,并返回调整后的单元格区域,默认使用该区域最左上角单元格作为基准单元格。Resize属性的语法格式如下:

Resize(RowSize,ColumnSize)

其中RowSize,ColumnSize分别代表调整后的单元格区域的行数与列数

使用CurrentRegion属性

Range对象的CurrentRegion属性返回对象所在的当前区域,当前区域是一个边缘为任意空行和空列,或者工作表边缘组成的最小矩形范围。

Sub selectData()
    Dim rng As Range
    Set rng = Range("A1").CurrentRegion
    With rng
    .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).Select
    End With
End Sub

使用Areas属性

Sub AreaDemo()
    Dim rng As Range
    Dim i As Byte
    Set rng = Range("A1,B2:D5,G3:I8")
    Debug.Print (rng.Areas.Count)
    For i = 1 To rng.Areas.Count
        MsgBox "将选择第" & i & "个Areas区域:" & _
        rng.Areas(i).Address
        rng.Areas(i).Select
    Next i
    set rng = Nothing
End Sub

Range.Areas属性返回Range本身。对于多重选择区域,Areas返回一个集合,该集合包含Range选择的所有区域。如上面代码中,Areas.Count等于3.Areas(1)为A1Areas(2)为B2:D5,Areas(3)为G3:I8

取得最后一个非空单元格

获得指定行/列的最后一个非空单元格,一般需要使用Range对象的End属性

其语法是:

end(xlDirection)

xlDirection 常量

常量说明
xlDown向下
xlToRight向右
xlToLeft向左
xlUp向上

复制单元格区域

使用Range的Copy方法,可以复制指定单元格区域到另一个单元格区域。如下代码

Sub RangeCopy()
    Dim rng As Range
    Set rng = Range("A1").CurrentRegion
    rng.Copy Destination:=Worksheets("Sheet2").[a1]
End Sub

Range.Copy的语法格式如下

Range.Copy(Destination)

参数Destination如果省略,Excel会把该区域复制到剪贴板

复制单元格区域的操作不会将源单元格区域列宽复制到目标区域。如下示例代码可以在实现复制单元格区域时,使目标单元格区域的列宽与源区域保持一致。

Sub CopyWithSameColumnWidth()
    Sheets("Sheet1").Range("A1").CurrentRegion.Copy
    With Worksheets("Sheet2").Range("A1")
        .PasteSpecial xlPasteColumnWidths
        .PasteSpecial xlPasteAll
    End With
    Application.CutCopyMode = False
End Sub

Range对象的PasteSpecial方法将剪贴板中的Range对象粘贴到指定区域,在粘贴时可以有选择地粘贴对象的部分属性,其语法格式如下。

PasteSpecial(Paste,Operation,SkipBlanks,Transpose)

具体的其他属性,可以使用录制宏的方式查看。

仅复制数值到另一个区域

使用仅粘贴数值的方式

直接赋值

对行进行快速分组

获取两个单元格区域的交叉区域

使用Application.Intersect方法可以获得两个单元格区域的交叉区域

语法:

Application.Intersect(range1,range2[, ... ...])

联合多个单元格区域

Application.Union方法可以将多个单元格区域联合为同一个Range对象,语法如下

Application.Union(range1,range2[, ... ...])

判断一个区域是否包含在另一个区域

利用Application.Intersect方法

Function blnInclude_Intersect(ByVal Rngcell1 As Range, ByVal Rngcell2 As Range)
    Dim rngIntersect As Range
    Set rngIntersect = Application.Intersect(Rngcell1, Rngcell2)
    If Not rngIntersect Is Nothing Then
        If rngIntersect.Address = Rngcell1.Address Then
        blnInclude_Intersect = False
        End If
    End If
    Set rngIntersect = Nothing
End Function

利用Application.Union方法

Function blnInclude_Union(ByVal rngcell1 As Range, ByVal rngcell2 As Range) As Boolean
    Dim rngUnion As Range
    Set rngUnion = Application.Union(rngcell1, rngcell2)
    If rngUnion.Address = rngcell2.Address Then blnclude_Union = True
End Function

设置字符格式

设置单元格文本字符格式

如下示例为A1单元格写入文本,并设置单元格内的字符格式

Sub CellCharacter()
    With Range("A1")
        .Clear
        .Value = "Y=X2+2"
        .Characters(4, 1).Font.Superscript = True
        .Characters(1, 1).Font.ColorIndex = 3
        .Font.Size = 20
    End With
End Sub
  • Characters属性返回一个Characters对象,它可以理解为一个单元格中字符串的子集,本身来讲也是字符串

设置注释

如下示例为A3单元格设置注释

Sub ShapeChatacters()
If Range("A3").Comment Is Nothing Then
    Range("A3").AddComment Text:=""
End If
With Range("A3").Comment
	'注释框始终可见'
    .Visible = True
	'设置注释内容'
    .Text Text:="Microsoft Excel 2016"
	'设置注释的内容,详见下方代码详解'
    .Shape.TextFrame.Characters.Font.ColorIndex = 3
End With
End Sub

代码详解:

  • 注释的本质其实就是一个图形(Shape),因此他有Comment.Shape是一个Shape对象,Shape对象中存在各种属性,具体的请详见后面的使用Shape对象

单元格区域添加边框

绘制统一的边框样式

使用Range对象的Borders集合可以快速对单元格区域全部边框应用想用的格式,而Range对象的BorderAround方法可以快速的为单元格区域添加外边框。参照如下代码

Sub AddBorders()
    Dim rng As Range
    Set rng = Range("B2:F8")
    With rng.Borders
		'设定线条的类型为实线'
        .LineStyle = xlContinuous
		'设定边框的粗细'
        .Weight = xlThin
		'设定线条的颜色'
        .ColorIndex = 5
    End With
    '设定外边框'
    rng.BorderAround xlContinuous, xlMedium, 5	'这是不具名参数的写法'
    Set rng = Nothing
End Sub
  • 不具名参数:

    在VBA中,当调用一个方法或函数时,你可以通过参数名称来明确地为每个参数赋值(即使用具名参数),也可以不指定参数名称,按照方法或函数定义中的参数顺序来提供值(即使用位置参数)。但是在使用位置参数时,必须确保参数值的顺序与方法或函数定义的参数顺序完全一致

按照水平与垂直绘制不同的表格样式

我们在上一段代码的基础上进行修改

Sub AddBorders()
    Dim rng As Range
    Set rng = Range("B2:F8")
    With rng.Borders(xlInsideHorizontal)
        .LineStyle = xlDot
        .Weight = xlThin
        .ColorIndex = 5
    End With
    With rng.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = 5
    End With
    rng.BorderAround xlContinuous, xlMedium, 5
    Set rng = Nothing
End Sub

Range.Borders(index)中index的取值列表,在excel对象浏览器中搜索xlBordersIndex,均有说明

常量引用
xlDiagonalDown斜下边框
xlDiagonalUp斜上边框
xlEdgeBottom底部边框
xlEdgeTop上部边框
xlEdgeLeft左边框
xlEdgeRight右边框
xlInsideHorizontal内部水平
xlInsideVertical内部垂直

设置区域内单元格选择高亮

Option Explicit
Dim HighLight As Range
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Set HighLight = Range("B2:H15")
    Dim rngHighLight As Range
    Dim rng1 As Range
    Dim rng2 As Range
    '取消高亮显示区域内的填充颜色'
    HighLight.Interior.ColorIndex = xlNone
    Set rng1 = Application.Intersect(Target.EntireColumn, HighLight)
    Set rng2 = Application.Intersect(Target.EntireRow, HighLight)
    On Error Resume Next
    Set rngHighLight = Application.Union(rng1, rng2)
    rngHighLight.Interior.ThemeColor = 9
End Sub
  • 补充:VBA提供选择整行整列的代码,分别为Range.EntireRow、Range.EntireColumn

动态设置单元格数据验证序列

它是Range的Validation对象。推荐使用宏方式,再调试代码。

将单元格公式转换为数值

可以使用选择性粘贴,赋值等方法

判断单元格公式是否存在错误

语法如下:

VBA.IsError(range.value)

例如:单元格B5=0/0,这显然是一个错误,使用如下代码进行判断

Sub FormulaIsError()
    If VBA.IsError(Range("B5")) Then
        MsgBox "B5单元格错误类型为" & [B5].Text
    End If
End Sub

批量删除所有错误值

首先,我们可以使用循环遍历的方式,判断每一个单元格是否是错误值。但如果需要判断的区域过大,那我们就需要使用定位条件的方式将错误值先初步筛选出来,再进行遍历删除。

定位条件的VBA是Range的SpecialCells方法

定位条件的VBA是Range的SpecialCells方法

Sub DeleteAllError()
Dim rng As Range
On Error Resume Next
Set rng = Range("D11").CurrentRegion.SpecialCells(xlCellTypeFormulas, xlErrors)

If Err.Number = 1004 Then
    MsgBox "未找到单元格"
Else
    rng.ClearContents
End If

End Sub

SpecialCells的语法如下

SpecialCells(type,value)

注意:如果选择注释等没有单元格数值的常量,第二个参数不需要填写

XlCellType与Xlspecialcellsvalue可参照对象浏览器与宏

返回指定列的列标

使用VBA.Split将Address进行分隔,它会返回一个数组

Function strGetColumnLetter(ByVal intcol As Integer) As String
    Debug.Print (Cells(1, intcol).Address)
    Dim temp
    temp = VBA.Split(Cells(1, intcol).Address, "$")
    strGetColumnLetter = VBA.Split(Cells(1, intcol).Address, "$")(1)
End Function
Sub test()
    strGetColumnLetter (2)
End Sub

快速判断单元格区域是否存在合并单元格

使用Range对象的MergeCells属性.如果区域内包含合并单元格,此属性的值为 True

Sub IsMergeCell()
    If Range("A1").MergeCells = True Then
        MsgBox "包含合并单元格"
    Else
        MsgBox "未包含合并单元格"
    End If
End Sub

合并单元格时连接每个单元格内容

合并单元格的方法是Range.Merge

取消合并时再每个单元格中保留内容

取消合并单元格的方式是Range.UnMerge

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值