2017-05-15 68 views
0

我目前使用自動篩選器對兩列進行篩選。如果自動過濾器的結果僅對可見單元格爲空,則會添加一個新行。如果找到除標題以外的任何行,則它將顯示一個MsgBox。問題是行數總是返回1.我嘗試用幾種方法重新定義「rng」無濟於事。Excel VBA - 自動篩選的行數總是返回1

Dim ws As Worksheet 
Dim rng As Range 

Set ws = Sheets("Scored Items") 

Worksheets("Scored Items").Activate 

ws.AutoFilterMode = False 

With ws 

    .Range("A:D").AutoFilter Field:=1, Criteria1:=AssetBox.Text 
    .Range("A:D").AutoFilter Field:=4, Criteria1:=PartBox.Text 

    Set rng = .Range("A:A").SpecialCells(xlCellTypeVisible) 

    If (rng.Rows.Count = 1) Then 
     'Add new row based on VBA form 
    Else 
     MsgBox "Item has already been scored" 
    End If 
End With 

ws.Cells.AutoFilter 

回答

1

而不是檢查Rows.Count的,檢查Cells.Count可見行。 試試像這樣......

Dim ws As Worksheet 
Dim rng As Range 
Dim lr As Long 
Set ws = Sheets("Scored Items") 
lr = ws.UsedRange.Rows.Count 

Worksheets("Scored Items").Activate 

ws.AutoFilterMode = False 

With ws 
    .Range("A1:D" & lr).AutoFilter Field:=1, Criteria1:=AssetBox.Text 
    .Range("A1:D" & lr).AutoFilter Field:=4, Criteria1:=PartBox.Text 
    Set rng = .Range("A1:A" & lr).SpecialCells(xlCellTypeVisible) 

    If rng.Cells.Count = 1 Then 
     'Add new row based on VBA form 
    Else 
     MsgBox "Item has already been scored" 
    End If 
End With 
ws.AutoFilterMode = False 
+0

此解決方案也運作良好,並且有點乾淨。謝謝! – Sedako

+0

不客氣Sedako!很高興它對你有效。 – sktneer

3

如果範圍對象是不連續的,比.Rows.Count將只返回在的範圍內,在這種情況下將是「標題」行的第一Area的行數。 (注意:如果你的過濾器是這樣的,那麼第一行數據是可見的,但第二行數據不可見,那麼結果就是2)。

使用已過濾的範圍時,您需要重複範圍內的Areas

Dim aRange as Range 
    For Each aRange in rng.Areas 
     If (aRange.Rows.Count = 1) Then 
      'Add new row based on VBA form 
     Else 
      MsgBox "Item has already been scored" 
     End If 
    Next 

在這種情況下,你可能要標誌,如果Areas.Count > 2並且如果任何aRange.Rows.Count <> 1

如果您使用AutoFilter僅僅是爲了檢查一個值在此存在一些錯誤範圍(即爲了防止重複表中的條目?),這是一個相當笨拙的方式來做到這一點,你可能會更好地使用COUNTIF函數。

If Application.WorksheetFunction.CountIf(.Range("A:A"),AssetBox.Text) = 1 And _ 
    Application.WorksheetFunction.CountIf(.Range("D:D"), PartBox.Text) = 1 Then 
    'Add new row based on VBA Form 
Else 
    MsgBox "Item has already been scored" 
End If 

從您的評論跟進,因爲這是一個UI,我會用。顯然,你想讓AutoFilter向用戶顯示數據,所以保持這一點。但是,而不是試圖破解過濾數據的各種Areas左右,只需使用COUNTIF功能檢查

'Filter data to display to the user 
Dim dataRange As Range 
Set dataRange = ws.Range("A:D") 
With dataRange 
    .AutoFilter Field:=1, Criteria1:=AssetBox.Text 
    .AutoFilter Field:=4, Criteria1:=PartBox.Text 

    'Check if part already been scored 
    With Application.WorksheetFunction 
    If .CountIf(.Columns(1), AssetBox.Text) = 1 And _ 
     .CountIf(.Columns(4), PartBox.Text) = 1 Then 
     'Add new row based on VBA Form 
    Else 
     MsgBox "Item has already been scored" 
    End If 
End With 
'unfilter the data 
ws.Cells.AutoFilter 
+1

感謝您的回覆。我選擇使用自動過濾器來完成這個工作的部分原因是向使用工具的個人顯示哪個記錄已經作爲匹配存在。如果需要,我可能會添加覆蓋新條目的功能。 – Sedako

+0

@Sedako肯定的事情,這是有道理的!如果答案已解決您的問題,請考慮[標記爲已接受](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235) –