如何获取用户右击的Excel单元格位置

Excel VBA提供了Worksheet_BeforeRightClick事件,用户在Excel界面中,工作表窗口中在任意单元格上右击,在显示右键快捷菜单之前,将激活此事件。在工作表模块中,增加如下代码。

vb 复制代码
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    MsgBox "用户右击单元格为:" & Target.Address
End Sub

右击B3单元格,将显示如下图所示的消息框。

如果活动工作表中选中区域并非单个单元格,那么用户右击选中区域中的任意单元格时,上述代码的结果如下图所示。此时参数Target为选中区域(即Selection对象),不再是右击的单元格。

为了兼容这个应用场景,就需要借助API。

vb 复制代码
#If VBA7 Then
    Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
#Else
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
#End If
Private Type POINTAPI
    X As Long
    Y As Long
End Type

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Dim lppt As POINTAPI, res As Long, c As Range
    res = 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行代码显示提示消息框。

运行结果如下图所示。

相关推荐
cyt涛1 年前
Apache POI—读写Office格式文件
apache·excel·poi·office·单元格·xssfworkbook·sxssfworkbook
许野平1 年前
QT:QTableWidget 设置单元格边距
单元格·qtablewidget·边距
放羊的牧码2 年前
WPS - 表格虚线变成实线解决方案(Office 同上)
wps·表格·格式·office·单元格·虚线·实线
globalcoding2 年前
excel 拼接字符 单元格
excel·拼接·单元格·字符