Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 25401|回复: 17

[分享] Intersect方法的一个用途

[复制链接]
发表于 2011-4-23 16:23 | 显示全部楼层 |阅读模式
本帖最后由 wbzxz 于 2011-4-23 22:19 编辑

Intersect方法是application的一个方法,以下是帮助的说明
Application.Intersect 方法
返回一个 Range 对象,该对象表示两个或多个区域重叠的矩形区域。
语法
表达式.Intersect(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12, Arg13, Arg14, Arg15,
Arg16, Arg17, Arg18, Arg19, Arg20, Arg21, Arg22, Arg23, Arg24, Arg25, Arg26, Arg27, Arg28, Arg29, Arg30)

表达式   一个代表 Application 对象的变量。

参数说明:前两个参数必选,后面的参数都是可选。

当时学这个方法的时候,理解起来没有什么难度,但是一直不知道什么地方要用到这个方法,后来一次偶然机会,发现在事件求和的时候可以用到这个方法,仔细想想,好像兰版在哪里用过,记不清楚啦,嘿嘿。

很简单的一个用法,抛砖引玉,大家如果碰到类似问题,我想用这个方法应该是一个不错的解决方案。

代码介绍:
(1)下面这个例子主要是想实现在B列中数量发生变化的时候,合计自动发生变化。
(2)解决这个问题我想到了用change事件,也就是B列单元格内容变化的时候,就重新求一次和;
(3)由于B列单元格的变化有单个单元格值的改变,多个单元格值的同时改变,删除整行引起B列单元格变化,插入、赋值、剪切等情况都会引起B列单元格值的改变,该如何进行判断呢???
(4)在这个时候用Intersect方法应该最合适,用Intersect方法得到目标单元格Target与B列的交集,如果得到的交集不为空,那B列单元格肯定发生了变化,无论怎样,重新求和一次吧;如果为空,肯定没有发生变化,不用重新求和;
示意图.jpg

思路非常简单,大家看一下代码
  1. Option Explicit

  2. Private Sub Worksheet_Change(ByVal Target As Range)
  3.   Dim lSumRow As Long '定义一个变量存放合计这一行的行数
  4.   
  5.   If Not Application.Intersect(Columns("B"), Target) Is Nothing Then '这里就是关键所在,用Intersect方法进行判断
  6.     lSumRow = Cells.Find("合计").Row '通过find方法查找出"合计"所在行
  7.     Application.EnableEvents = False '禁用事件
  8.     Cells(lSumRow, 2) = Application.WorksheetFunction.Sum(Range("B2:B" & lSumRow - 1)) '用了WorksheetFunction对象的Sum方法,对B列合计以上部分求和
  9.     Application.EnableEvents = True '启用事件
  10.   End If
  11.   
  12. End Sub
复制代码

(1)这里的关键语句就是:
Not Application.Intersect(Columns("B"), Target) Is Nothing
这条语句返回true 或者 flase
只要Application.Intersect(Columns("B"), Target)有交集,不返回nothing,那么Not Application.Intersect(Columns("B"), Target) 必然是nothing,从而得到true,执行条件语句内容;

(2)Application.EnableEvents = False的说明:
因为给cells(lsumRow,2)赋值时,相当于B列的单元格发生了变化,那么必然重新激活change事件,这样就会引起死循环,所以此处禁用事件,也就是给cells(lsumRow,2)赋值时,任何事件都不会起作用;
(3)Application.EnableEvents = True,每次禁用时间后,记住要及时启用事件。


Intersect方法的一个用途.rar (8.94 KB, 下载次数: 153)

评分

参与人数 3 +32 收起 理由
baiexcel + 1 来学习
sxsfs + 1 很给力!
过儿 + 30 很好~~~~

查看全部评分

发表于 2011-4-23 16:29 | 显示全部楼层
没看明白:
Not Application.Intersect(Columns("B"), Target)
和Target.Column<>2
有啥区别?
回复

使用道具 举报

 楼主| 发表于 2011-4-23 16:39 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2011-4-23 16:43 | 显示全部楼层
本帖最后由 wbzxz 于 2011-4-23 16:50 编辑

回复 兰色幻想 的帖子

二者的区别在与Target.Column<>2
当目标区域不是B列的时候,会激活求和代码;而当目标区域仅仅是B列单元格时,不会激活求和的代码;


而not Application.Intersect(Columns("B"), Target) Is Nothing
当目标区域仅仅是B列单元格时,以及整行的删除、剪切、插入,引起的B列单元格的变化时,都会激发求和的代码,嘿嘿。


兰版,我解释的对不?
回复

使用道具 举报

 楼主| 发表于 2011-4-23 16:44 | 显示全部楼层
呵呵,兰版,您就不用看了吧,都是跟您学的,嘿嘿。
回复

使用道具 举报

发表于 2011-4-23 16:51 | 显示全部楼层
If Target.Column = 2 Then  这也可以达到效果啊
回复

使用道具 举报

 楼主| 发表于 2011-4-23 16:59 | 显示全部楼层
本帖最后由 wbzxz 于 2011-4-23 17:11 编辑

回复 兰色幻想 的帖子

不对吧,兰版,您删除一行试一试
If Target.Column = 2 Then

您要删除一行,B列内容肯定变化,您这个判断肯定不会引起求和代码的运行啊。

回复

使用道具 举报

发表于 2011-4-23 17:18 | 显示全部楼层
{:912:}明白了,你是说包括删除行的动作,嗯嗯,用这个方法,很好
回复

使用道具 举报

 楼主| 发表于 2011-4-23 17:26 | 显示全部楼层
嘿嘿,不好意思,兰版,帮别人解决问题的时候偶然想到的,没有把问题说清楚,让您费心啦,嘿嘿。

我记得您好像早就出过这方面的练习题,但想不起来是什么时候啦。

这个问题的麻烦就在于,有可能B列是被动变化,而不是主动变化的,所以用这个方法个人感觉比较合适。

因为碰到的问题少,其他的时候,确实很少用Intersect这个方法,怕自己都忘记了,写下来,将来备查,嘿嘿。
回复

使用道具 举报

发表于 2011-4-23 18:00 | 显示全部楼层
不错,最近学习很积极,要保持下去
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 06:32 , Processed in 0.438121 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表