【发布时间】: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 中使用对象和调用它们的方法的阅读。