【问题标题】:VBA code to only show rows that contain similar text to an input field?VBA代码仅显示包含与输入字段相似的文本的行?
【发布时间】:2018-08-29 07:20:58
【问题描述】:

我是 VBA 新手,正在尝试拼凑一些代码,以允许用户在单元格中输入一个单词(或多个单词),然后显示匹配行条目的列表。

我尝试了以下代码,但收到“instring = type mismatch”错误。

请注意,“B3”是“搜索词”专用字段,F 列是包含我要在其中搜索的文本的列。如果包含该单词,我想显示该行并隐藏所有不包含该单词的行。

Sub Find_Possible_Task()

  ROW_NUMBER = 0
  SEARCH_STRING = Sheets("codeset").Range("B3")
  ROW_NUMBER = ROW_NUMBER + 1
  ITEM_IN_REVIEW = Sheets("codeset").Range("F:F")

  If InStr(ITEM_IN_REVIEW, SEARCH_STRING) Then
    Do
      Cells(c.Row).EntireRow.Hidden = False
    Loop Until ITEM_IN_REVIEW = ""
  End If

End Sub

TIA!

【问题讨论】:

  • 您好,我用一些格式编辑了您的问题,但为了将来参考,请在您的代码中使用一些缩进并停止在每一行代码后放置空换行符。它会严重损害可读性

标签: vba excel


【解决方案1】:

很少有糟糕的编码约定,甚至可能是彻头彻尾的错误:

  1. 最好明确声明Public/Private 过程的范围Sub
  2. 除非您从其他地方传递变量,否则需要使用 Dim 关键字声明它们
  3. 使用Option Explicit 将帮助您防止上述错误
  4. (主观)所有大写的变量都很丑陋,在大多数编程语言中,为常量保留所有大写变量名称是惯例(Const

    Option Explicit
    Private Sub keep_matches()
      Dim what As Range
      Dim where As Range
      Dim res As Range ' result
      Dim lr As Long ' last active row
      Dim ws As Worksheet: Set ws = Sheets("codeset")
    
      lr = ws.Cells(ws.Rows.Count, "F").End(xlUp).Row
      Set what = ws.Range("B3")
      Set where = ws.Range("F1:F" & lr)
    
      ' we'll create an extra column for a loop in our .Find method
      where.Copy
      ws.Range("F1").EntireColumn.Insert
      ws.Range("F1").PasteSpecial xlPasteValues
    
      where.EntireRow.Hidden = True ' preemptively hide them all
    
      Set where = ws.Range("F1:F" & lr)
      Set res = where.Find(what, lookIn:=xlValues) ' ilook for matches, 1st attempt
      If Not res Is Nothing Then ' if found
         Do Until res Is Nothing ' repeat for all results
           res.EntireRow.Hidden = False
           res = "Checked"
           Set res = where.FindNext(res)
         Loop
      Else
         MsgBox("No matches were found")
         where.EntireRow.Hidden = False ' we don't wanna hide anything
      End If
    
      ws.Range("F1").EntireColumn.Delete ' remove the extra help column for Find method
    End Sub
    

应该按预期工作。
如果有任何问题,请告诉我。

【讨论】:

    【解决方案2】:

    考虑 range.find(),而不是 instr()。

    Sub Find_Possible_Task()
    
    Dim SEARCH_STRING As String
    Dim ITEM_IN_REVIEW As Range
    Dim found As Range
    Dim i As Integer
    
    SEARCH_STRING = Sheets("Sheet1").Range("B3").Value
    i = 1
    
    Do
        Set ITEM_IN_REVIEW = Sheets("Sheet1").Cells(i, 6)
        Set found = ITEM_IN_REVIEW.Find(What:=SEARCH_STRING)
        If found Is Nothing Then
    
            ITEM_IN_REVIEW.EntireRow.Hidden = True
        End If
        i = i + 1
    Loop Until ITEM_IN_REVIEW = ""
    
    End Sub
    

    或者,考虑使用过滤表: 1.检查您的表是否有过滤器==>如果是,则通过。如果没有,请打开过滤器。 2. 过滤列 F 的关键字以包含单元格 B3 中的值。

    【讨论】:

    • 感谢您的帮助,2049!这解决了我的问题。
    猜你喜欢
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2013-05-24
    • 2021-02-25
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多