Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA:单击单元格时确定鼠标位置_Excel_Vba_Event Handling - Fatal编程技术网

Excel VBA:单击单元格时确定鼠标位置

Excel VBA:单击单元格时确定鼠标位置,excel,vba,event-handling,Excel,Vba,Event Handling,我试图做的是编写一个Excel SelectionChange处理程序,这样当用户用鼠标选择一个单元格时,我可以(a)知道是鼠标而不是键盘,(b)找出单元格中发生鼠标点击的位置。(我将排除用户选择多个单元格的情况) 假设一个单元格中有几行文本。这个想法是根据单击单元格的哪个部分来执行不同的操作。(对于我来说,有多个单元格是行不通的。) [更新:我认为(b)是没有希望的,于是放弃了它。但我仍然想知道,当鼠标左键点击时,选择发生了变化。] 谢谢你的建议 编辑:我找到了以下资源,这些资源使我找到了一

我试图做的是编写一个Excel SelectionChange处理程序,这样当用户用鼠标选择一个单元格时,我可以(a)知道是鼠标而不是键盘,(b)找出单元格中发生鼠标点击的位置。(我将排除用户选择多个单元格的情况)

假设一个单元格中有几行文本。这个想法是根据单击单元格的哪个部分来执行不同的操作。(对于我来说,有多个单元格是行不通的。)

[更新:我认为(b)是没有希望的,于是放弃了它。但我仍然想知道,当鼠标左键点击时,选择发生了变化。]

谢谢你的建议


编辑:我找到了以下资源,这些资源使我找到了一个似乎可行的解决方案。我还包括解决方案的代码

资料来源:

EngJon注意到他们的解决方案存在一个问题,因为它拾取了鼠标点击 源自其他地方。例如,单击功能区后,使用箭头键更改选择仍将在选择更改处理程序中显示左键单击

我对此进行了一段时间的研究,并决定(尽管我可能错了)
GetAsyncKeyState()
对最近的鼠标单击和最近的按键操作返回True或False。它处理组合键按下(如SHIFT-TAB键)的方式是,对SHIFT键和TAB键都返回True。[将0视为假,将所有非零值视为真。]

(您会注意到,keycode常量对于back tab(即SHIFT-tab)等组合没有任何值。类似地,尽管我没有测试它,但我敢打赌,通过测试
GetAsyncKeyState(vbKeyShift)和GetAsyncKeyState(vbKeyRButton)
,您会发现SHIFT-RIGHTCLICK等组合)

所以,在一个模块(例如,模块1)中,我把

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    'Check whether the left mouse key was recently pressed.
    
    Select Case True

     Case GetAsyncKeyState(vbKeyUp) Or GetAsyncKeyState(vbKeyRight) _
            Or GetAsyncKeyState(vbKeyDown) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyTab) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyHome) Or GetAsyncKeyState(vbKeyReturn)

        'One of the cell selection keys was pressed, so do nothing.
        ' For some reason, PageUp, PageDown, and End don't seem
        ' to be needed here.
     
     Case GetAsyncKeyState(vbKeyLButton)

        'Left mouse key was pressed
        
        <your code here>
     
    End Select

End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    'Check whether the left mouse key was recently pressed.
    
    Select Case True

     Case GetAsyncKeyState(vbKeyUp) Or GetAsyncKeyState(vbKeyRight) _
            Or GetAsyncKeyState(vbKeyDown) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyTab) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyHome) Or GetAsyncKeyState(vbKeyReturn)

        'One of the cell selection keys was pressed, so do nothing.
        ' For some reason, PageUp, PageDown, and End don't seem
        ' to be needed here.
     
     Case GetAsyncKeyState(vbKeyLButton)

        'Left mouse key was pressed
        
        <your code here>
     
    End Select

End Sub
选项显式

#If VBA7 Then
    'declare virtual key event listener
    Public Declare PtrSafe Function GetAsyncKeyState Lib "user32" _
            (ByVal vKey As Long) As Integer
#Else
    'declare virtual key event listener
    Public Declare Function GetAsyncKeyState Lib "user32" _
            (ByVal vKey As Long) As Integer
#End If
#If VBA7 Then
    'declare virtual key event listener
    Public Declare PtrSafe Function GetAsyncKeyState Lib "user32" _
            (ByVal vKey As Long) As Integer
#Else
    'declare virtual key event listener
    Public Declare Function GetAsyncKeyState Lib "user32" _
            (ByVal vKey As Long) As Integer
#End If
在我想要捕捉击键和鼠标点击的工作表的代码中,我将

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    'Check whether the left mouse key was recently pressed.
    
    Select Case True

     Case GetAsyncKeyState(vbKeyUp) Or GetAsyncKeyState(vbKeyRight) _
            Or GetAsyncKeyState(vbKeyDown) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyTab) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyHome) Or GetAsyncKeyState(vbKeyReturn)

        'One of the cell selection keys was pressed, so do nothing.
        ' For some reason, PageUp, PageDown, and End don't seem
        ' to be needed here.
     
     Case GetAsyncKeyState(vbKeyLButton)

        'Left mouse key was pressed
        
        <your code here>
     
    End Select

End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    'Check whether the left mouse key was recently pressed.
    
    Select Case True

     Case GetAsyncKeyState(vbKeyUp) Or GetAsyncKeyState(vbKeyRight) _
            Or GetAsyncKeyState(vbKeyDown) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyTab) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyHome) Or GetAsyncKeyState(vbKeyReturn)

        'One of the cell selection keys was pressed, so do nothing.
        ' For some reason, PageUp, PageDown, and End don't seem
        ' to be needed here.
     
     Case GetAsyncKeyState(vbKeyLButton)

        'Left mouse key was pressed
        
        <your code here>
     
    End Select

End Sub
Private子工作表\u selection更改(ByVal目标作为范围)
'检查最近是否按下了鼠标左键。
选择Case True
案例GetAsyncKeyState(vbKeyUp)或GetAsyncKeyState(vbKeyRight)_
或GetAsyncKeyState(vbKeyDown)或GetAsyncKeyState(vbKeyLeft)_
或GetAsyncKeyState(vbKeyTab)或GetAsyncKeyState(vbKeyLeft)_
或GetAsyncKeyState(vbKeyHome)或GetAsyncKeyState(vbKeyReturn)
'其中一个单元格选择键已按下,因此不执行任何操作。
“由于某种原因,PageUp、PageDown和End看起来不一样
“在这里是需要的。
案例GetAsyncKeyState(vbKeyLButton)
'按下鼠标左键
结束选择
端接头
你可能会问为什么会有第一个案例陈述。正如EngJon所说,“如果你做的事情是通过点击完成的(例如MsgBox),那么下一次用箭头键更改选择也会触发事件并重新执行你的内容。”我发现在检查鼠标点击之前检查击键可以解决这个问题


对我来说,到目前为止,这已经完美地在我在
部分检测到的单元格上拾取单独的左键点击。

[也包括在我对上述原始问题的编辑中。]

我发现以下资源使我找到了一个似乎有效的解决方案。我还包括解决方案的代码

资料来源:

EngJon注意到他们的解决方案存在一个问题,因为它拾取了鼠标点击 源自其他地方。例如,单击功能区后,使用箭头键更改选择仍将在选择更改处理程序中显示左键单击

我对此进行了一段时间的研究,并决定(尽管我可能错了)
GetAsyncKeyState()
对最近的鼠标单击和最近的按键操作返回True或False。它处理组合键按下(如SHIFT-TAB键)的方式是,对SHIFT键和TAB键都返回True。[将0视为假,将所有非零值视为真。]

(您会注意到,keycode常量对于back tab(即SHIFT-tab)等组合没有任何值。类似地,尽管我没有测试它,但我敢打赌,通过测试
GetAsyncKeyState(vbKeyShift)和GetAsyncKeyState(vbKeyRButton)
,您会发现SHIFT-RIGHTCLICK等组合)

所以,在一个模块(例如,模块1)中,我把

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    'Check whether the left mouse key was recently pressed.
    
    Select Case True

     Case GetAsyncKeyState(vbKeyUp) Or GetAsyncKeyState(vbKeyRight) _
            Or GetAsyncKeyState(vbKeyDown) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyTab) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyHome) Or GetAsyncKeyState(vbKeyReturn)

        'One of the cell selection keys was pressed, so do nothing.
        ' For some reason, PageUp, PageDown, and End don't seem
        ' to be needed here.
     
     Case GetAsyncKeyState(vbKeyLButton)

        'Left mouse key was pressed
        
        <your code here>
     
    End Select

End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    'Check whether the left mouse key was recently pressed.
    
    Select Case True

     Case GetAsyncKeyState(vbKeyUp) Or GetAsyncKeyState(vbKeyRight) _
            Or GetAsyncKeyState(vbKeyDown) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyTab) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyHome) Or GetAsyncKeyState(vbKeyReturn)

        'One of the cell selection keys was pressed, so do nothing.
        ' For some reason, PageUp, PageDown, and End don't seem
        ' to be needed here.
     
     Case GetAsyncKeyState(vbKeyLButton)

        'Left mouse key was pressed
        
        <your code here>
     
    End Select

End Sub
选项显式

#If VBA7 Then
    'declare virtual key event listener
    Public Declare PtrSafe Function GetAsyncKeyState Lib "user32" _
            (ByVal vKey As Long) As Integer
#Else
    'declare virtual key event listener
    Public Declare Function GetAsyncKeyState Lib "user32" _
            (ByVal vKey As Long) As Integer
#End If
#If VBA7 Then
    'declare virtual key event listener
    Public Declare PtrSafe Function GetAsyncKeyState Lib "user32" _
            (ByVal vKey As Long) As Integer
#Else
    'declare virtual key event listener
    Public Declare Function GetAsyncKeyState Lib "user32" _
            (ByVal vKey As Long) As Integer
#End If
在我想要捕捉击键和鼠标点击的工作表的代码中,我将

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    'Check whether the left mouse key was recently pressed.
    
    Select Case True

     Case GetAsyncKeyState(vbKeyUp) Or GetAsyncKeyState(vbKeyRight) _
            Or GetAsyncKeyState(vbKeyDown) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyTab) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyHome) Or GetAsyncKeyState(vbKeyReturn)

        'One of the cell selection keys was pressed, so do nothing.
        ' For some reason, PageUp, PageDown, and End don't seem
        ' to be needed here.
     
     Case GetAsyncKeyState(vbKeyLButton)

        'Left mouse key was pressed
        
        <your code here>
     
    End Select

End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    'Check whether the left mouse key was recently pressed.
    
    Select Case True

     Case GetAsyncKeyState(vbKeyUp) Or GetAsyncKeyState(vbKeyRight) _
            Or GetAsyncKeyState(vbKeyDown) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyTab) Or GetAsyncKeyState(vbKeyLeft) _
            Or GetAsyncKeyState(vbKeyHome) Or GetAsyncKeyState(vbKeyReturn)

        'One of the cell selection keys was pressed, so do nothing.
        ' For some reason, PageUp, PageDown, and End don't seem
        ' to be needed here.
     
     Case GetAsyncKeyState(vbKeyLButton)

        'Left mouse key was pressed
        
        <your code here>
     
    End Select

End Sub
Private子工作表\u selection更改(ByVal目标作为范围)
'检查最近是否按下了鼠标左键。
选择Case True
案例GetAsyncKeyState(vbKeyUp)或GetAsyncKeyState(vbKeyRight)_
或GetAsyncKeyState(vbKeyDown)或GetAsyncKeyState(vbKeyLeft)_
或GetAsyncKeyState(vbKeyTab)或GetAsyncKeyState(vbKeyLeft)_
或GetAsyncKeyState(vbKeyHome)或GetAsyncKeyState(vbKeyReturn)
'其中一个单元格选择键已按下,因此不执行任何操作。
“由于某种原因,PageUp、PageDown和End看起来不一样
“在这里是需要的。
案例GetAsyncKeyState(vbKeyLButton)
'按下鼠标左键
结束选择
端接头
你可能会问为什么会有第一个案例陈述。正如EngJon所说,“如果你做的事情是通过点击完成的(例如MsgBox),那么下一次用箭头键更改选择也会触发事件并重新执行你的内容。”我发现在检查鼠标点击之前检查击键可以解决这个问题

对我来说,到目前为止,这已经完美地在我在
部分检测到的一个单元格上拾取单独的左键点击


更新:见我的新问题。似乎有b