在打字方面做得很好

我正在处理数据input。 每次input一条logging之前,我都需要search和定位一个约5000行的单元。 我正在考虑是否可以在打字时进行search,而不是在Excel中使用searchfunction。 我的想法是捕获电子表格的按键事件,如果它是一个字符(字母“A”到“Z”或“A”到“Z”),将其追加到一个名为searchVal的string做一个函数的立即search。 当用户按ESC时,它将清理searchVal。 首先,我从网上得到了下面的代码,试图捕获ESC的keydown

Private searchVal As String Private Sub Workbook_Activate() Application.OnKey "ESC", "CleanSearchKey" End Sub Private Sub Workbook_Deactivate() Application.OnKey "ESC" End Sub Sub CleanSearchKey() searchVal = "" MsgBox "CleanSearchKey" End Sub 

但他的代码不起作用,似乎CleanSearchKey从来没有触发。 至于捕捉“A”到“Z”和“A”到“Z”的关键,我不想知道如何捕捉它在一个工作表,所以我添加一个input框Sheet1,分配下面的macros到input框

 Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If (KeyAscii >= 65 And KeyAscii <= 90) Or (KeyAscii >= 97 And KeyAscii <= 122) Then searchVal = searchVal & KeyAscii Else KeyAscii = 0 End If End Sub 

但它然后说“编译错误:用户定义的types没有定义”。 那么捕捉一张纸上的钥匙的正确方法是什么? 谢谢。

您为TextBox添加的代码仅适用于出现在UserForm对象上的TextBox。 我不认为工作表上的文本框响应像KeyPress这样的事件。

这就是说,你可以轻松地configuration一个简单的用户窗体来做到这一点。

在这里输入图像说明

在这里输入图像说明

我修改了一下你的代码。 我认为这应该让你开始。 在一个普通的代码模块中,执行一个像这样的过程来启动UserForm。 这将允许您从“macros”function区菜单中显示表单。 否则,您将不得不从“即时窗口”手动调用它,或者在VBE中按F5

 Sub ShowForm() UserForm1.Show vbModeless End Sub 

创build一个用户窗体,并添加一个文本框。 它的默认名称应该是TextBox1 ,如果不是,那么一定要改变它。 在userForm的代码模块中,执行以下操作:

 Option Explicit Dim searchVal As String Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) searchVal = TextBox1.Value If (KeyAscii >= 65 And KeyAscii <= 90) Or (KeyAscii >= 97 And KeyAscii <= 122) Then searchVal = searchVal & Chr(KeyAscii) TextBox1.Value = searchVal Call FindValue End If If KeyAscii = 27 Then 'ESC searchVal = vbNullString TextBox1.Value = vbNullString Else: KeyAscii = 0 End If End Sub Sub FindValue() Dim rngFound as Range With ActiveSheet set rngFound = .Cells.Find(searchVal) End With If rngFound Is Nothing Then MsgBox searchVal & " not found!" Else MsgBox searchVal & " found at " & rngFound.Address End If End Sub