【问题标题】:Start VBA macro when editing a cell编辑单元格时启动 VBA 宏
【发布时间】:2017-10-23 15:42:28
【问题描述】:

我只是尝试在 Excel 工作表中编写搜索宏。如何在编辑单元格期间动态启动宏。在单元格中写入时,搜索宏应该在后台运行,每个字符都添加或删除,而不仅仅是在末尾。 Worksheet_Change(ByVal Target As Range) 仅在编辑完成后开始(按回车键或选择了其他单元格)。

谢谢。

【问题讨论】:

标签: vba excel


【解决方案1】:

你不能。 Excel 处于编辑模式时,代码引擎不会运行。您必须让用户在单元格以外的地方输入文本 - 例如工作表上的控件或用户窗体上的控件。

【讨论】:

  • 好的,谢谢,很高兴知道。但是在工作表中使用控件有什么区别?您是否考虑过文本字段?
  • 如果您使用 ActiveX 文本框,则可以使用该控件的 Change 事件,该事件将在每个键入的字母时触发,这似乎更符合您想要执行的操作。它只是给你一个单元格没有的“当你打字时”事件。
  • 你好迪克,非常感谢你的回答。我花了一段时间,但我得到了你的提示。我会自己回答我的问题,以防其他人正在寻找类似的解决方案。
  • 实际上,即使用户正在编辑单元格,也会触发事件并执行代码。在编辑单元格时,Application 对象(及其所有成员)变得无响应,因此您无法获取该单元格的值。
【解决方案2】:

感谢 Dick Kusleika 回答我的问题并让我走上正轨。

对于任何有类似需求的人来说,这是最终解决方案。它基本上与 ActiveX 文本框一起使用来输入搜索字符串。该宏在搜索区域中查找包含搜索字符串的所有条目。搜索字段中的所有其他填充行都将被隐藏。这在写入 TextBox 时立即起作用。因此,当删除搜索字符串中的字符时,一旦隐藏的行将在适当的时候立即出现。

Private Sub TextBox1_Change()
 Dim searchArea As Range, searchRow As Range, searchCell As Range
 Dim searchString As String
 Dim lastRow As Integer

 Application.ScreenUpdating = False
 searchString = "*" & LCase(TextBox1.Value) & "*"

 ' unhide rows to have the full search field when editing
 Rows.Hidden = False

 lastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
 Set searchArea = Me.Range("A5", "A" & lastRow) 'Me.Range("A5").End(xlDown))
 searchArea.EntireRow.Hidden = True

 For Each searchRow In searchArea.Rows
   For Each searchCell In searchRow.Cells
     If LCase(searchCell) Like searchString Then
       searchRow.Hidden = False
       Exit For
     End If
   Next searchCell
 Next searchRow

 Application.Goto Cells(1), True
 Application.ScreenUpdating = True

End Sub

像魅力一样工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多