2016-08-26 3 views
1

Application.Countifsを使用してワークシートから値を返す際に問題が発生しました。ここではそれを呼び出すために、既存の方法です:VBA - 0 /ブール値を返すカウンタ

Application.CountIfs(sortws.Range(sortws.Cells(1, 3), sortws.Cells(sortws.Rows.Count, 3).End(xlUp)), _ 
                CStr(sortws.Cells(x2, 3)), _ 
                sortws.Range(sortws.Cells(1, 4), sortws.Cells(sortws.Rows.Count, 4).End(xlUp)), _ 
                CStr(sortws.Cells(x2, 4)), _ 
                sortws.Range(sortws.Cells(1, x3), sortws.Cells(sortws.Rows.Count, x3).End(xlUp)), _ 
                Chr(34) & "<>" & Chr(34) & "&0") 

この場合、2つの変数が反復ループでは - x2は、スプレッドシート上の行に相当し、x3は列です。

私は値をPrintとき、それは私が各範囲のために必要なアドレスと最後の引数の文字列を印刷するとき、私はこの取得を0として返します。

=COUNTIFS($C$1:$C$1201,$C$1201,$D$1:$D$1201,$D$1201,$E$1:$E$1201,"<>"&0 

限り私としてどちらが、適切な機能であると伝えることができます。 私はそれで全部だこれをコピーして、ワークシートのセルに差す場合、私はEVALUATEを使用して、VBAエディタでこの式を印刷してきたし、それが0の同じ値を返します。1.

の期待値を取得します私は元の式で得るように。また、私はこれを使って、次のデータをセルにこれを入れて試してみた:

sortws.Cells(x2,7).Formula = "=COUNTIFS($C$1:$C$1201,$C$1201,$D$1:$D$1201,$D$1201,$E$1:$E$1201,"<>"&0" 

これは、式が実際にワークシートのセルにせずに、TRUEのブール値を返します。

関数の最後のビット(0に等しくない一致をチェックしている)を削除すると、最初の2つの列の合計一致数が正しく加算されます。このように、私は0をチェックするために私の構文で何かがオフだと思うが、それは何かを判断することはできません。その列のすべての値は数値です(技術的には通貨ですが、空白のワークシートであるため一般的な形式になっています)。しかし、私は手動でセルにプラグインしたときに同じ式がなぜ機能するのか紛らわしかったです。

EDIT:訂正された引用符で式を更新すると、EVALUATE関数が実行され、.Formulaのセルに挿入されます。これにより、更新された数式は"=COUNTIFS($C$1:$C$1201,$C$1201,$D$1:$D$1201,$D$1201,$E$1:$E$1201," & chr(34) & "<>" & chr(34) & "&0)"となりますが、修正された見積もり式として0以外のセルを返す同じメソッドを使用する元の既存のメソッドは0を返しても問題は残ります。

EDIT2:私の既存のVBAメソッドは、ワークシートに必要なものを複製しようとしていたため、0チェックを簡略化して<>0に解決しました。

+0

'sortws.Cells(x2.7).Formula ='については、引用符付きの文字列内で引用符を二重にする必要があります。基本的にゼロ(16進数) – Jeeped

答えて

2

引用符付き文字列内に引用符を付ける場合は、引用符付き文字列を二重にします。

sortws.Cells(x2, 7).Formula = "=COUNTIFS($C$1:$C$1201, $C$1201, $D$1:$D$1201, $D$1201, $E$1:$E$1201, ""<>0"")" 

次のようにExcel Application objectCOUNTIFS functionが書き込まれる完全なVBA。

Dim n As Long, x2 As Long, x3 As Long, sortws As Worksheet 

Set sortws = Worksheets("sheet2") 
x2 = 1201 
x3 = 5 

With sortws 
    n = Application.CountIfs(.Range(.Cells(1, 3), .Cells(.Rows.Count, 3).End(xlUp)), _ 
           CStr(.Cells(x2, 3)), _ 
          .Range(.Cells(1, 4), .Cells(.Rows.Count, 4).End(xlUp)), _ 
           CStr(.Cells(x2, 4)), _ 
          .Range(.Cells(1, x3), .Cells(.Rows.Count, x3).End(xlUp)), _ 
           "<>0") 
    Debug.Print n 
End With 

文字列連結の間違いを避けるために、右のブラケットを使用して式の文字列を閉鎖することを忘れないために必要な最小限にあなたの数式を下に下げてください。

+0

btwと比較して、それぞれが同じ行に終わらない場合に等しくないリスクを実行している各列に対して '.End(xlUp)'を生成します。 [COUNTIFS機能](https://support.office.com/en-us/article/COUNTIFS-function-53C4DC8E-0E5B-4E32-93DF-9CA5E7DA89ED)は、それぞれに同じサイズの範囲を持つ必要があります。 1つの列の最後の行定義で各列を終了する方がよい場合があります。彼らはすべて同じ行に終わってもあなたのものは動作しますが、それは保証されません。 – Jeeped

+0

ありがとう@Jeeped、明らかに、私は "<> 0"を書かなければならないと私の頭脳の中に浮かび上がってきていて、ワークシート上と同じ方法で書く必要があると思いました。 <>) - もちろん、私はVBEのそれではありません。そして、可変長エンディングのためのリマインダーのおかげで - この場合、私は手元のデータソースを生成しています、そして、私はすべての列が等しい長さであることを知っているので、それは問題ではありません。 – Goose306