2017-06-28 31 views
0

私はしばらくの間これに苦しんでおり、どこで間違っているのか知りたいと思います。 いくつかのソースデータがあり、最後の列(AG)は一部の列にN/Aがあるかどうかを評価するExcel関数です。 「はい」の場合は「エラー」、それ以外の場合は「いいえ」と表示されます。 私のコードでは、マクロを列RのAGを式に塗りつぶして(うまくいく)、フィルタリングされたエラーがあるかどうかを評価したいと思います。いくつかのエラーがある場合、私はそれを停止したいので(ユーザーにはフィルタリングされたエラーが表示されます)、「OK」だけがあれば、すべての値(フィルタなし)を表示したいと思います。ここ は私のコードである:VBAフィルタに値が表示されない/表示されない場合

Sub macro() 
With Worksheets("Source") 
LastRow = .Cells(Rows.Count, "A").End(xlUp).Row 
End With 

Sheets("Source").Select 
Range("R2:AG2").Select 
Selection.AutoFill Destination:=Range("R2:AG" & LastRow) 

ActiveSheet.Range("$A$1:$AG$" & LastRow).AutoFilter Field:=33, Criteria1:="error" 

Counter = Range("$A$1:$AG$" & 
LastRow).SpecialCells(xlCellTypeVisible).Rows.Count 
If Counter = 1 Then 
ActiveSheet.Range("$A$1:$AG$" & LastRow).AutoFilter Field:=33 
Else 
End If 

End Sub 

カウンタ(表示行数、そうのみヘッダ)が1に等しい場合アイデアは、あるある場合、そこにエラーがないと、フィルタが無効にされるべきです他のいくつかの目に見える行は、フィルタはそのまま残り( "else"文の後で空白になります)、ユーザはそれらの間違いを見ます。 問題がある場合でも、カウンターは常に1です。

答えて

0

これは、SpecialCells(xlCellTypeVisible)がの範囲であるの範囲であるため、.Rows.Countは最初の領域の行数だけを返します。

領域をスクロールして行数を合計する必要があります。 、さらに簡単さらに第3の道を

With ActiveSheet.Range("$A$1:$AG$" & LastRow).SpecialCells(xlCellTypeVisible) 
    If .Areas.Count = 1 And .Rows.Count = 1 Then 
    'All is filtered ! no error, remove filter 
    Range("$A$1:$AG$" & LastRow).AutoFilter 
    End If 
End with 

:1つのエリアのみとのみ1行:あなたが唯一のすべてがフィルタリングされるかどうかを確認したいので、

Dim area As Range 
For each area in Range("$A$1:$AG$" & LastRow).SpecialCells(xlCellTypeVisible) 
    counter = counter + area.Rows.Count 
Next 

あるいは、単に二重の状態を確認

With ActiveSheet.Range("$A$1:$AG$" & LastRow) 
    .AutoFilter Field:=33, Criteria1:="error" 
    If .SpecialCells(xlCellTypeVisible).Count = .Columns.Count Then .AutoFilter 'no error 
End with 
関連する問題