我正在处理数据输入。每次输入一条记录之前,我需要在大约 5000 行中搜索并定位一个单元格。我在想是否可以在键入时进行搜索,而不是在 excel 中使用搜索功能。我的想法是捕获电子表格的按键事件,如果它是一个字符(字母 'A' 到 'Z' 或 'a' 到 'z'),将它附加到一个名为 searchVal 的字符串,使用函数立即搜索.当用户按下 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'的键,我不想知道如何在工作表中捕获它,所以我在sheet1上添加了一个输入框,将以下宏分配给输入框
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
但它接着说“编译错误:未定义用户定义的类型”。那么在工作表上捕获 key 的正确方法是什么?谢谢。
最佳答案
您为 TextBox 添加的代码仅适用于出现在 UserForm
上的 TextBox目的。我认为工作表上的文本框不会响应 KeyPress
之类的事件。 .
也就是说,您可以轻松配置一个简单的用户表单来执行此操作。
我稍微修改了你的代码。我认为这应该让你开始。在普通代码模块中,执行类似这样的过程来启动用户窗体。这将允许您从宏功能区菜单中显示表单。否则,您将不得不从即时窗口手动调用它或在 VBE 中按 F5。
Sub ShowForm()
UserForm1.Show vbModeless
End Sub
创建一个用户窗体,并添加一个文本框。其默认名称应为
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
关于vba - 键入时在 excel 中进行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25891932/