2012-06-20 19 views
6

Problemstellung:ROW() Funktion verhält sich anders innen SUM() und SUMPRODUCT()

Geben Sie eine beliebige Anzahl in der Zelle A1. Versuchen Sie nun die folgenden Formeln in der ersten Zeile.

=SUM(INDIRECT("A"&ROW())) 

und

=SUMPRODUCT(INDIRECT("A"&ROW())) 

die erste Formel auswertet, gibt der zweite ein #VALUE Fehler. Dies wird dadurch verursacht, dass sich die ROW()-Funktion innerhalb von SUMPRODUCT() anders verhält. In der ersten Formel gibt ROW()1 zurück. In der zweiten Formel gibt die Zeile {1} (Array mit einer Länge) zurück, obwohl die Formel nicht als CSE-Formel eingegeben wurde.

Warum passiert das?

Hintergrund

Ich brauche eine Formel des Typs eines Fehlers

=SUMPRODUCT(INDIRECT(*range formed by concatenation and using ROW()*)>1) 

Dies funktioniert aus zu bewerten. Um dieses Problem zu umgehen, berechne ich jetzt ROW() in einer anderen Zelle (offensichtlich in der gleichen Zeile) und verkette das innerhalb meiner INDIRECT(). Alternativ habe ich auch versucht, es innerhalb einer Summenfunktion wie SUM(ROW()) zu kapseln, und das funktioniert auch.

Ich würde es sicher schätzen, wenn jemand erklären könnte (oder mich auf eine Ressource verweisen, die erklären kann), warum ROW() ein Array innerhalb SUMPRODUCT() zurückgibt, ohne dass CSE eingegeben wird.

Antwort

6

Interessante Frage. Es gibt hier subtile Probleme, die ich nicht dokumentiert gesehen habe.

Es scheint INDIRECT("A"&ROW()) gibt ein Array, bestehend aus einem Element, das eine Referenz auf eine Zelle ist - nicht der Wert in dieser Zelle. Viele Funktionen können diesen Datentyp nicht korrekt auflösen, aber einige Funktionen wie N und T können das Array "dereferenzieren" und den zugrunde liegenden Wert zurückgeben.

diesen Fall nehmen, wo es zwei Elemente im Array sind:

=SUM(N(INDIRECT("A"&ROW(1:2)))) 

Das gibt A1 + A2, wenn Array eingegeben, aber sie A1 nur zurück, wenn sie normal eingegeben. Wenn Sie jedoch ROW (1: 2) in {1; 2} in dieser Formel ändern, wird das korrekte Ergebnis bei normaler Eingabe zurückgegeben. Die äquivalente Formel SUMPRODUCT gibt A1 + A2 zurück, unabhängig davon, ob ein Array eingegeben wurde oder nicht.

Dies kann damit zusammenhängen, wie die Argumente in der Funktion registriert sind. Laut http://msdn.microsoft.com/en-us/library/bb687900.aspx gibt es im Wesentlichen zwei Methoden zum Registrieren von Funktionsargumenten für die Verarbeitung von Excel-Datentypen:

Typ R/U: "Werte, Arrays und Bereichsreferenzen."

Typ P/Q: "Excel konvertiert einzelne Zellenreferenzen in einfache Werte und mehrzeilige Referenzen auf Arrays, wenn diese Argumente vorbereitet werden."

SUM-Argumente scheinen mit dem Typ R/U übereinzustimmen, während SUMPRODUCT-Argumente sich wie Typ P/Q verhalten. Array-Eingabe der obigen SUM-Formel zwingt das Range-Referenzargument in ROW, als Array ausgewertet zu werden, während dies bei SUMPRODUCT automatisch geschieht.

aktualisiert

Nach einer wenig mehr Untersuchung, hier ist ein weiterer Beweis, der diese Theorie stützen könnte. Basierend auf den Link in der Kommentar die Formel = SUM ((A1, A2)) ergibt die gleichen Werte wie:

?executeexcel4macro("CALL(""Xlcall32"",""Excel4"",""2JRJR"",4,,1,(!R1C1,!R2C1))") 

das letzte Argument Registrierung als Typ P durch 2JRJR zu 2JRJP Wechsel gibt einen Fehler in diesem Fall Erlaubt jedoch einzelne Bereichsbereiche wie !R1C1:!R2C1. Auf der anderen Seite erlaubt das Ändern der 4 (xlfsum) auf 228 (xlfsumproduct) nur einzelne Bereichsreferenzen, wie es auch genannt wird, wie SUMPRODUCT.

+0

+1 nette Forschung! –

+0

+1 Das ist genau das, was ich brauchte. Die "Dereferenzierung" der 'N()' und 'T()' Funktionen überrascht mich. Tatsächlich, in der Formel '= SUMMENPRODUKT (N (INDIREKT (" A "& ROW()))), die' N() 'Funktion löst tatsächlich einen Fehler #VALUE (wie in der Evaluate Formula, Excel 2003 gesehen). Das ist sehr gut zu wissen. Auch die Informationen zu den Argumenten R/U und P/Q scheinen eine gute Erklärung zu sein. Die Handhabung der 'xlTypeNil'-Elemente für die P/Q-Typen scheint mit dem Verhalten von' SUMPRODUCT() 'übereinzustimmen. Danke für eine brillante Antwort. Ich hätte nie gewusst, wofür Google ist. Verdient ein +10 !! – playercharlie

+0

Gut, dass das half - Laurent Longre hat dieses Verhalten ursprünglich herausgefunden und gezeigt, wie Sie die CALL-Funktion mit Bezug auf xlcall.h für Arbeitsblattfunktionen verwenden können: http://www.cpearson.com/excel/Call.htm. In VBA ist dies weiterhin über 'ExecuteExcel4Macro' erreichbar. –

2

Da ROW() ein Array zurückgibt, verwenden Sie INDEX, um das erste Element zu erhalten.

Sie Beispiel wird dann: =SUMPRODUCT(INDIRECT("A"&INDEX(ROW(),1)))

+0

Danke für die Antwort. Ich habe die Funktion 'SUM()' anstelle der Funktion 'INDEX()' verwendet und das Problem gelöst. Ich suchte jedoch nach einer Erklärung, warum ich das tun musste. – playercharlie

+0

Das ist die beste Antwort für mich. Die Verwendung von INDEX() für das Array, das von ROW() innerhalb von SUMPRODUCT() erstellt wurde, ist perfekt! Wenn es bei der Volatilität um Neuberechnung geht, stört mich das nicht so sehr, weil der Computer jetzt viel schneller ist. Es gibt viele indirekte und Offset verwendet in meinen Arbeitsmappen und ich bin OK mit bis zu 1 Sekunde Verzögerung der Neuberechnung. Also, wenn ich jemals ROW() in SUMPRODUCT() verwenden muss, dann INDEX() ist ein Muss Hilfsfunktion! Vielen Dank SeanC –

+0

Oh, und danke für den SUM() Trick selbst beantwortet von OP. Es verkürzt die Formel und ich bevorzuge die kürzere. Ich frage mich, ob einer von ihnen schneller ist. Vielleicht ist SUM() schneller, weil es nicht flüchtig ist? –

1

Ich glaube nicht ROW() verhält sich anders hier, es gibt ein Array in beiden Fällen. Ich nehme an, dass SUMME und SUMMENPRODUKT dieses Array unterschiedlich behandeln - nicht sicher warum.

Viele Funktionen oder Kombinationen von ihnen geben Arrays zurück - Sie brauchen STRG + UMSCHALT + EINGABE nicht, um dies zu ermöglichen. In vielen Fällen benötigen Sie nur CSE, um die erzeugten Arrays zu verarbeiten.

würde ich nur INDEX verwenden anstelle von INDIREKTE (die man auch Vorteile durch eine veränderliche Funktion zu vermeiden), das heißt

=SUMPRODUCT(INDEX(A:A,ROW()))

....erweitert, dass diese Formel zu Ihrem Bereich wird die Anzahl der Werte> 1 in einem Bereich, in Spalte A zählt, wobei x die Startreihe und y die Endzeile

=COUNTIF(INDEX(A:A,x):INDEX(A:A,y),">1")

x und y durch Formeln berechnet werden kann definiert

Sie können SUMPRODUCT oder COUNTIFS auf ähnliche Weise verwenden, wenn weitere Bedingungen hinzugefügt werden sollen.

+0

Danke für die Antwort. Ich habe die Funktion 'SUM()' um die Funktion 'ROW()' herum verwendet und das Problem gelöst. Auch für mein spezielles Problem musste ich die 'INDIRECT()' Funktion verwenden, weil die Zellreferenzen sonst wo berechnet wurden !. Sie scheinen es richtig verstanden zu haben, wenn Sie sagen, dass CSE nur die Verarbeitung von Arrays ändert. @lori_m hat eine tolle Antwort darauf, warum 'SUM()' und 'SUMPRODUCT()' die Arrays unterschiedlich behandeln. – playercharlie