判断单元格是否存在批注
在VBA中,可以利用Range对象的Comment属性判断单元格是否存在批注,如下面的代码所示。
#001 Sub HasComment()
#002 If Range("A1").Comment Is Nothing Then
#003 MsgBox "A1单元格中没有批注!"
#004 Else
#005 MsgBox "A1单元格中批注内容为:" & Chr(13) & Range("A1").Comment.Text
#006 End If
#007 End Sub
代码解析:
HasComment过程判断A1单元格是否存在批注,并用消息框显示批注信息。
Range对象的Comment属性返回一个批注对象,如果指定的单元格不存在批注,该属性返回Nothing。
运行HasComment过程结果如图 14?1所示。
图 14?1 显示批注内容
为单元格添加批注
如果希望为单元格添加批注,那么可以使用AddComment方法,如下面的代码所示。
#001 Sub Comment_Add()
#002 With Range("A1")
#003 If .Comment Is Nothing Then
#004 .AddComment Text:=.Value
#005 .Comment.Visible = True
#006 End If
#007 End With
#008 End Sub
代码解析:
Comment_Add判断单元格A1中是否存在批注,如果没有批注则为单元格A1添加批注并将单元格数值作为批注文本,同时显示批注对象。
第4行代码使用Range对象的AddComment方法为单元格添加批注。该方法只有一个参数Text,代表批注文本。如果单元格已经存在批注,则该方法返回一个错误。
第5行代码显示批注对象,Visible属性确定对象是否可视。
当单元格A1中不存在批注时,运行代码后的结果如图 14?2所示。
图 14?2 添加批注
删除单元格中的批注
如果需要删除单元格中的批注,那么可以使用ClearComments方法、ClearNotes方法或者Delete方法,如下面的代码所示。
#001 Sub Commentdel()
#002 On Error Resume Next
#003 Range("A1").ClearComments
#004 Range("A2").ClearNotes
#005 Range("A3").Comment.Delete
#006 End Sub
代码解析:
Notesdel过程删除单元格中的批注。
第2行代码错误处理语句,如果单元格中没有批注,那么运行第5行代码时会发生错误,所以使用On Error语句来忽略错误
第3行代码使用ClearComments方法删除单元格A1中的批注。ClearComments方法清除指定区域的所有单元格批注,语法如下:
expression.ClearComments
第4行代码使用ClearNotes方法删除A2单元格中的批注。ClearNotes方法清除指定区域中所有单元格的附注和语音批注,语法如下:
expression.ClearNotes
第5行代码使用Delete方法删除删除A3单元格中的批注.Range对象的Comment属性返回一个Comment对象,该对象代表与该区域左上角单元格相关联的批注。
合并单元格操作
判断单元格区域是否存在合并单元格
Range对象的MergeCells属性可以确定单元格区域是否包含合并单元格,如果该属性返回值为True,则表示区域包含合并单元格。
下面的代码判断单元格 A1是否包含合并单元格,并显示相应的提示信息。
#001 Sub IsMergeCell()
#002 If Range("A1").MergeCells = True Then
#003 MsgBox "包含合并单元格"
#004 Else
#005 MsgBox "没有包含合并单元格"
#006 End If
#007 End Sub
如果在指定区域中存在部分合并的单元格,如图 15?1所示,区域E8:I17中包含合并单元格区域F8:G9,H12:I13。判断这样一个单元格区域中是否包含合并单元格,可以使用下面的代码快速判断单元格区域中是否包含部分合并单元格,而不需要遍历单元格。
图 15?1 包含部分合并单元格的区域
#001 Sub IsMerge()
#002 If IsNull(Range("E8:I17").MergeCells) Then
#003 MsgBox "包含合并单元格"
#004 Else
#005 MsgBox "没有包含合并单元格"
#006 End If
#007 End Sub
代码解析:
当单元格区域中同时包含合并单元格和非合并单元格时,MergeCells属性将返回Null,因此第2行代码通过该返回结果作为判断条件。
运行IsMerge过程结果如图 15?2所示。
图 15?2 提示信息
合并单元格时连接每个单元格的文本
使用Excel的“合并及居中”按钮合并多个单元格区域时,Excel仅保留区域左上角单元格的内容,如果用户希望在合并如图 15?3所示单元格区域时,将各个单元格的内容连接起来保存在合并后的单元格区域中,则可以使用下面的代码。
图 15?3 合并前单元格区域
#001 Sub Mergerng()
#002 Dim StrMerge As String
#003 Dim rng As Range
#004 If TypeName(Selection) = "Range" Then
#005 For Each rng In Selection
#006 StrMerge = StrMerge & rng.Value
#007 Next
#008 Application.DisplayAlerts = False
#009 Selection.Merge
#010 Selection.Value = StrMerge
#011 Application.DisplayAlerts = True
#012 End If
#013 End Sub
代码解析:
Mergerng过程将所选各个单元格的内容连接起来保存在合并后的单元格区域中。
第4行代码使用TypeName函数判断当前选定对象是否为Range对象,若是则继续执行代码。
第5行到第7行代码将当前选中区域的内容连接起来保存在字符串变量StrMerge中。
第8行代码将DisplayAlerts属性设置为False,禁止在合并多重数值区域时,Excel显示的警告信息,如图 15?4所示,以避免中断代码的运行。
图 15?4 合并多重数值区域时警告信息
第9行代码使用Merge方法合并当前选定区域。应用于Range对象的Merge方法通过指定Range对象创建合并单元格,语法如下:
expression.Merge(Across)
参数expression是必需的,返回一个Range对象。
参数Across是可选的,如果该值为True,则将指定区域内的每一行合并为一个合并单元格。默认值为False。
第9行也可以使用下面的代码:
Selection.MergeCells = True
第10行代码将变量StrMerge的值赋给合并后的单元格。
运行Mergerng过程结果如图 15?5所示。
图 15?5 合并单元格结果
合并内容相同的连续单元格
如果需要合并如图 15?6所示的工作表中B列中部门相同的连续单元格,可以使用下面的代码。
图 15?6 需合并的工作表
#001 Sub Mergerng()
#002 Dim IntRow As Integer
#003 Dim i As Integer
#004 Application.DisplayAlerts = False
#005 With Sheet1
#006 IntRow = .Range("A65536").End(xlUp).Row
#007 For i = IntRow To 2 Step -1
#008 If .Cells(i, 2).Value = .Cells(i - 1, 2).Value Then
#009 .Range(.Cells(i - 1, 2), .Cells(i, 2)).Merge
#010 End If
#011 Next
#012 End With
#013 Application.DisplayAlerts = True
#014 End Sub
代码解析:
第7行到第11行代码,从最后一行开始,向上逐个单元格判断连续两个单元格的内容是否相同,如果相同则合并。
运行Mergerng过程后,结果如图 15?7所示。
图 15?7 合并内容相同的连续单元格
取消合并单元格时在每个单元格中保留内容
如果需要取消如图 15?7所示的工作表中B列“部门”的合并单元格,并且各个单元格均保留原合并单元格的内容,可以使用下面的代码。
#001 Sub UnMerge()
#002 Dim StrMer As String
#003 Dim IntCot As Integer
#004 Dim i As Integer
#005 With Sheet1
#006 For i = 2 To .Range("B65536").End(xlUp).Row
#007 StrMer = .Cells(i, 2).Value
#008 IntCot = .Cells(i, 2).MergeArea.Count
#009 .Cells(i, 2).UnMerge
#010 .Range(.Cells(i, 2), .Cells(i + IntCot - 1, 2)).Value = StrMer
#011 i = i + IntCot - 1
#012 Next
#013 End With
#014 End Sub
代码解析:
UnMerge过程取消工作表中B列中的合并单元格,并且各个单元格均保留原合并单元格的内容。
第7行代码取得B列每个合并单元格的内容。
第8行代码取得合并区域的单元格数量。
第9行代码使用UnMerge方法取消合并单元格。UnMerge方法将合并区域分解为独立的单元格,语法如下:
expression.UnMerge
第10行代码将原合并单元格的内容赋值给取消合并单元格后的区域。
第11行代码调整循环变量i的值,使下一次循环从下一个单元格区域开始。
运行UnMerge过程结果如图 15?6所示。