如何获取用户右击的Excel单元格位置
Excel VBA提供了Worksheet_BeforeRightClick
事件,用户在Excel界面中,工作表窗口中在任意单元格上右击,在显示右键快捷菜单之前,将激活此事件。在工作表模块中,增加如下代码。
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)MsgBox "用户右击单元格为:" & Target.Address
End Sub
右击B3单元格,将显示如下图所示的消息框。
如果活动工作表中选中区域并非单个单元格,那么用户右击选中区域中的任意单元格时,上述代码的结果如下图所示。此时参数Target
为选中区域(即Selection对象),不再是右击的单元格。
为了兼容这个应用场景,就需要借助API。
#If VBA7 ThenPrivate Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
#ElsePrivate Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
#End If
Private Type POINTAPIX As LongY As Long
End TypePrivate Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)Dim lppt As POINTAPI, res As Long, c As Rangeres = GetCursorPos(lppt)Set c = ActiveWindow.RangeFromPoint(lppt.X, lppt.Y)MsgBox "选中区域为:" & Target.Address & vbCrLf & _"用户右击单元格为:" & c.Address
End Sub
【代码解析】
第1~5行代码声明Windows API,代码中使用了条件编译语句兼容32位和64位系统。
第6-9行代码为自定义数据类型。
第11~17行代码为工作表事件代码。
第13行代码调用API获取数据的屏幕位置。
第14行代码调用RangeFromPoint
函数获取指定位置的单元格对象。
第15~16行代码显示提示消息框。
运行结果如下图所示。