2016-03-01 71 views
1

到目前爲止,我有一個Excel文件作爲這樣搜索多個值,並選擇

http://i.stack.imgur.com/zX3xC.png

我的問題是,我希望能夠輸入具有搜索按鈕按下和輸入後的數框出現,選中電子表格中匹配的所有數字的搜索欄中的數字。

另外,作爲爲除了能放幾號(40,21,33用逗號隔開)

我當前的代碼是:

Sub SEARCH_Click() 
    Dim sh1 As Sheet1 
    Dim rng As Range 
    Dim uname As String 

    Set sh1 = Sheet1: uname = InputBox("Input") 
    With Application 
     .ScreenUpdating = False 
     .DisplayAlerts = False 
    End With 

    With sh1 
     .AutoFilterMode = False 
     Set rng = .Range("A4", .Range("A" & .Rows.Count).End(xlUp)) 
     On Error Resume Next 
     rng.SpecialCells(xlCellTypeVisible).Select 
     If Err.number <> 0 Then MsgBox "Data not found" _ 
      Else MsgBox "All matching data has been selected" 
     .AutoFilterMode = False 
     On Error GoTo 0 
    End With 

    With Application 
     .ScreenUpdating = True 
     .DisplayAlerts = True 
    End With 
End Sub 

我是相當新的編碼等等很多這一切都來自互聯網研究等。

+1

我對這個概念還不清楚。你的敘述說你想搜索電子表格中的所有匹配並選擇它們。您的代碼在單個列上使用自動篩選器。您是否希望在所選工作表中選擇不連續的匹配範圍,或者您是否想要篩選多個值的列? – Jeeped

+0

我剛剛意識到我犯了一個錯誤,我正在測試,但顯然我不明白它是什麼意思,但我確實希望它成爲整個電子表格不只是一列 – Sean

回答

1

放棄您的AutoFilter method,贊成Range.Find method。雖然最終可能在每列應用一系列.AutoFilters,但只需從Union method收集.Find操作的結果更有意義。

Private Sub CommandButton1_Click() 
    Dim uname As String, sh1 As Worksheet '<~~ there is no var type called Sheet1 
    Dim v As Long, fnd As Range, rng As Range, addr As String, vals As Variant 

    Set sh1 = Sheet4 

    uname = InputBox("Search for...") 
    vals = Split(Replace(uname, Chr(32), vbNullString) & Chr(44), Chr(44)) 
    ReDim Preserve vals(UBound(vals) - 1) 

    With sh1 
     For v = LBound(vals) To UBound(vals) 
      If IsNumeric(vals(v)) Then vals(v) = Val(vals(v)) 
      Set fnd = .Cells.Find(What:=vals(v), LookIn:=xlValues, LookAt:=xlWhole, _ 
            SearchOrder:=xlByRows, SearchFormat:=False) 
      If Not fnd Is Nothing Then 
       addr = fnd.Address 
       Do 
        If rng Is Nothing Then 
         Set rng = fnd 
        Else 
         Set rng = Union(rng, fnd) 
        End If 
        Set fnd = .Cells.FindNext(after:=fnd) 
       Loop Until addr = fnd.Address 
      End If 
      addr = vbNullString 
      Set fnd = Nothing 
     Next v 
     If Not rng Is Nothing Then rng.Select 
    End With 

End Sub 

目前尚不清楚你想要的Range .Select¹用此法後執行什麼動作。我會建議一個簡單的With ... End With statement woudl允許你繼續工作在rng不連續的Range object沒有實際選擇它。

search_and_select


¹How to avoid using Select in Excel VBA macros更多的方法從依靠選擇越來越遠,並激活,以實現自己的目標。

+0

好吧,謝謝你的信息!這將幫助我很多 – Sean

+0

我一直試圖弄清楚在哪裏以及如何添加預測模式,以便說我輸入19例如,它會自動向上或向下舍入值爲1(所以如果電子表格有18或20,如果我輸入19但是沒有找到19,它會選擇),但是我無法弄清楚如何在不使用函數Round_Up()的情況下添加它。 任何想法或有幫助的東西?非常感激! – Sean

+0

要做到這一點,你將不得不分別看每個單元格。 [Range.Find方法]中沒有「預測模式」(https://msdn.microsoft.com/en-us/library/office/ff839746.aspx)。 – Jeeped