2016-08-24 5 views
0

Im Inhalt der Zelle F3 habe ich die folgende Formel (die einen Wert für die aktuelle Zeile nimmt und es in einem anderen Blatt nachschlägt, einen Bereich basierend auf wo es gefunden wurde) zurück:Ersetzt einen berechneten Bereich in eine Suche

="'OBS Procedures'!" & ADDRESS(MATCH(INDIRECT(ADDRESS(ROW(),1)),'OBS Procedures'!A:A,0),3) & ":" & ADDRESS(MATCH(INDIRECT(ADDRESS(ROW(),1)),'OBS Procedures'!A:A,0),50)

, die ausgibt, wie es sollte, wird der Text: 'OBS Procedures'!$C$1:$AX$1

Alle gut so weit.

I in einer anderen Zelle haben (die den am weitesten rechts liegenden gefüllten Zelle des Bereichs von Zelle erzeugten Ausgaben F3):

=LOOKUP(2,1/(INDIRECT(F3)<>""),INDIRECT(F3))

Und diese Ausgänge, wie es sollte, wird der Text: 5: 18/07/2016

Großartig.

Aber ich möchte Zelle F3 vollständig loswerden, und die Formel für F3 in die zweite oben genannte Formel integrieren.

Einfach kopieren in der F3 Formel zwischen dem zweiten INDIRECT() funktioniert gut. Aber das Kopieren in die erste F3 generiert #N/A.

Im Einzelnen:

=LOOKUP(2,1/(INDIRECT("'OBS Procedures'!" & ADDRESS(MATCH(INDIRECT(ADDRESS(ROW(),1)),'OBS Procedures'!A:A,0),3) & ":" & ADDRESS(MATCH(INDIRECT(ADDRESS(ROW(),1)),'OBS Procedures'!A:A,0),50))<>""),INDIRECT(F3))

erzeugt #N/A

Während sogar

=LOOKUP(2,1/(INDIRECT("'OBS Procedures'!$C$1:$AX$1")<>""),INDIRECT(F3))

und erzeugt, was ich erwarte

(Die Zwischenzelle zu behalten oder dies in VBA zu tun, was für gewöhnlich mehr ist als einfache Formeln, ist in diesem Fall keine Option)

Ich sehe einfach nicht, was ich falsch mache hier - kann mich bitte jemand erleuchten? :)

+0

Vielleicht, weil Sie sich auf mehrere Zellen in Ihrer indirekten Formel '$ C $ 1: $ AX $ 1' beziehen? – Brian

+0

Gehen Sie zu 'Formeln' >>' Evaluate Formula' und debuggen Sie es. – Brian

+0

Kann ich fragen, warum Sie zuerst versuchen, eine Textzeichenfolge zu generieren, die den abzufragenden Bereich darstellt? Dies ist meiner Erfahrung nach fast nie notwendig, und schon gar nicht, wenn es sich dabei um einen derart verschachtelten Gebrauch von flüchtigen Funktionen wie INDIREKT handelt. –

Antwort

0

Wie in meinen Kommentaren angedeutet, habe ich Angst zu sagen, dass die Konstruktion, die Sie derzeit verwenden, eine sehr schlechte ist, und könnte mit einer nichtflüchtigen und weit entfernten Einrichtung ersetzt werden effizienter.

Der Grund für Ihren Fehler liegt in der Art und Weise, in der Sie die ROW-Funktion verwenden. Um auf diese Weise inkrementelle Ganzzahlen zu erzeugen, ist ROW aus verschiedenen Gründen ROWS (https://excelxor.com/2014/08/25/row-vs-rows-for-consecutive-integer-generation/) unterlegen.

Trotz seiner Unterlegenheit in dieser Hinsicht führt dies jedoch normalerweise nicht zu Fehlern.Hier sind Sie ein wenig bedauerlich, dass aufgrund der Art Ihrer Konstruktion wird Excel ein Array Ausgabe vom Abschnitt erwartet:

ROW()

Als solche und unter der Annahme aus Gründen der Argumentation, dass die Formel wir diskutieren in Zeile 1 ist, ist dieser Teil:

ADDRESS(ROW(),1)

, die unter verschiedenen Umständen wäre bewerten:

"$A$1"

hier wertet stattdessen:

{"$A$1"}

seit den LOOKUP den notwendigen Array-Zwang auf die Gesamtkonstruktion verleiht, so dass der ROW() Teil nur eine erwartet wird einen Array-Ausgang, wenn auch zu liefern, enthalten Einzelwert. In der Tat, hier (und Sie können dies sehen mit der Auswerten Formel Funktion), dieser Teil ergibt sich für Zeile 1), nicht 1, aber {1}.

Und so hier:

INDIRECT(ADDRESS(ROW(),1))

ist:

INDIRECT({"$A$1"})

und da im allgemeinen ist INDIRECT unfähig ein Array von Werten zu lösen (obwohl dies über erreicht werden kann weitere Manipulation), dieser Teilfehler.

Um dies zu vermeiden, können Sie ROWS, z. (Für die Zeile 1):

ADDRESS(ROWS($1:1),1)

oder aber das Array von Ausgabe ROW in einen nicht-Array-Typen über irgendeine geeignete zusätzliche Funktion coerce, z.B. SUM, nämlich:

ADDRESS(SUM(ROW()),1)

Das hieß, ich glaube wirklich, dass Sie hier Ihren gesamten Ansatz zu überdenken müssen. Zum Beispiel dieses:

=LOOKUP(2,1/(INDEX('OBS Procedures'!$C:$AX,MATCH(A1,'OBS Procedures'!A:A,0),)<>""),INDEX('OBS Procedures'!$C:$AX,MATCH(A1,'OBS Procedures'!A:A,0),))

angenommen in Reihe 1, zu sein wäre gleichbedeutend mit Ihrem:

=LOOKUP(2,1/(INDIRECT("'OBS Procedures'!" & ADDRESS(MATCH(INDIRECT(ADDRESS(ROW(),1)),'OBS Procedures'!A:A,0),3) & ":" & ADDRESS(MATCH(INDIRECT(ADDRESS(ROW(),1)),'OBS Procedures'!A:A,0),50))<>""),INDIRECT(F3))

(wieder angenommenen in Reihe 1 sein), und nicht nur, dass erfordert nicht die vorherige Konstruktion einer Textzeichenkette, die einen Bereich darstellt, ist aber auch prägnant und, was wichtig ist, nichtflüchtig.

Mit freundlichen Grüßen

Verwandte Themen