2016-08-31 9 views
3

In dem Debug-Fenster geben alle folgende Ausdrücke eins zurück.CountA gibt 0 zurück, WorksheetFunction.CountA gibt 1 zurück

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)) 

In diesem speziellen Fall ist der Bereich AB60: BF61, der im Debug-Fenster bestätigt wird.

In dem Arbeitsblatt, während das Skript pausiert ist, gebe ich in eine Zelle =CountA(AB60:BF61) ein und das Ergebnis ist 0, was es sein sollte.

Jede Erklärung wird sehr geschätzt.

Windows 7, Excel 2010

Antwort

1

Ihre Syntax ist falsch.

korrekte Syntax:

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

Ihr Code jedes Argument zählt, die keine leere Zeichenfolge ist. Das einzige Argument ist ein Doppelpunkt, der von den zwei leeren Zellenwerten umgeben ist.

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

Ich denke, dass der Doppelpunkt ein Komma sein sollte. Ich werde ein paar Tests machen. – Jeeped

+0

Wenn es ein Komma wäre, würde es als zwei getrennte Argumente betrachtet werden; eine für jede Zelle. Mit Range wird der Bereich zwischen den Zellen erweitert. Aber lassen Sie mich wissen, nur für den Fall ... lol. –

+0

Ja, Sie zählen immer ** 1 ** unabhängig von der tatsächlichen Zählung, weil Sie den Zellenwert von der ersten zusammen verketten, dann einen Doppelpunkt und dann den Zellenwert von der letzten. Sie zählen im Wesentlichen eine einzelne Saite, die immer ** 1 ** ist. Sie müssten es als Arbeitsblattfunktion auswerten, indem Sie die mit dem Doppelpunkt verketteten Zellenadressen verwenden, um sie auf diese Weise zu verwenden. Wenn Sie Range verwenden und die obere linke und untere rechte Ecke getrennt durch ein Komma angeben, zähle ich den gesamten Bereich. – Jeeped

1

Ich glaube, Sie die Antwort und eine Version der korrekten Syntax in eine andere Antwort haben. Hier ist ein alternative:

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 

Die Range object wird konstruiert, indem die obere linke und untere rechte Ecke mit zwei Range.Cells properties liefert. Das übergeordnete Arbeitsblatt wird durch die With ... End With statement verwiesen.

+0

Ich hätte meine Reihen in einen With Block verpacken und sie qualifizieren sollen. –