Excel 如何在VBA中运行GetAsyncKeyState代码而不必打开对话框?
我正在尝试创建一个宏,该宏使用快捷键CTRL+SHIFT+H,跟随单元格的内部超链接子地址到达工作簿中的目标。这很简单,但是我希望用户能够在按住CTRL+SHIFT键的同时再次按下“H”键,跳回起始单元格 只有在用户到达目标单元格后引入一个MsgBox,我才能使宏正常工作。我希望能够删除MsgBox代码,这样只要按住CTRL+SHIFT键,用户就可以通过按“H”键从起始单元格和目标单元格来回跳转 子组件与Windows API交互之前的代码,是检索密钥状态所必需的 可能代码运行速度太快,以至于在没有MsgBox使其暂停的情况下,行CBool(GetAsyncKeyState(VK_H))返回true,因为第一次按H键启动宏(而不是第二次) 您需要在单元格上创建指向文档中某个位置的内部超链接,以测试宏 非常感谢您一如既往的帮助Excel 如何在VBA中运行GetAsyncKeyState代码而不必打开对话框?,excel,vba,keyboard,Excel,Vba,Keyboard,我正在尝试创建一个宏,该宏使用快捷键CTRL+SHIFT+H,跟随单元格的内部超链接子地址到达工作簿中的目标。这很简单,但是我希望用户能够在按住CTRL+SHIFT键的同时再次按下“H”键,跳回起始单元格 只有在用户到达目标单元格后引入一个MsgBox,我才能使宏正常工作。我希望能够删除MsgBox代码,这样只要按住CTRL+SHIFT键,用户就可以通过按“H”键从起始单元格和目标单元格来回跳转 子组件与Windows API交互之前的代码,是检索密钥状态所必需的 可能代码运行速度太快,以至于在
Private Declare PtrSafe Function GetAsyncKeyState Lib "user32" _
(ByVal vKey As Long) As Integer
Private Declare PtrSafe Function GetKeyState Lib "user32" ( _
ByVal vKey As Long) As Integer
Private Const VK_H = &H48 'H key
Private Const VK_SHIFT = &H10 'SHIFT key
Private Const VK_CONTROL = &H11 'CTRL key
Private Const keyIsDown As Integer = &HFF80 ' decimal -128
Public Function IsShiftKeyDown() As Boolean
Dim keyStatus As Long
'Retrieve key status (through Windows API and C++ including C++ function GetKeyState)
keyStatus = GetKeyState(VK_SHIFT) And keyIsDown
IsShiftKeyDown = CBool(keyStatus)
End Function
Public Function IsCtrlKeyDown() As Boolean
Dim keyStatus As Long
'Retrieve key status (through Windows API and C++ including C++ function GetKeyState)
keyStatus = GetKeyState(VK_CONTROL) And keyIsDown
IsCtrlKeyDown = CBool(keyStatus)
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub OpenHyperlink()
Dim hypLinkCell As Range
Dim startWs As Worksheet
Set startWs = ActiveWorkbook.ActiveSheet
Set hypLinkCell = Selection.Cells(1, 1)
If hypLinkCell.Hyperlinks.Count = 0 Then
Exit Sub
ElseIf hypLinkCell.Hyperlinks(1).Address <> "" Then
Exit Sub
Else
hypLinkCell.Hyperlinks(1).Follow
End If
MsgBox "Press H to return to hyperlink cell.", vbInformation
If IsShiftKeyDown = True And IsCtrlKeyDown = True Then
Do Until CBool(GetAsyncKeyState(VK_H)) = True Or _
CBool(GetAsyncKeyState(VK_SHIFT)) = False Or _
CBool(GetAsyncKeyState(VK_CONTROL)) = False
DoEvents
Loop
If IsShiftKeyDown = False Or IsCtrlKeyDown = False Then Exit Sub
startWs.Activate
hypLinkCell.Select
End If
End Sub
Private Declare PtrSafe函数GetAsyncKeyState库“user32”_
(ByVal vKey等长)作为整数
私有声明PtrSafe函数GetKeyState Lib“user32”(_
ByVal vKey(长度)为整数
私有常量VK_H=&H48'H密钥
私有常量VK_移位=&H10'移位键
Private Const VK_CONTROL=&H11'CTRL键
Private Const keyIsDown As Integer=&HFF80'十进制-128
公共函数IsShiftKeyDown()为布尔值
暗键状态与长键状态相同
检索关键状态(通过Windows API和C++,包括C++函数GEKEYSTATE)
keyStatus=GetKeyState(VK_移位)和keyIsDown
ISSHIFT KEYDOWN=CBool(键状态)
端函数
公共函数IsCtrlKeyDown()为布尔值
暗键状态与长键状态相同
检索关键状态(通过Windows API和C++,包括C++函数GEKEYSTATE)
keyStatus=GetKeyState(VK_控制)和keyIsDown
IsCtrlKeyDown=CBool(keyStatus)
端函数
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
子OpenHyperlink()
暗淡的单元格作为范围
将startWs变暗为工作表
设置startWs=ActiveWorkbook.ActiveSheet
设置hypLinkCell=Selection.Cells(1,1)
如果hypLinkCell.Hyperlinks.Count=0,则
出口接头
ElseIf hypLinkCell.Hyperlinks(1).地址“”然后
出口接头
其他的
hypLinkCell.超链接(1).跟随
如果结束
MsgBox“按H键返回超链接单元格”,vbInformation
如果IsShiftKeyDown=True和IsCtrlKeyDown=True,则
直到CBool(GetAsyncKeyState(VK_H))=True或_
CBool(GetAsyncKeyState(VK_SHIFT))=False或_
CBool(GetAsyncKeyState(VK_控件))=False
多芬特
环
如果IsShiftKeyDown=False或IsCtrlKeyDown=False,则退出Sub
开始,启动
hypLinkCell.选择
如果结束
端接头