我可以在 Excel VBA 中捕获并模拟 KeyDown 事件吗?

2023-12-20

阿伦·辛格(Arun Singh)对类似问题给出了很好的答案(编辑单元格时按下按键时是否会触发任何事件? https://stackoverflow.com/questions/11153995/is-there-any-event-that-fires-when-keys-are-pressed-when-editing-a-cell)。我想设置一个标志,以防止用户使用箭头键滚动时执行 Selection_Change 事件。


实际上这很容易。我正在演示它UP and DOWN箭头键。您可以添加更多内容,例如右/左/Tab/Enter等等...我已经评论了可以添加键的部分。

将其粘贴到工作表代码区域中

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If CancSelEvnt = False Then
        '
        '~~> Rest of the code for the Selection Change
        '
    Else
        '~~> Only for demostration purpose. Remove Msgbox later
        MsgBox "User pressed one of the navigation keys"

        CancSelEvnt = False
    End If
End Sub

将其粘贴到模块中

Option Explicit

'~~> We need this as this will help us in cancelling the
'~~> Selection chnage event
Public CancSelEvnt As Boolean

Private Type POINTAPI
    x As Long
    y As Long
End Type

Private Type MSG
    hwnd As Long
    Message As Long
    wParam As Long
    lParam As Long
    time As Long
    pt As POINTAPI
End Type

Private Declare Function WaitMessage Lib "user32" () As Long

Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" _
    (ByRef lpMsg As MSG, ByVal hwnd As Long, _
     ByVal wMsgFilterMin As Long, _
     ByVal wMsgFilterMax As Long, _
     ByVal wRemoveMsg As Long) As Long

Private Declare Function TranslateMessage Lib "user32" _
    (ByRef lpMsg As MSG) As Long

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
    (ByVal hwnd As Long, _
     ByVal wMsg As Long, _
     ByVal wParam As Long, _
     lParam As Any) As Long

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, _
     ByVal lpWindowName As String) As Long

Private Const WM_KEYDOWN As Long = &H100
Private Const PM_REMOVE  As Long = &H1
Private Const WM_CHAR    As Long = &H102
Private bExitLoop As Boolean

Sub StartKeyWatch()
    Dim msgMessage As MSG
    Dim bCancel As Boolean
    Dim iKeyCode As Integer
    Dim lXLhwnd As Long

    On Error GoTo errHandler:
    Application.EnableCancelKey = xlErrorHandler
    bExitLoop = False
    lXLhwnd = FindWindow("XLMAIN", Application.Caption)
    Do
        WaitMessage
        If PeekMessage _
            (msgMessage, lXLhwnd, WM_KEYDOWN, WM_KEYDOWN, PM_REMOVE) Then
            iKeyCode = msgMessage.wParam
            TranslateMessage msgMessage
            PeekMessage msgMessage, lXLhwnd, WM_CHAR, _
            WM_CHAR, PM_REMOVE
            If iKeyCode = vbKeyBack Then SendKeys "{BS}"
            If iKeyCode = vbKeyReturn Then SendKeys "{ENTER}"
            bCancel = False

            '
            '~~> This is the main part where we check what key is pressed
            '

            If iKeyCode = vbKeyDown Then   '<~~ Down
                SendKeys "{DOWN}"
                CancSelEvnt = True
            ElseIf iKeyCode = vbKeyUp Then '<~~ UP
                SendKeys "{UP}"
                CancSelEvnt = True
            '
            '~~> And so on for the rest of the navigation keys
            '
            Else
                CancSelEvnt = False
            End If

            If bCancel = False Then
                PostMessage _
                lXLhwnd, msgMessage.Message, msgMessage.wParam, 0
            End If
        End If
errHandler:
        DoEvents
    Loop Until bExitLoop
End Sub

Sub StopKeyWatch()
    bExitLoop = True
End Sub

这是您可能需要的东西;)

VBKey 代码列表

vbKeyLButton    Left Mouse Button
vbKeyRButton    Right Mouse Button
vnKeyCancel     Cancel Key
vbKeyMButton    Middle Mouse button
vbKeyBack       Back Space Key
vbKeyTab        Tab Key
vbKeyClear      Clear Key
vbKeyReturn     Enter Key
vbKeyShift      Shift Key
vbKeyControl    Ctrl Key
vbKeyMenu       Menu Key
vbKeyPause      Pause Key
vbKeyCapital    Caps Lock Key
vbKeyEscape     Escape Key
vbKeySpace      Spacebar Key
vbKeyPageUp     Page Up Key
vbKeyPageDown   Page Down Key
vbKeyEnd        End Key
vbKeyHome       Home Key
vbKeyLeft       Left Arrow Key
vbKeyUp         Up Arrow Key
vbKeyRight      Right Arrow Key
vbKeyDown       Down Arrow Key
vbKeySelect     Select Key
vbKeyPrint      Print Screen Key
vbKeyExecute    Execute Key
vbKeySnapshot   Snapshot Key
vbKeyInsert     Insert Key
vbKeyDelete     Delete Key
vbKeyHelp       Help Key
vbKeyNumlock    Delete Key

vbKeyA through vbKeyZ are the key code constants for the alphabet
vbKey0 through vbKey9 are the key code constants for numbers
vbKeyF1 through vbKeyF16 are the key code constants for the function keys
vbKeyNumpad0 through vbKeyNumpad9 are the key code constants for the numeric key pad

Math signs are:
vbKeyMultiply      -  Multiplication Sign (*)
vbKeyAdd             - Addition Sign (+)
vbKeySubtract     - Minus Sign (-)
vbKeyDecimal    - Decimal Point (.)
vbKeyDivide        - Division sign (/)
vbKeySeparator  - Enter (keypad) sign

而且当然THIS http://msdn.microsoft.com/en-us/library/office/ff197461.aspx关键代码的 msdn 链接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以在 Excel VBA 中捕获并模拟 KeyDown 事件吗? 的相关文章

  • 在 Access VBA 中获取 Combobox.Value

    我有这个代码 If Me Combobox Value My Text Then 然而 由于我想测试 我的文本 是否是唯一选择的值 因此跳过了条件 我也尝试过 Me Combobox Column 1 and Me Combobox Tex
  • 为什么 MS Excel 在 Worksheet_Change Sub 过程中崩溃并关闭?

    当我在 Excel 工作表上运行 VBA 代码时 我遇到了 Excel 崩溃的问题 我正在尝试在工作表更改中添加以下公式 Private Sub Worksheet Change ByVal Target As Range Workshee
  • 在Excel中过滤后打印可见区域的宏

    我有一个根据过滤表的宏column A价值观 现在我想打印only过滤器后的可见行 但遗憾的是它打印了所有行 包括过滤期间隐藏的顶部和底部行 在我的工作表中 有来自的数据Column A I 但打印区域只能是Columns C I 过滤后的
  • MS Office SaveAs 类型 FileDialog 在 vb 中带有过滤器

    我想创建一个带有过滤器的 另存为 文件对话框 但这似乎无法使用 FileDialog 类 Microsoft Office 12 0 对象库 实现 文档实际上提到了这一点here http msdn microsoft com en us
  • 通过 VBA MS_Access 将 MS Access 表导出为 dBase 5

    如何通过 VBA 将单个表导出为 dBase 5 文件 目前我正在使用这个VBA代码 DoCmd TransferDatabase acExport dBase IV DB Total acTable DB Total C Data Fal
  • 使用 Excel Interop 关闭 Excel 应用程序而不保存消息

    我正在使用 Excel Interop COM 对象 我正在编写一种方法 其中打开和关闭 Excel 应用程序 然后打开 Excel 工作簿和工作表 完成这些工作后 我将关闭应用程序和工作簿 我的问题是 此方法可以重复调用多次 当工作表和应
  • 使用 SpreadsheetLight 进行行计数

    我正在寻找一个类似于 DataTable Rows Count 的函数 它可以与 SLDocument 一起使用来找出有多少行中有数据 SpreadsheetLight 中有可用的东西吗 还有其他方法可以实现这一目标吗 Brendan SL
  • 在 Android 上使用 Excel 文件

    我正在开发一个应该能够创建 读取和写入 Excel 文件的模块 是否有 推荐 轻量级 Java 库用于处理可以在 Android 上运行的 Excel 文件 欢迎提出建议 Thanks 找到一个
  • 删除 Excel 表格中的所有数据行(第一行除外)

    就在最近 我一直在尝试删除表中的所有数据行 除了第一个数据行 需要清除 一些正在执行的表可能已经没有行 所以我运行它时遇到问题 因为使用 DataBodyRange Rows Count在没有行 只有页眉和 或页脚 的表上会导致错误 我到处
  • 使用 UiPath 循环 Excel 文件中的 URL

    我尝试了几种方法 但不知怎的 它们看起来不干净 我有一个 Excel 格式的 URL 文件 一列中有 400 多个 URL 我希望 UiPath 从该文件中读取并一一浏览这些 URL 我尝试让 导航到 从从 Excel 读取的变量中读取 但
  • 如何保留每个单元格中合并单元格的值?

    我创建了一个包含合并单元格的工作表 但合并单元格的值仅存储在第一个单元格中 无论如何 为了在每个单元格中保持相同的值 我使用的公式需要它 谢谢 在 Excel 2003 中 此宏执行以下任务 Public Sub UnmergeAndFil
  • Excel 的查找和查找下一个 VBA

    我一直在试图弄清楚如何处理这个问题 但基本上我想要一种方法来打印 B 列中的值 给定与 A 列匹配的特定值 例如 Column A Column B 1 ABC 2 DEF 3 GHI 1 JKL 我想在使用 find findnext 或
  • 如何使用 pandas.to_excel() 创建 Excel **表格**?

    Need the achieve this programmatically from a dataframe https learn microsoft com en us power bi service admin troublesh
  • 在 Excel 中的文件夹内的所有文件上添加一列

    我在一个文件夹内有 250 个不同的 excel 文件 具有相同的布局 其中包含列A to F 我需要在列上添加新列G 传统的方法是打开每个文件并在以下位置添加新列G 有没有使用 Excel 宏或任何其他工具的简单过程来完成此任务 这个链接
  • 用于更新 Word 文档中所有字段的宏

    多年来 我构建了一个 vba 宏 该宏应该更新 Word 文档中的所有字段 我在发布文档进行审查之前调用此宏 以确保所有页眉和页脚等均正确 目前 它看起来像这样 Sub UpdateAllFields UpdateAllFields Mac
  • CURL 相当于使用 VBA 的 POST JSON 数据

    我知道这与之前提出的一些问题类似 但有些东西仍然对我不起作用 如何执行以下命令 curl X POST data statements json H Content Type application json user username p
  • Excel:包括过滤器中的第一行

    我正在特别考虑 Excel VBA 的 AutoFilter 方法 但我认为我的问题也适用于 GUI 当我将筛选器应用于 Excel 工作表时 未选择任何内容 筛选器将应用于所有行从第二次开始 有什么方法可以包含第一行 以便它也可以被过滤掉
  • xlwt 可以在单元格中创建一个包含标题和链接变量的超链接吗?

    例如 如何更改以下行 使 test 为变量 T 且 http google com http google com 是变量L ws write 0 0 xlwt Formula test HYPERLINK http google com
  • java.exe 以非零退出值 1 结束

    只是为了开始 我并不是真正尝试从 Android 中的 xlsx 文件中读取单元格 我已经尝试了几乎所有我在 Google 上搜索到的内容 但是每次 在两台不同的 PC 上 都是 Java 1 7 0 79 当我尝试构建 运行 这个应用程序
  • 在 Django(Python) 中向用户提供 Excel(xlsx) 文件下载

    我正在尝试使用 Django 创建和提供 Excel 文件 我有一个 jar 文件 它获取参数并根据参数生成 excel 文件 并且它可以正常工作 但是 当我尝试获取生成的文件并将其提供给用户下载时 文件损坏了 它的大小为 0kb 这是我用

随机推荐

  • 什么是 Cache-Control: private?

    当我访问时chesseng herokuapp com http chesseng herokuapp com我得到一个响应标头 如下所示 Cache Control private Connection keep alive Conten
  • 如何在docker中运行无头浏览器?

    我正在使用无头浏览器构建一个爬虫 但现在我想对我的应用程序进行 dockerize 我已经在我的 docker 映像中安装了 chrome 但在运行脚本时它会抛出错误 启动Chrome js const chromeLauncher req
  • @Transactional 与 JPA 和 Hibernate 有什么用?

    我正在学习如何使用 JPA 和 Hibernate 以及 MySQL 数据库创建 REST API 并且我看到了这个 Transactional 注释 有人能解释一下这个注释有什么用吗 例如我有这个简单的 DAO 类 Repository
  • 将 csv 导入到 xlsx python

    我正在尝试将 csv 文件中的一些数据放入现有的 Excel 文件中 我现有的 Excel 文件包含图像 而 xlrd 无法获取图像 我尝试使用 xlsxwriter 但它无法附加到现有的 xslx 我找到的唯一解决方案是使用 openpy
  • AppDelegate 文件适合 MVC 中的什么位置?

    我正在学习 iPhone iPad 编程 我相信我理解了MVC的概念 我遇到的困难是理解普通 iPhone iPad 应用程序中的某些文件如何适合 MVC 当您使用 基于视图的应用程序 模板创建新应用程序时 将创建 AppDelegate
  • Python pandas - 如果该项目在列表中,则新列的值

    我想在 pandas 数据框中创建一个新列 第一列包含国家 地区名称 该列表包含我感兴趣的国家 例如欧盟 新列应指示数据框中的国家 地区是否在列表中 以下是代码的简化版本 import pandas as pd import numpy a
  • 如何求一系列数字的最小公倍数?

    给定一个由两个数字组成的数组 让它们定义一系列数字的开始和结束 例如 2 6 表示范围 2 3 4 5 6 我想编写 javascript 代码来查找范围的最小公倍数 我下面的代码仅适用于小范围 而不是类似的 1 13 即范围 1 2 3
  • SSH 握手抱怨缺少主机密钥

    我正在尝试连接到远程主机并检查文件是否存在 在这个阶段 我只是尝试连接 但出现错误 2017 08 01 18 16 39 unable to connect ssh handshake failed ssh required host k
  • 如何并行化 Azure ML 服务计算集群上的工作?

    我可以使用计算集群将作业提交到 Azure ML 服务 它运行良好 并且自动缩放与自定义环境的良好灵活性相结合似乎正是我所需要的 然而 到目前为止 所有这些作业似乎只使用集群的一个计算节点 理想情况下 我希望使用多个节点进行计算 但我看到的
  • 当我在 android 中使用哈希映射时显示警告(使用新的 SparseArray

    我是 Android 开发新手 在我使用的 Android 应用程序中HashMap 但我收到警告 Use new SparseArray
  • URL 中的段落字符?

    我刚刚遇到了这个Google 应用引擎文章 http code google com googleapps appsscript articles appengine html在某些 URL 中使用有趣的反向 P 字符 查看第一个代码框顶部
  • 使用 FastObjImporter 在场景中加载并显示 obj 模型

    在我的 Unity 项目中 我想使用在互联网上找到的 FastObjImporter 类将 obj 放入场景中 我是否必须创建一个空的 GameObject 并将已处理的 obj 分配给它 尝试使用空的游戏对象 GameObject go
  • 如何使用 Flutter 在 Android 和 iOS 上实现振动?

    我正在尝试使用 Flutter 在单击按钮时实现振动 我发现说实话非常困难 我尝试使用以下软件包但未成功 振动 https pub dev packages vibration and vibrate https pub dev packa
  • 无法使用 Jekyll 生成任何内容

    当我运行 Jekyll 时 它不会生成任何内容 我看到的输出 Configuration from home mbsheikh techtraits techtraits blog config yml Auto regenerating
  • 调用纯虚函数[重复]

    这个问题在这里已经有答案了 可能的重复 在构造函数中调用虚函数 https stackoverflow com questions 962132 calling virtual functions inside constructors 看
  • JAXB 是否存在内存利用率问题?

    我使用 JAXB 进行 xml 解析 是否存在任何性能或内存利用率问题 需要注意的一件事是JAXBContext newInstance 是一个非常慢的操作 这是发生大量反射和类生成的地方 导致 duffymo 提到的烫发空间问题 值得庆幸
  • 如果我仅使用 JSON.Net,我可以安全地删除 C# 模型类中指定后缀的字段和属性吗

    我有一个 C 应用程序 我有一个从 xsd 生成的类 该类如下所示 public class Transaction public bool amountSpecified get set public double amount get
  • Ocaml 中查找树深度的尾递归函数

    我有一个类型tree定义如下 type a tree Leaf of a Node of a a tree a tree 我有一个函数可以找到树的深度 如下所示 let rec depth function Leaf x gt 0 Node
  • 并行化 tf.data.Dataset.from_generator

    我有一个不平凡的输入管道from generator非常适合 dataset tf data Dataset from generator complex img label generator tf int32 tf string dat
  • 我可以在 Excel VBA 中捕获并模拟 KeyDown 事件吗?

    阿伦 辛格 Arun Singh 对类似问题给出了很好的答案 编辑单元格时按下按键时是否会触发任何事件 https stackoverflow com questions 11153995 is there any event that f