Wie extrahieren Sie ein Subarray aus einem Array in einer Arbeitsblattfunktion?

8

Gibt es eine Möglichkeit, ein Array in Excel kleiner als ein Array in einer Zellen-Tabellenfunktion zu erhalten?

Wenn ich also hätte:

%Vor%

Ich würde enden mit:

%Vor%

was ich dann mit einer anderen Funktion manipulieren könnte.

Fazit: Wenn ich viele davon machen würde, würde ich definitiv die UDF-Kammlösung von jtolle verwenden. Die Formel, die PPC verwendet, ist nah, aber tauchen und testen, ich finde es gibt Fehler in den leeren Slots, verfehlt den ersten Wert und es gibt einen einfacheren Weg, die Zeilennummern zu bekommen, also hier ist meine endgültige Lösung:

%Vor%

Was als Array-Formel eingegeben werden muss (STRG-UMSCHALT-EINGABE). Wenn es angezeigt wird, muss es mindestens in einem Bereich eingegeben werden, der so groß ist wie das Resultset, um alle Ergebnisse anzuzeigen.

    
Lance Roberts 18.10.2011, 23:53
quelle

3 Antworten

5

Wenn Sie nur eine Teilmenge eines Arrays aufnehmen möchten, und Sie bereits die Positionen der gewünschten Elemente kennen , können Sie einfach INDEX mit einem Array für das Indexargument verwenden . Das ist:

%Vor%

gibt {22,33,55} zurück. Aber das ist normalerweise nicht sehr nützlich, weil Sie die Positionen nicht kennen, und ich kenne keine Möglichkeit, sie ohne eine UDF zu bekommen.

Was ich für diese Art der filterinternen Arrayfilterung getan habe, ist das Schreiben einer UDF mit folgender Form:

%Vor%

Ich habe nur Pseudocode gepostet, weil mein tatsächlicher Code alle Aufrufe von Bibliotheksfunktionen ist, einschließlich der Operationen zum Sammeln von Positionen und Kopieren von Positionen. Es würde wahrscheinlich die Grundidee verschleiern, die ziemlich einfach ist.

Sie würden eine solche UDF wie folgt aufrufen:

%Vor%

oder

%Vor%

und benutze die normale Array-Mechanik von Excel, um den "Kamm" zu erzeugen. Es ist ein leichter, Excel-freundlicher Weg, um viele der Vorteile der Standard-Funktion filter(list-to-filter, test-function) zu erhalten, die Sie in anderen Programmiersystemen sehen können.

Ich benutze den Namen "comb", weil "filter" normalerweise "filter with this function" bedeutet, und bei Excel müssen Sie die Testfunktion anwenden, bevor Sie die Filterfunktion aufrufen. Es kann auch nützlich sein, einen "Kamm" als Zwischenergebnis zu berechnen und ihn dann zu verwenden, um ... mehrere Listen zu kämmen.

    
jtolle 19.10.2011, 02:13
quelle
5

Es gibt eine Antwort auf dieser Seite: Ссылка . Nicht viel Erklärung, obwohl.

Angenommen, Sie haben Daten mit leeren Zellen in Spalte A und fügen diese in Spalte B ein; das wird Daten in der gleichen Reihenfolge abrufen, die die Leerzeichen überspringt

%Vor%

Hier ist die Erklärung:

  • ROW () - ROW ($ B $ 1) ist nur ein Trick, der Ihnen eine steigende Zahl gibt (zB 1 in B1, 2 in B2 ...)
  • IF (..., ROW ($ A $ 2: $ A $ 6)) ist der Hauptteil des Tricks: Er erstellt ein Array der Zeilennummern, an denen die IF liegt Bedingung ist wahr (beachten Sie, dass die IF keinen 'sonst' Wert hat)
  • SMALL (..) gibt den kleinsten X-Wert dieses Arrays zurück (in unserem Fall die Nummer der X-ten nicht leeren Zeile), wobei X die Zeilennummer des aktuellen Werts ist Zelle (1 in B1 ...)
  • INDEX übersetzt dann die Zeilennummer in den Wert
  • Beachten Sie, dass INDEX und ROW eine Zeile über der eigentlichen Tabelle beginnen, um immer einen Offset & gt; 0 (INDEX mag keine Nullen)
PPC 03.04.2012 20:11
quelle
1

Eine mögliche Arbeitsblattfunktionslösung:

%Vor%

Die MODE.MULT Funktion gibt ein reduziertes Array von Indizes zurück und N(IF(1,.)) wird eingefügt, so dass das Array by-reference an die INDEX Funktion übergeben wird.

    
lori_m 19.07.2015 10:27
quelle