首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >类模块应用示例:捕捉鼠标单击的单元格位置

类模块应用示例:捕捉鼠标单击的单元格位置

作者头像
fanjy
发布2023-09-21 19:40:11
发布2023-09-21 19:40:11
63100
代码可运行
举报
文章被收录于专栏:完美Excel完美Excel
运行总次数:0
代码可运行

标签:VBA,类模块

如下图1所示,单击工作簿中任意工作表单元格时,会弹出一个消息框,显示鼠标单击的单元格地址。

图1

在VBE中,插入一个类模块,将其重命名为“C_CellClickEvent”,并输入下面的代码:

代码语言:javascript
代码运行次数:0
运行
复制
Private WithEvents CmBrasEvents As CommandBars
Private WithEvents wbEvents As Workbook
Event CellClick(ByVal Target As Range)
Private Type POINTAPI
 x As Long
 Y As Long
End Type
Private Type KeyboardBytes
 kbByte(0 To 255) As Byte
End Type
#If VBA7 Then
 Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
 Private Declare PtrSafe Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
 Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
 Private Declare PtrSafe Function GetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long
 Private Declare PtrSafe Function SetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long
#Else
 Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
 Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
 Private Declare Function GetActiveWindow Lib "user32" () As Long
 Private Declare Function GetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long
 Private Declare Function SetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long
#End If
Private kbArray As KeyboardBytes
Private oPrevSelection As Range
Private Sub Class_Initialize()
 Set CmBrasEvents = Application.CommandBars
 Set wbEvents = ThisWorkbook
 GetKeyboardState kbArray
 kbArray.kbByte(vbKeyLButton) = 1
 SetKeyboardState kbArray
End Sub
Private Sub Class_Terminate()
 Set CmBrasEvents = Nothing
 Set wbEvents = Nothing
End Sub
Private Sub CmBrasEvents_OnUpdate()
 Dim tpt As POINTAPI
 
 On Error Resume Next
 GetKeyboardState kbArray
 If GetActiveWindow <> Application.hwnd Then Exit Sub
 GetCursorPos tpt
 If GetKeyState(vbKeyLButton) = 1 Then
   If TypeName(ActiveWindow.RangeFromPoint(tpt.x, tpt.Y)) = "Range" Then
     If oPrevSelection.Address = ActiveWindow.RangeFromPoint(tpt.x, tpt.Y).Address Then
       RaiseEvent CellClick(Selection)
     End If
   End If
 End If
 kbArray.kbByte(vbKeyLButton) = 0
 SetKeyboardState kbArray
End Sub
Private Sub wbEvents_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
 On Error Resume Next
 Set oPrevSelection = Target
End Sub

在VBE中,双击工程资源管理器中的“ThisWorkbook”,打开其代码模块,并输入下面的代码:

代码语言:javascript
代码运行次数:0
运行
复制
Private WithEvents Wb As C_CellClickEvent
Private Sub Workbook_Open()
 Set Wb = New C_CellClickEvent
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
 Set Wb = Nothing
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
 If Wb Is Nothing Then
   Set Wb = New C_CellClickEvent
 End If
End Sub
'单元格Click事件处理
Private Sub Wb_CellClick(ByVal Target As Range)
 With Target
   .Font.Bold = True
   .Font.Name = IIf(.Value = "", "Wingdings", "calibri")
   .Value = IIf(.Value = "", "?", "")
   MsgBox "你单击的单元格: " & vbLf & .Address(External:=True), vbInformation
 End With
End Sub

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-15 05:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档