2016-08-31 5 views
3

デバッグウィンドウで、次の式はすべて1を返します。CountAが0を返し、WorksheetFunction.CountAが1を返します

Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & ":" & Cells(5 + (i - 1) * rows_per_record, 58)) 

Application.WorksheetFunction.CountA(ThisWorkbook.Sheets(n).Cells(4 + (i - 1) * rows_per_record, 28) & ":" & ThisWorkbook.Sheets(n).Cells(5 + (i - 1) * rows_per_record, 58)) 

この特定の場合、範囲はAB60:BF61であり、デバッグウィンドウで確認されます。

ワークシートでは、スクリプトが一時停止している間にセル=CountA(AB60:BF61)に入力し、結果は0になります。

どのような説明も非常に認められます。

Windows 7、Excel 2010

答えて

1

構文が正しくありません。

正しい構文:

Application.WorksheetFunction.CountA (Range(Cells(4 + (i - 1) * rows_per_record, 28), Cells(5 + (i - 1) * rows_per_record, 58)))

あなたのコードでは、空の文字列ではなく、各引数をカウントしています。唯一の引数は、2つの空のセル値で囲まれたコロンです。

Application.WorksheetFunction.CountA(ThisWorkbook.Sheets(n).Cells(4 + (i - 1) * rows_per_record, 28) & ":" & ThisWorkbook.Sheets(n).Cells(5 + (i - 1) * rows_per_record, 58))

enter image description here

+0

私はコロンがカンマでなければならないと思っています。私はいくつかのテストを実行します。 – Jeeped

+0

カンマであれば、2つの別々の引数とみなされます。各セルに1つ。範囲を使用すると、セル間の範囲が拡張されます。しかし、ちょうどその場合は私に教えてください。 –

+0

はい、実際のカウントに関係なく、常に** 1 **を数えています。なぜなら、最初のセルの値を連結してからコロンと最後のセルの値を連結するからです。あなたは本質的に常に** 1 **となる単一の文字列を数えています。この方法で使用するには、コロンで連結されたセルアドレスを使用してワークシート関数として評価する必要があります。 Rangeを使用し、コンマで区切られた左上と右下を提供することによって、私は全体の範囲を数えます。 – Jeeped

1

私はあなたが答え、別の応答で正しい構文の1つのバージョンを持っていると信じています。

dim c as long 
with ThisWorkbook.Sheets(n) 
    c = Application.CountA(.range(.Cells(4 + (i - 1) * rows_per_record, 28), _ 
            .Cells(5 + (i - 1) * rows_per_record, 58))) 
    debug.print c 
end with 

Range objectを二Range.Cells propertiesで、左上と右下の角を供給することによって構築される:ここでの代替です。親ワークシートはWith ... End With statementによって参照されます。

+0

私の範囲をWithブロックの中にラップし、それらを修飾する必要があります。 –

関連する問題