【问题标题】:Advanced search using VBA Excel使用 VBA Excel 进行高级搜索
【发布时间】:2019-10-25 12:02:30
【问题描述】:

我有一个数据列表(20,000 多种产品),根据产品的状况有不同的定价,用户需要能够快速查找某些等级的产品定价,我目前的挑战是使用 vlookup 经常失败用户将只是关键字搜索而没有确切的描述。我想使用 vlookup 保留现有查找,因为当用户拥有确切的产品标题但想要在他们只有关键字时添加高级搜索时,这将保持快速搜索(我已经尝试过数据验证可搜索列表,但它们是缓慢且不可靠)

我创建了一个列表框,但无法获取代码来搜索我的数据集并显示结果,

这是我正在使用的代码(库存数据包含我所有的产品和定价),我的第二张表称为搜索,我希望用户在其中找到他们正在寻找的东西

enter code here

Private Sub cmdsearch_click()

Dim Rownum As Long
Dim Searchrow As Long

Rownum = 2
Searchrow = 2

Worksheets("Stock Data").Activate

Do Until Cells(Rownum, 1).Value = ""
If InStr(1, Cells(Rownum, 1).Value, txtkeywords.Value, vbTextCompare) > 0 Then
   Worksheets("Sheet1").Cells(Searchrow, 1).Value = Cells(rownnum, 1).Value
   Worksheets("Sheet1").Cells(Searchrow, 2).Value = Cells(rownnum, 2).Value
   Worksheets("Sheet1").Cells(Searchrow, 3).Value = Cells(rownnum, 3).Value
   Searchrow = Searchrow + 1
End If
Rownum = Rownum + 1



Loop

If Searchrow = 2 Then
MsgBox "Sorry No products found, please request a price"
End If

Lstsearchresults.RowSource = "SearchResults"

End Sub

【问题讨论】:

  • 谢谢,但链接是德语的,我对 VBA 有点生疏
  • 带有通配符的VLOOKUP 怎么样?
  • 哦,关于Range.Find,微软确实有多种语言的在线文档。
  • @ronrosenfeld 我很难理解如何将 Range.find 包装到我的代码中,这就是我查看搜索的原因
  • 另一种可能性是read in your list to a memory based array 以获得性能。它可以加速细胞循环,花费几秒钟到几乎瞬间。

标签: excel database vba search listbox


【解决方案1】:

如 cmets 中所述,您可以像这样使用Range.Find

Private Sub cmdsearch_click()

Dim rowResult As Long
Dim strSearch As String

rowResult = 2
strSearch = txtkeywords.Value

Dim rowLast As Long
rowLast = Worksheets("Stock Data").Cells(Rows.Count, 1).End(xlUp).Row

Dim rngFound As Range
Dim firstAdress As String

With Worksheets("Stock Data").Range("A1:A" & rowLast)
    Set rngFound = .Find(strSearch, LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False)
    If Not rngFound Is Nothing Then

        firstAddress = rngFound.Address
        Do
            Worksheets("Sheet1").Cells(rowResult , 1).Value2 = rngFound.Value2
            Worksheets("Sheet1").Cells(rowResult , 2).Value2 = rngFound.Offset(0, 1).Value2
            Worksheets("Sheet1").Cells(rowResult , 3).Value2 = rngFound.Offset(0, 2).Value2
            rowResult = rowResult + 1

            Set rngFound = .FindNext
        Loop While rngFound.Address <> firstAdress

    Else
        MsgBox "Sorry No products found, please request a price"
    End If
End With

Lstsearchresults.RowSource = "SearchResults"

End Sub

更快的方法是将所有内容存储在数组中并循环遍历。然而,刚开始时,我发现使用较少抽象的方法和逐步学习会更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 2018-08-27
    相关资源
    最近更新 更多