Excel精英培训网

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

[已解决]VBA中BeforeRightClick事件和SelectionChange出现冲突,如何解决

[复制链接]
发表于 2014-5-14 11:14 | 显示全部楼层 |阅读模式
本帖最后由 蝶·舞 于 2014-5-14 12:13 编辑

我在一个工作中中,既用SelectionChange事件,又用到BeforeRightClick事件,现在当我在单元格右击时,自动先执行SelectionChange事件,如下面的代码
  1. Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  2.     ActiveCell = 100
  3. End Sub
  4. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  5.     MsgBox "test"
  6. End Sub
复制代码
当我在某一单元格右击时,先出击对话框”test“,确定后,再在当前单元格内输入100,应该如何解决这种现象?
我的要求:左击时出现msgbox信息,右击时当前单元格赋值100

最佳答案
2014-5-14 11:46
SelectionChange事件是改变单元格触发的事件,本来如果光标在A1单元格,只要离开A1单元格,就会触发,把SelectionChange事件改成BeforeDoubleClick试试
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-5-14 11:46 | 显示全部楼层    本楼为最佳答案   
SelectionChange事件是改变单元格触发的事件,本来如果光标在A1单元格,只要离开A1单元格,就会触发,把SelectionChange事件改成BeforeDoubleClick试试
回复

使用道具 举报

发表于 2014-5-14 11:49 | 显示全部楼层
这样试试

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Application.EnableEvents = True
    ActiveCell = 100
    Application.EnableEvents = False
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  
    Application.EnableEvents = True
      MsgBox "test"
    Application.EnableEvents = False
End Sub
回复

使用道具 举报

发表于 2014-5-14 11:53 | 显示全部楼层
本帖最后由 FnG 于 2014-5-14 11:58 编辑


第一次可以,后来不行了
回复

使用道具 举报

 楼主| 发表于 2014-5-14 12:06 | 显示全部楼层
3楼的方法我试过,不能一劳永逸
回复

使用道具 举报

发表于 2014-5-14 12:11 | 显示全部楼层
这个不好求全。
如果是在新的单元格右键,肯定会触发两个事件。
回复

使用道具 举报

匿名  发表于 2015-4-5 19:10
“完美解决Worksheet_SelectionChange和Worksheet_BeforeRightClick两个事件触发冲突问题”
如果单击鼠标右键,只要更换了单元格就肯定会先触发Worksheet_SelectionChange事件,然后再触发Worksheet_BeforeRightClick事件,要想单击鼠标右键只触发Worksheet_BeforeRightClick事件,解决办法如下:
在Worksheet_SelectionChange事件中添加判断代码,判断如果单击了鼠标右键就跳过执行Worksheet_SelectionChange代码,关键是要解决如何判断单击的是鼠标右键问题,代码如下:

Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Cancel = 1’关闭excel自定义的右键功能,否则单击鼠标右键时会弹出系统自定义的快捷菜单
……’此处填写自己想编写的右键事件代码
……
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim keys(0 To 255) As Byte
GetKeyboardState keys(0)
If keys(2)<128 then’此处判断,如果单击的不是右键就执行更换单元格事件代码
’说明:鼠标右键由key(2)记录,单击鼠标右键后,key(2)会在128和129之间变化,点击的是其它键时,key(2)=0
……’此处填写自己想编写的更换单元格事件代码
……
End if
End Sub
回复

使用道具

匿名  发表于 2015-4-5 19:23
“完美解决VBA的SelectionChange和BeforeRightClick两个事件触发冲突问题”
如果单击鼠标右键,只要更换了单元格就肯定会先触发Worksheet_SelectionChange事件,然后再触发Worksheet_BeforeRightClick事件,要想单击鼠标右键只触发Worksheet_BeforeRightClick事件,解决办法如下:
在Worksheet_SelectionChange事件中添加判断代码,判断如果单击了鼠标右键就跳过执行Worksheet_SelectionChange代码,关键是要解决如何判断单击的是鼠标右键问题,代码如下:

Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Cancel = 1’关闭excel自定义的右键功能,否则单击鼠标右键时会弹出系统自定义的快捷菜单
……’此处填写自己想编写的右键事件代码
……
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim keys(0 To 255) As Byte
GetKeyboardState keys(0)
If keys(2)<128 then’此处判断,如果单击的不是右键就执行更换单元格事件代码
’说明:鼠标右键由key(2)记录,单击鼠标右键后,key(2)会在128和129之间变化,点击的是其它键时,key(2)=0
……’此处填写自己想编写的更换单元格事件代码
……
End if
End Sub
回复

使用道具

发表于 2015-12-23 21:35 | 显示全部楼层
SelectionChange与BeforeRightClick与BeforeDoubleClick
回复

使用道具 举报

发表于 2015-12-23 21:41 | 显示全部楼层
SelectionChange与BeforeRightClick与BeforeDoubleClick之间的冲突怎么解决
如果是左单击就只触发SelectionChange事件,如果是右单击就只触发BeforeRightClick,如果是双击就只触发BeforeDoubleClick事件
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-31 09:39 , Processed in 0.256229 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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