2017-09-06 81 views
0

我一直在尝试基于多个条件构建搜索实用程序。我目前的代码可以帮助我仅基于一个标准进行搜索。使用多个条件搜索表格 - VBA(Excel)

我寻找要根据说明,类别(部分或全搜索),价格(例如,> 10,< 50即与任何运营商的)

的下面是我想的示例数据搜索,我也包括预期的结果场景太:

Sample output

完整的数据
搜索

SKU Desc Category Price 
1 Pen UTL 5 
2 Pie1 FOOD 15 
3 Pie2 FOOD 17 
4 Pie3 FOOD 25 
5 Pie4 FOOD 30 
6 Paper1 UTL 4 
7 Paper2 UTL 4.5 
8 Paper3 UTL 10 
9 Paper4 UTL 12 
10 Paper5 UTL 14 
11 Calculator1 UTL 50 
12 Calculator2 UTL 70 
13 Calculator3 UTL 90 

有人的帮助将在这里非常感谢。我的实际数据将跨越20K记录。

下面是当前的代码:这里我要搜索在A4中的数据:D17,结果为H显示:K

Option Explicit 

Sub finddata() 

Dim Catagoryname As String Dim finalrow As Integer Dim i As Integer 'row counter 

Sheets("Data").Range("H5:k17").ClearContents Catagoryname = Sheets("Data").Range("J2").Value finalrow = WorksheetFunction.CountA(Range("A:A")) 

For i = 5 To finalrow 
    If Cells(i, 3) = Catagoryname Then 
     Range(Cells(i, 1), Cells(i, 12)).Copy 
     Range("H100").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats 
    End If Next i 

End Sub 

Data

+1

你已经有什么代码了?将它添加到你的文章 – Luuklag

+0

什么是Excel过滤的问题? – Moher

+0

您可以使用Userforms添加一个组合框,该组合框添加了Desc列而没有重复项,然后使用desc选择用Dictionary对象或.Find进行搜索,或者只是过滤 – danieltakeshi

回答

0

@Ashwin,这里的小程序我用于在超过11,000条记录的列表中搜索部分名称,然后我可以在一个类别上自动筛选以缩小列表的范围。结果会发布到工作簿中的另一个工作表中,因为我需要查看结果中的所有36列。如果您需要额外的自动过滤器,那么只需添加到最后。我只是使用2个输入框进行搜索,因为它必须快速且实时。您应该可以修改任何代码以适应您的需求。希望这可以帮助。

Public Sub SearchForItem() 
    'SEARCH FOR SOMETHING AND OPTION TO SORT BY SOMETHING ELSE 
Dim lngLastRow As Long 
Dim lngRow As Long 
Dim strValue As String 
Dim lngRowOutput As Long 
Dim result As String 
Dim quest1 As String 


result = InputBox(prompt:="What ?", Title:="First Search Item") 
    If result = vbNullString Then 
     Exit Sub 
    Else 
' where does the data end in Sheet1 
    lngLastRow = Sheet2.UsedRange.Rows.Count 

    If lngLastRow = 1 Then Exit Sub ' no data 

' Clear down sheet2, assume we have column headings in row 1 we want to keep 
    Sheet7.Range("6:1048576").Clear 

lngRowOutput = 6 ' where are we going to write the values to in Sheet7 

For lngRow = 6 To lngLastRow 
    strValue = Sheet2.Cells(lngRow, 2).Value ' get value from column B 

    If InStr(1, strValue, result, vbTextCompare) > 0 Then ' can we find "First Search Item" in the text 
     Sheet2.Rows(lngRow).Copy 
     Sheet7.Rows(lngRowOutput).PasteSpecial 
     lngRowOutput = lngRowOutput + 1 
    End If 

Next lngRow 

End If 

    'Go to the results and decide whether to AutoFilter or not 
    Sheets("SResults").Select 
quest1 = MsgBox("Do you want to select a category ?", vbYesNo) 
    If quest1 = vbNo Then 
    Exit Sub 
    Else 
ActiveSheet.Range("$A$5:$AG$106").AutoFilter Field:=3, Criteria1:="=*" & InputBox("Operator to search for?") & "*" 
    End If 
End Sub