2016-05-14 10 views
0

私のVBサブを作る際にCOUNTIF関数を使用すると、問題に直面しました。COUNTIFは範囲内のセル数をゼロまたは数返します。さらに、別のデータを使用すると正しい数値が返されることがあります。ここでCOUNTIFは0またはセル数を返します

は、私が使用するコードです:

Sub CountifPerc() 

Dim i As Integer 
Dim MyArr() As Double 

Set InitialRange = Range("A1:A250") 
InitialRangeSize = InitialRange.Cells.Count 
ReDim MyArr(InitialRangeSize - 1) As Double 

For i = 1 To InitialRangeSize 
    MyArr(i - 1) = Application.WorksheetFunction.CountIf(InitialRange, "<=" & InitialRange(i).Value)/InitialRangeSize 
Next i 

End Sub 

あなたは、この質問で私を助けていただけますか?

UPD:非整数データを使用すると問題が発生することがわかりました。整数データはうまくいく。

答えて

1

あなたの問題はあなたのシステムロケールだと思います。以下は、ロケールドイツ語を使用しているマシンの動作に基づいていますが、Excelのシステム言語英語と小数点記号は.に設定されています。

"<=" & InitialRange(i).Value 

これにより、設定に応じた文字列が生成されます。明らかに、システムのロケールはInitialRange(i).Valueが文字列に変換されたときに使用されます。つまり、システムの小数点区切り記号がコンマの場合、Excel設定を何か他の値に設定してもは"<=0,5"となります。"<=0.5"ある

しかし、あなたがあなたのケースにしたいことは、明らかApplication.WorksheetFunction.CountIfが(ワークシートに入力されたとき、COUNTIFは、Excelの設定から、セパレータを必要としていても!)小数点区切りとして.必要とするため

を私は2つの回避策を考えることができます:

"<=" & Replace(InitialRange(i).Value,",",".") 'just hope that your system doesn't insert thousands separators 

または

"<=" & str(InitialRange(i).Value) 'str uses . as decimal separator 
+0

はいそれは実際に動作します!どうもありがとう! – Alex

0

ランダムデータを使用してループの部分を反復することで、あなたが行っていたことを確認できましたが、コードに問題はありませんでした。整数とdoubleの両方の初期値は、等しく有効な応答を与えました。ここで私は、コードを実行する方法である:ここでは

Sub CountifPerc() 

    Dim i As Integer 
    Dim MyArr() As Double 

    Set InitialRange = Range("A1:A250") 
    InitialRangeSize = InitialRange.Cells.Count 

    ReDim MyArr(InitialRangeSize - 1) As Double 

    For i = 1 To InitialRangeSize 

    MyArr(i - 1) = Application.WorksheetFunction.CountIf(InitialRange, "<=" & InitialRange(i).Value)/InitialRangeSize 

    Range("B" & i).Value = i 
    Range("C" & i).Value = InitialRange(i).Value 
    Range("D" & i).Value = Application.WorksheetFunction.CountIf(InitialRange, "<=" & InitialRange(i).Value) 
    Range("E" & i).Value = MyArr(i - 1) 

    Next i 
End Sub 

は、列Aの​​を使用して非整数の乱数と出力の画像は、次のとおりです。 Excel Worksheet output. あなたは他に何を試してみましたか?

+0

ありがとうございました!しかし、私はこの問題を解決するためにExcell細胞を使用したくありません! I = 1の場合 をInitialRangeSize D = 0 のC = 1の場合InitialRangeSize にInitialRange(I)> = InitialRange(C)次に D場合:arcadeprecinct上記の助けになるまで私は実際にこの問題を解決するために別のコードを使用 = D + 1 エンド次C D = Application.WorksheetFunction.CountIfs(InitialRange、 "<=" &InitialRange(I).Valueの) MyArr IF(I - 1)= D/InitialRangeSize 次のI – Alex

関連する問題