2016-05-14 18 views
0

Wenn ich die COUNTIF-Funktion nutze, um mein VB-Sub zu machen, habe ich ein Problem: COUNTIF gibt entweder Null oder die Anzahl der Zellen in einem Bereich zurück. Außerdem gibt es manchmal korrekte Zahlen zurück, wenn ich andere Daten verwende.COUNTIF gibt entweder 0 oder die Anzahl der Zellen zurück

Hier ist der Code, die ich benutze:

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 

Könnten Sie bitte helfen Sie mir mit dieser Frage?

UPD: Ich habe herausgefunden, dass das Problem auftritt, wenn ich nicht ganzzahlige Daten verwende. Ganzzahldaten funktionieren gut.

Antwort

1

Ich denke, Ihr Problem ist Ihr Systemgebietsschema. Das Folgende basiert auf dem Verhalten meines Rechners mit dem Gebietsschema Deutschland, aber Systemsprache Englisch sowie Dezimaltrennzeichen in den Excel-Einstellungen auf . gesetzt.

"<=" & InitialRange(i).Value 

Dies erzeugt eine Zeichenfolge, die von Ihren Einstellungen abhängt. Anscheinend wird das Systemgebietsschema verwendet, wenn InitialRange(i).Value in eine Zeichenfolge konvertiert wird. Das bedeutet, dass "<=" & 1/2"<=0,5"erzeugt, wenn Ihr System Dezimaltrennzeichen ein Komma ist, auch wenn Sie Ihre Excel-Einstellungen auf etwas anderes setzen.

jedoch, was Sie in Ihrem Fall wollen, ist "<=0.5" weil anscheinend Application.WorksheetFunction.CountIf. als Dezimalzeichen erfordert (obwohl COUNTIF wenn auf dem Arbeitsblatt eingegeben das Trennzeichen aus der Excel-Einstellungen erfordert!)

Ich kann von zwei Lösungen denken :

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

oder

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

Ja, es funktioniert tatsächlich! Danke vielmals! – Alex

0

Durch die Verwendung von Zufallsdaten und die Wiederholung von Teilen der Schleife If..Then konnte ich sehen, was Sie getan haben, aber ich hatte keine Probleme mit dem Code. Anfangswerte sowohl von Ganzzahlen als auch von Doppelwerten gaben gleichermaßen gültige Antworten. Hier ist das, wie ich den Code lautete:

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 

Hier ist ein Bild der Ausgabe mit nicht-ganzzahligen Zufallszahlen, =RAND()*1000 in Spalte A mit: Excel Worksheet output. Was haben Sie versucht?

+0

Vielen Dank! Ich möchte jedoch keine Excell-Zellen zur Lösung dieses Problems verwenden! habe ich eigentlich einen anderen Code, um dieses Problem zu lösen, bis arcadeprecinct oben geholfen: Für i = 1 bis InitialRangeSize d = 0 Für c = 1 To InitialRangeSize Wenn InitialRange (i)> = InitialRange (c) Dann d = d + 1 End If Next c d = Application.WorksheetFunction.CountIfs (InitialRange, "<=" & InitialRange (i) .Value) myArr (i - 1) = d/InitialRangeSize Next i – Alex

Verwandte Themen