2016-05-24 5 views
1

VBAスクリプトに問題があります。 I質問フィルタリングExcel可視セルのみのCountIfでの問題

Sub test31() 
Debug.Print "Sum Visible Cells only: " & Application.WorksheetFunction.Sum(Sheets("Sheet1").Range("A2:A645").SpecialCells(xlCellTypeVisible)) 
If Application.WorksheetFunction.CountIf(Sheets("Sheet1").Range("A2:A645").SpecialCells(xlCellTypeVisible), 1) > 0 Then 
Debug.Print "Ok" 
End If 
End Sub 

Example

CountIf機能を使用しようとしている:私はフィルタでマークすると 第一、第三、第四、第五、等(例えば、添付画像を参照してください) (しかし、私はこのスコープの間にいくつかの番号を外したら、 "worksheetfunctionクラスのcountifプロパティを取得できません"というエラーが出ます(しかし、私はすべてをマークするか、最初の2〜3などをマークします出現)

The file

+0

あなたはどんな出力を期待していますか? 'COUNTIF(* range *、1)'はあなたのリストの中の1の数を探します。あなたはそれらを数えようとしていますか?または、表示されている数字の数を数えますか? – micstr

+0

ルアーあなたが投稿する前にそれを検索する必要があります - チェックアウトhttp://stackoverflow.com/a/12009904/4606130 – micstr

+0

ありがとう、あなたは答え、micstr。私は大きなデータでこのコードをループで使いたいと思っています。次回はより良い検索をします=) – Lure

答えて

1

COUNTIFは、リストのフィルタを取得し、行が消えたときにどうなる非連続ブロックを好きにいないようです。しかし、これは私が2を意味することを意味する目に見える範囲はA1: A2A10:A645です。

別の機能の使用を検討する必要があります。

COUNTAは空白ではありません。そこで、可視範囲内の空白以外の数を数えてください。範囲オブジェクトは、コードを読みやすくして後でパラメータ化するのに便利です。

新しいコード

Sub test31() 
Dim rng As Range 

Set rng = ThisWorkbook.Sheets("Sheet1").Range("A2:A645") 

Debug.Print "Sum Visible Cells only: " & Application.WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeVisible)) 

' to see non contiguous uncomment this next line 
' rng.SpecialCells(xlCellTypeVisible).Select 
If Excel.WorksheetFunction.CountA(rng.SpecialCells(xlCellTypeVisible)) > 0 Then 
    Debug.Print "Ok" 
    Debug.Print "number visible: " & Excel.WorksheetFunction.CountA(rng.SpecialCells(xlCellTypeVisible)) 
End If 

End Sub 

OUTPUT

Sum Visible Cells only: 3337 
Ok 
number visible: 643 

テスト非選択

Sum Visible Cells only: 3323 
Ok 
number visible: 636 
のフィルターにすべてのテスト

私はあなたの希望する出力がわからないが、これが役立つことを願っています。

+1

パーフェクト、私は私のプロダクションバージョンでこのコードを使用しようとします。どうもありがとうございます – Lure

1

ルアー 2番目の質問への回答。

フォーム

worksheetfunction.countif(rng , 1) 

rngであなたのVBAでワークシート関数COUNTIFを使用しているまず、単一の範囲であることが必要です。

次へ]を、あなたは範囲を返すメソッドSheets("Sheet1").Range("A2:A645").SpecialCells(xlCellTypeVisible)特にSpecialCellsあるを使用していますが、範囲は単一continguousブロックではありません。あなたがあなたのコードをデバッグ、およびこの範囲に時計を置く場合は代わりに、あなたは、プロパティエリアは、実際に2

Set rng = Sheets("Sheet1").Range("b2:b645").SpecialCells(xlCellTypeVisible) 
Set areaCount = rng.Areas.Count 

の数を持っているので、問題はあなたのCOUNTIFの方法ではなく、むしろことを確認しますCountIfに渡すRangeが異なる範囲で構成されている、つまり間違った型のものです。

このシナリオでは、CountIfを使用することができません。使用する必要があるのは、フィルタ処理されたデータセットで作業するためのワークシート関数です。

したがって、範囲のリストを取る関数Subtotalは、必要に応じてより適切なWorksheetFunctionであるようです。今度は、最初のパラメータに2番目または3番目の適切なAggregateメソッドを選択する必要があります。カウント数のみ:2またはカウントなし空白セル:3

便利には、Aggregate functionは使用できる集計のリストを提供します。

あなたは今も、集計関数SUMを使用することによって、あなたの目に見える範囲を合計する集計関数または小計機能を使用することができます。ここで一緒にこのすべてを置く9.

はあなたのために提案コードスニペット..です

Sub test31() 

    Dim rngToUse As Range 
    Dim visibleSum As Long 
    Dim countOfVisible As Long 

    Set rngToUse = Sheets("Sheet1").Range("b2:b645") 
    visibleSum = WorksheetFunction.Subtotal(9, rngToUse) 
    countOfVisible = WorksheetFunction.Subtotal(3, rngToUse) 

    Debug.Print "Sum Visible Cells only: " & visibleSum 
    Debug.Print "Count of Visible Cells : " & countOfVisible 

    If countOfVisible > 0 Then 
     Debug.Print "Ok" 
    End If 

End Sub 

もう少し有益だったと思います。

よろしく ガレス