【问题标题】:Checkbox search in excel VBAexcel VBA中的复选框搜索
【发布时间】:2013-12-18 17:12:16
【问题描述】:

这是我第一次来这个论坛。我是 excel VBA 的“新手”,如果有人能提供帮助,我将不胜感激。

我正在尝试开发一个复选框搜索页面,其中:

  • 用户可以使用复选框选择最多 4 个项目进行搜索(在“搜索”工作表中)
  • 在数据表中,数据(按列)记录如下:

代码簿项目 材料 1 百分比 1 材料 2 百分比 2 材料 3 百分比 3 材料 4 百分比 4

  • 一个项目,例如“聚酯”,将出现在“材料 1”、2 等列中,具体取决于记录
  • 搜索应基于搜索页面中选中的复选框
  • 如果检查了多个关键字,例如聚酯、羊毛、棉花,则只应显示包含所有 3 个关键字的行

我在网上搜索了很多帖子,如果找到关键字,他们会删除行。有什么办法可以扭曲逻辑并适用于这种特殊情况?

被困了很多天......如果有人可以提供帮助,不胜感激!

更新 1:如果找到某些关键字,我已经设法在互联网上找到删除行的内容 - 但是 - 我想做相反的事情(这将让我剩下的正确的......)

代码如下 - 是否可以更改?:

Sub Example1()

    Dim varList As Variant
    Dim lngarrCounter As Long
    Dim rngFound As Range, rngToDelete As Range
    Dim strFirstAddress As String

    Application.ScreenUpdating = False

    varList = VBA.Array("Here", "There", "Everywhere")

    For lngarrCounter = LBound(varList) To UBound(varList)
        With Sheet1.UsedRange
            Set rngFound = .Find( _
                                What:=varList(lngarrCounter), _
                                Lookat:=xlWhole, _
                                SearchOrder:=xlByRows, _
                                SearchDirection:=xlNext, _
                                MatchCase:=True)

            If Not rngFound Is Nothing Then
                strFirstAddress = rngFound.Address

                If rngToDelete Is Nothing Then
                    Set rngToDelete = rngFound
                Else
                    If Application.Intersect(rngToDelete, rngFound.EntireRow) Is Nothing Then
                        Set rngToDelete = Application.Union(rngToDelete, rngFound)
                    End If
                End If

                Set rngFound = .FindNext(After:=rngFound)

                Do Until rngFound.Address = strFirstAddress
                    If Application.Intersect(rngToDelete, rngFound.EntireRow) Is Nothing Then
                        Set rngToDelete = Application.Union(rngToDelete, rngFound)
                    End If
                    Set rngFound = .FindNext(After:=rngFound)
                Loop
            End If
        End With
    Next lngarrCounter

    If Not rngToDelete Is Nothing Then rngToDelete.EntireRow.Delete

    Application.ScreenUpdating = True

【问题讨论】:

  • 谢谢我!但是,只有在复选框被“选中”时,如何添加自动过滤器?要添加更多信息,我有“搜索”工作表 - 用户可以在其中选中框并链接到单元格列,如果选中则生成 true。我想将这些检查值用于“搜索资源”表中的过滤过程。
  • 先创建一个数组。循环检查复选框,如果它们被选中,则将它们的值(文本)添加到数组中。

标签: vba search excel checkbox


【解决方案1】:

也许你可以试试Sheets("Search").Cells.Find([keyword]) 命令,它类似于 ctrl+L 键。

如果您希望搜索超过 1 个关键字,可以使用以下循环:

dim i as Integer
dim vTemp as Variant
dim strFind as String
dim objSearch as Object

strFind = range("searchField").value
vTemp = split(strFind, ",")

for i =0 to Ubound(vTemp)
    Set objSearch  = Sheets("Search").Cells.Find(vTemp(i))
    'Do whatever you like to the object of search
next i 

希望能帮到你。

【讨论】:

  • 感谢您的建议 - 但问题是如果它是有条件的(即仅搜索复选框值是否为真),那么我坚持将它们放入 vba 语言...
  • 这取决于您使用的是 ActiveX 工具(仅适用于 2007 或更高版本的 Office)还是普通工具。 ActiveX 更简单,只需键入“if sheet(i).checkboxname then...”。对于普通的 Excel 工具,您可以将复选框链接到单元格值并将该单元格用作参数。我还没有写出你需要的完整代码,虽然这些命令应该足以解决你的问题。
猜你喜欢
  • 2017-01-27
  • 2020-05-20
  • 2013-10-23
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
相关资源
最近更新 更多