【问题标题】:Call KeyUp event调用 KeyUp 事件
【发布时间】:2022-10-04 19:52:45
【问题描述】:

我继承了一个相当深入和复杂的 Excel 工作簿,我的任务是添加到该工作簿上。

该工作簿旨在让用户在第一张纸上的文本框中输入信息,然后按 Enter 会触发 keyup 事件。

我很好奇是否有办法从另一张纸上的按钮事件中调用该例程?

Public Sub txtbx_length_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Select Case KeyCode
         Case Asc(vbCr), Asc(vbLf), Asc(vbCrLf):
             Application.Calculation = xlCalculateManual
             process_length_val Me.txtbx_length.Value
             Me.txtbx_length.Value = ""
             Me.txtbx_length.Activate
             Application.Calculation = xlCalculationAutomatic
        Case Asc("E"):     ' , Asc("e"):
        ' In tests, regardless if I had the shift key pressed or caps lock,
        ' or nothing, I always seen "E" come across -- never "e".  
            Application.Calculation = xlCalculateManual
            process_length_val Me.txtbx_length.Value
            Me.txtbx_length.Value = ""
            Me.txtbx_length.Activate
            Application.Calculation = xlCalculationAutomatic
 End Select

我想避免发送密钥,因为它根本不可靠,具体取决于重点。尤其是回车键。

我试过了:

txtbx_length_KeyUp

call txtbx_length_KeyUp

但两者都给出错误提示“未定义子或函数”

我很好奇是否有办法从另一张纸上的按钮事件中调用该例程?

【问题讨论】:

  • 那里的两个Case 块之间没有区别吗?当不涉及密钥时,为什么要从按钮调用KeyUp 事件?你希望在这里实现什么?
  • 还有 - learn.microsoft.com/en-us/office/vba/api/excel.xlcalculation 没有常数 xlCalculateManual
  • 不要直接调用事件处理程序 - 他们在那里处理事件并由 UI 框架调用(并且应始终为 Private)。相反,将您拥有的逻辑拉入其自己的过程,并从事件处理程序......和/或您喜欢的任何其他地方调用该过程。
  • 鉴于此处存在不存在的xlCalculateManual 标识符,我还强烈建议在所有模块的顶部添加Option Explicit,并解决它导致的任何编译时错误。还可以考虑让Rubberduck 检查您的代码,因为它会在设计时为您标记这些类型的东西。
  • 哦!那么,类似的:使用工作表(与表单)实例作为限定符 - SheetXyz.AnyPublicMethod。可能会推荐一些关于在 VBA 中使用对象和调用它们的方法的阅读。

标签: excel vba


【解决方案1】:

只是为了看看它是否/如何工作,请尝试下一个方法:

  1. KeyCode 不是 Integer,就像看起来一样。它是一个对象/类!具有由键盘传递的单个 (value) 属性。因此,如果您能够使用/创建必要的参数,则可以从另一个 Sub 调用事件。请复制下一个声明标准模块
      Public ReturnIntegerObj As MSForms.ReturnInteger
    
    1. 在现有事件代码中添加一个新行,就像你拥有它一样:
    Public Sub txtbx_length_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If ReturnIntegerObj Is Nothing Then Set ReturnIntegerObj = KeyCode 'the necessary line, to set the necessary objec (to be used when calling the event)
        Select Case KeyCode
             Case Asc(vbCr), Asc(vbLf), Asc(vbCrLf):
                 Application.Calculation = xlCalculateManual
                 process_length_val Me.txtbx_length.Value
                 Me.txtbx_length.Value = ""
                 Me.txtbx_length.Activate
                 Application.Calculation = xlCalculationAutomatic
            Case Asc("E"):     ' , Asc("e"):
            ' In tests, regardless if I had the shift key pressed or caps lock,
            ' or nothing, I always seen "E" come across -- never "e".  
                Application.Calculation = xlCalculateManual
                process_length_val Me.txtbx_length.Value
                Me.txtbx_length.Value = ""
                Me.txtbx_length.Activate
                Application.Calculation = xlCalculationAutomatic
     End Select
    
    1. 在任何代码模块中复制下一个能够调用上述事件的代码:
    Private Sub callKeyUpEvent()
        ReturnIntegerObj.Value = vbKeyReturn 'Enter key. It may be any key code...
        Call Worksheets("Report").txtbx_length_KeyUp(ReturnIntegerObj, 8)
    End Sub
    

    现在,在txtbx_length 文本框中写入任何内容,以设置必要的ReturnIntegerObj 对象。

    然后,运行callKeyUpEvent 过程来调用事件。

    注意:由于ReturnIntegerObj 变量是易失性的(仅存在于Excel 内存中),因此在出现错误后代码中断的情况下它可能会消失。因此,可能需要一些检查和重新设置对象变量的方法。即使不是那么简单,也需要在相应的文本框中进行真正的按键操作。也许,这样的模拟可能是可能的,但它不会成为问题的对象,我会说:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2017-12-28
    • 2012-07-06
    • 2016-07-29
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多