查找重叠的单元格区域——Intersect方法
如果我们想知道两个单元格区域是否有共同的单元格,或者要知道两个区域中哪些是共有单元格,即两个单元格区域重合的部分,就可以使用Intersect方法。
如下图所示,很容易看出单元格区域A1:C5与B3:E8相重合的区域是B3:C5,也就是红色单元格部分。
下面的代码获取上图中两个单元格区域重合的部分,并赋值给变量rngIntersect,最后显示重合区域的单元格地址。
Sub testIntersect1()
‘声明单元格对象
Dim rngIntersect As Range
‘获取相重合的交叉区域
Set rngIntersect =Intersect(Range(“A1:C5”), Range(“B3:E8”))
MsgBox “A1:C5与B3:E8相重合的区域是:”& rngIntersect.Address
End Sub
Intersect方法的语法
表达式.Intersect(Arg1,Arg2,Arg3,…,Arg30)
说明:
表达式是一个代表Application对象的变量,表明Intersect方法属于Application对象,在Excel中就是指Excel应用本身。因此,通常在代码中可以省略前面的Application限定,直接书写Intersect。例如我们在本文的示例代码中均省略了前面的Application。
必须指定至少两个Range对象作为其参数。
其返回值为Range对象。
我们来看看一些例子,进一步了解Intersect方法及其应用。
示例:判断两个单元格区域是否有重合
下面的例子用来判断一个区域是否包含另一个区域,即一个区域是另一个区域的子区域。代码如下:
Sub testIntersect2()
Dim rng1 As Range, rng2 As Range
Dim rng As Range
‘设置要测试的两个区域
Set rng1 = Range(“A1:D9”)
Set rng2 = Range(“A1:E11”)
‘获取两个区域相重合的区域并存储在变量中
Set rng = Intersect(rng1, rng2)
‘判断两个区域是否存在重合的区域
If Not rng Is Nothing Then
‘判断两个区域之间的包含关系
If rng.Address = rng1.Address Then
MsgBox rng2.Address & “包含”& rng1.Address
Else
MsgBox rng1.Address & “包含”& rng2.Address
End If
Else
MsgBox rng1.Address & “和” &rng2.Address & “区域无重叠.”
End If
End Sub
下图为不同区域的测试结果。(目前,我们还没有学习到与用户交互,所以采用“硬编码”的形式直接设置两个区域rng1和rng2。)
示例:用VBA实现保护单元格功能
下面是一个示例。结合运用Union方法和Intersect方法,禁止用户选择工作表中B1:B5和C6:C10这两块单元格区域,这样就可以防止用户修改这两块区域中的数据。代码如下:
Private SubWorksheet_SelectionChange(ByVal Target As Range)
Dim rngForbidden As Range
‘设置禁止操作的单元格区域
Set rngForbidden =Union(Range(“B1:B5”), Range(“C6:C10”))
‘如果所选择的单元格没有处于禁止操作的单元格区域中,则退出程序
If Intersect(Target, rngForbidden) IsNothing Then Exit Sub
‘选择A1并发出警告
Range(“A1”).Select
MsgBox “不能选择” &rngForbidden.Address & “中的单元格.”, vbCritical
End Sub
每当用户在与包含该事件过程的模块相关联的工作表中选择单元格区域时,就会触发工作表的Worksheet_SelectionChange事件过程。代码中,首先使用Union方法定义了由两个非连续单元格区域组成的禁止操作的区域,然后使用Intersect方法检查所选择的区域与禁止操作的区域是否有重合,并作为If语句的判断条件,如果没有重合则退出事件过程,用户正常操作,并不会感觉到什么;如果有重合,则光标定位到单元格A1并给出一条警告消息。
注:简单地说,工作表事件就是用户操作工作表时,工作表做出的相应响应。关于工作表事件将在以后详细介绍。