Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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中运行GetAsyncKeyState代码而不必打开对话框?_Excel_Vba_Keyboard - Fatal编程技术网

Excel 如何在VBA中运行GetAsyncKeyState代码而不必打开对话框?

Excel 如何在VBA中运行GetAsyncKeyState代码而不必打开对话框?,excel,vba,keyboard,Excel,Vba,Keyboard,我正在尝试创建一个宏,该宏使用快捷键CTRL+SHIFT+H,跟随单元格的内部超链接子地址到达工作簿中的目标。这很简单,但是我希望用户能够在按住CTRL+SHIFT键的同时再次按下“H”键,跳回起始单元格 只有在用户到达目标单元格后引入一个MsgBox,我才能使宏正常工作。我希望能够删除MsgBox代码,这样只要按住CTRL+SHIFT键,用户就可以通过按“H”键从起始单元格和目标单元格来回跳转 子组件与Windows API交互之前的代码,是检索密钥状态所必需的 可能代码运行速度太快,以至于在

我正在尝试创建一个宏,该宏使用快捷键CTRL+SHIFT+H,跟随单元格的内部超链接子地址到达工作簿中的目标。这很简单,但是我希望用户能够在按住CTRL+SHIFT键的同时再次按下“H”键,跳回起始单元格

只有在用户到达目标单元格后引入一个MsgBox,我才能使宏正常工作。我希望能够删除MsgBox代码,这样只要按住CTRL+SHIFT键,用户就可以通过按“H”键从起始单元格和目标单元格来回跳转

子组件与Windows API交互之前的代码,是检索密钥状态所必需的

可能代码运行速度太快,以至于在没有MsgBox使其暂停的情况下,行CBool(GetAsyncKeyState(VK_H))返回true,因为第一次按H键启动宏(而不是第二次)

您需要在单元格上创建指向文档中某个位置的内部超链接,以测试宏

非常感谢您一如既往的帮助

    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.选择
如果结束
端接头