Excel VBA求助,当range中的任意一个值有变化时即启动宏?
1.当range为[A1:U50]任意一值有变化即启动宏Macros1?最主要的是回答第一个问题,相对也简单些,如果可以还包括下列一些延伸的启发条件:2.如果这一区域为整...
1. 当range为[A1:U50]任意一值有变化即启动宏Macros1?
最主要的是回答第一个问题,相对也简单些,如果可以还包括下列一些延伸的启发条件:
2. 如果这一区域为整个sheet或者整个workbook?
3. 如果是打开XX1.xlsx即运行宏?
4. 更复杂的条件:有两个不同的文件,将XX1.xlsx中的sheet2与XX2.xlsx中的sheet3进行对比,如果两个sheet里[A1:U50]区域有任意一个值(可能是文本也可能是数值)不相等,则允许宏Macros1
问题4可能要用到条件判断语句比较复杂,但是问题1-3尽可能参照下面的双击启动宏的方法,即如果能用类似的命令就能实现最好了,如果不能也可以用判断语句
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
Call Macros1
End Sub
问的问题很泛,非常感谢! 展开
最主要的是回答第一个问题,相对也简单些,如果可以还包括下列一些延伸的启发条件:
2. 如果这一区域为整个sheet或者整个workbook?
3. 如果是打开XX1.xlsx即运行宏?
4. 更复杂的条件:有两个不同的文件,将XX1.xlsx中的sheet2与XX2.xlsx中的sheet3进行对比,如果两个sheet里[A1:U50]区域有任意一个值(可能是文本也可能是数值)不相等,则允许宏Macros1
问题4可能要用到条件判断语句比较复杂,但是问题1-3尽可能参照下面的双击启动宏的方法,即如果能用类似的命令就能实现最好了,如果不能也可以用判断语句
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
Call Macros1
End Sub
问的问题很泛,非常感谢! 展开
2个回答
展开全部
我建议你要调整一下你的程序逻辑
分析一下
判断任意单元格变动 一定是用到 change事件
也就是说即使在相关的表中输入一个字符都会引发程序的执行
你的四个条件通过编程是有可能实现的,但是代码量会较大,程序执行需要时间
可以设想,程序写完后,只要用一下表,就会执行半天,反应很慢,用户无法忍受。
分析一下
判断任意单元格变动 一定是用到 change事件
也就是说即使在相关的表中输入一个字符都会引发程序的执行
你的四个条件通过编程是有可能实现的,但是代码量会较大,程序执行需要时间
可以设想,程序写完后,只要用一下表,就会执行半天,反应很慢,用户无法忍受。
更多追问追答
追问
谢谢,如果[A1:U50]区域套用了变量的确会这样,如果只是一个静态的数据库(仅少部分更改),不会出现你所说的问题
追答
你没有理解我说的
你是要在 事件中判断 具体是哪一部分在操作
和这一个区域变没有还没有关系,就是第一步你得先判断目前EXCEL中用户在操作的区域,就很跟费时间,第二步才是当用户操作区域你你的指定区域,再判断是什么数据变化了
还是不要这么做吧
展开全部
1、代码如下:
Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect([A1:U50], Target) Is Nothing Then Exit Sub
Call Macros1
End Sub
2、如果是整个工作表,上述代码取消条件那句即可。如果是整个工作簿,则为工作簿的事件,第一行为:Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
3、如果打开文件就运行宏,也是工作簿事件:Private Sub Workbook_Open()
4、要麻烦一些,将两个区域的数据存入数组中进行比较要快一些
Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect([A1:U50], Target) Is Nothing Then Exit Sub
Call Macros1
End Sub
2、如果是整个工作表,上述代码取消条件那句即可。如果是整个工作簿,则为工作簿的事件,第一行为:Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
3、如果打开文件就运行宏,也是工作簿事件:Private Sub Workbook_Open()
4、要麻烦一些,将两个区域的数据存入数组中进行比较要快一些
更多追问追答
追问
大神的每一次回答都很经典。顺带套用了你之前的代码Sheet3.Range("A:A").Find(Ra.Value, , , 1).Resize(, 11).Copy Ra**复制1-11列,发现会无限执行至死机,原因是copy了A列造成A列改变。我尝试用VLOOKUP代替上述代码以避免A列被修改但不够智能,每一列都需要写一个函数。怎么实现只copy第2列-第11列,哪个参数是控制起始列的?谢谢
追答
你运行的宏如果对[A1:U50]区间单元格数据有更改,就会形成循环事件,所以在调用此类代码之前先要停止事件响应,结束时开启事件响应,这样就只执行一次代码。
Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect([A1:U50], Target) Is Nothing Then Exit Sub
Application.EnableEvents = False
Call Macros1
Application.EnableEvents = True
End Sub
来自:求助得到的回答
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询