2016-05-14 2 views
0

При использовании функции COUNTIF при создании моей подстанции VB я столкнулся с проблемой: 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 преобразуется в строку. Это означает, что если ваш десятичный разделитель систем - это запятая, тогда "<=" & 1/2 произведет "<=0,5", даже если вы установите для своих настроек Excel еще что-то еще.

Однако то, что вы хотите в вашем случае "<=0.5", потому что, по-видимому Application.WorksheetFunction.CountIf требует . в качестве десятичного разделителя (даже если COUNTIF при входе на листе требуется отделитель от настроек первенствовать!)

Я могу думать о двух обходных :

"<=" & 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

Используя случайные данные и повторяющиеся фрагменты цикла If..Then, я смог увидеть, что вы делали, но у меня не было проблем с кодом. Исходные значения как целых чисел, так и двойников дали одинаково действительные ответы. Вот как я побежал код:

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 

Вот изображение выходного сигнала с нецелыми случайными числами, используя =RAND()*1000 в колонке А: Excel Worksheet output. Что еще вы пробовали?

+0

Спасибо! Тем не менее, я не хочу использовать какие-либо элементы Excell для решения этой проблемы! Я на самом деле использовали другой код, чтобы решить эту проблему, пока arcadeprecinct не помогло выше: Для я = 1 до InitialRangeSize г = 0 При с = 1 InitialRangeSize If InitialRange (я)> = InitialRange (с) Тогда г = d + 1 Конец Если Далее гр д = Application.WorksheetFunction.CountIfs (InitialRange, "<=" & InitialRange (я) .Value) MyArr (I - 1) = d/InitialRangeSize Далее я – Alex

Смежные вопросы