Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1764to1768
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Kurzformen zum Anlegen eines Arrays

Kurzformen zum Anlegen eines Arrays
15.06.2020 13:45:42
Martin
Hallo,
die typische bzw. klassische Form zum Anlegen eines Arrays ist allgemein bekannt:

ReDim [Preserve] VarName(Indizes) [As Typ] [, VarName(Indizes) [As Typ]] . . .

Als eine Kurzform gib es dann noch die Array-Funktion:

A = Array(10,20,30)
...wobei die Untergrenze per Option Base-Anweisung festgelegt werden kann und standardmäßig mit 0 beginnt.
Wenn man ein zweidimensionales Array über diese Kurzform erzeugen möchte, würde es so aussehen:
A = Array(Array(10, 20, 30), Array(110, 120, 130), Array(210, 220, 230))

Durch Zufall bin ich im Netz auf eine weitere Kurzform zum Anlegen eines Arrays gestoßen:

A = [{10,20,30}]

Bei dieser mir bislang unbekannten Kurzform-Variante können zweidimenionale Arrays einfach _ durch eine Semikolon-Trennung angelegt werden:

A = [{10,20,30;110,120,130;210,220,230}]

Interessanter Weise beginnt die Untergrenze bei dieser Form immer bei 1, auch wenn per Option Base-Anweisung die Untergrenze auf 0 festgelegt ist.
Meine Frage:
Gibt es irgendwo eine Dokumentation zum Arbeiten mit bzw. dem Verhalten dieser Kurzform zum Anlegen eines Array mit geschweiften Klammern?
Viele Grüße
Martin

21
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: https://tinyurl.com/y9pvp4qr
15.06.2020 14:22:25
EtoPHG

Nein, das hat nicht mit Formel-Arrays zu tun...
15.06.2020 14:42:58
Martin
Hallo Hansueli,
Rudi Maintaire konnte den Sachverhalt klären: Die eckigen Klammern sind eine Kurzform der Evaluate-Methode:
https://docs.microsoft.com/de-de/office/vba/api/excel.application.evaluate
Aber es ist beruhigend zu wissen, dass nicht nur ich etwas dazugelernt habe ;-)
- da war meine Frage wenigstens berechtigt.
Viele Grüße
Martin
Eben doch, wie kommst du auf Nein? (owT)
15.06.2020 14:45:33
EtoPHG

Etwas mehr Kontext wäre hilfreich...
15.06.2020 15:00:56
Martin
Hallo Hansueli,
Ein Link auf eine Seite mit Beispielen zur Verwendung von Array-Formeln war alles andere als hilfreich bzw. aussagekräftig. Und ja, auch Formeln können mit Evaluate in VBA interpretiert werden.
Allerdings enthalten Formeln in der Regel auch Formelfunktionen oder Operatoren. Ich verstehe einfach nicht, warum du nicht einfach das Schlagwort "Evaluate" angebracht hast, wenn dir der Sachverhalt tatsächlich klar war?!
Viele Grüße
Martin
Anzeige
Hansueli hat natürlich recht, ...
15.06.2020 20:17:39
Luc:?
…Martin,
das hat schon etwas mit Xl-Arrays in Fmln, sog MatrixKonstanten, zu tun, aber eben nicht viel mit VBA (vgl unten). Xl kennt keine echten (Ko-)Vektoren, denn es ist streng matrix-basiert, d.h., jede Zelle hat 2 Koordinaten (bzw Indizes), einer für die Zeile und einer für die Spalte. Damit wären alle ZellBereiche 2dimensional. Für EinzelZeilen ist das mit VBA schwer überprüfbar, da ein Kovektor in VBA stets 1dimensional dargestellt wird und somit sowohl ein ZeilenBereich als auch eine entsprd MatrixKonstante automatisch in diese Form gebracht wird. Bei EinzelSpalten ist das nicht so, da auch in VBA die Unterscheidung zwischen Kovektor und Vektor wichtig ist. Letzterer hat also immer eine 2.Dimension, sofern es sich um ein sog VBA-Array handelt.
Ein VBA-Array stellt aber einen Sonderfall dar, der dem Aufbau von Xl geschuldet ist, nur wurde der in VBA auf n-Dimensionalität ausgedehnt (n = ca 50-60, ggf 56, Limitierung b.Bed nachlesen). Die meisten PgmmierSprachen arbeiten aber mit einfachen 1dimensionalen Arrays in Kombination, sog Tensoren, was einfacher ist und eine einfachere Handhabung inkl Zerlegbarkeit erlaubt. Ein Tensor ist also ebenso eine Fkt wie ein Array, nur das VBA (u.v.a. PgmmierSprachen) sie nicht sprachlich unterscheidet.
Hierzu hatte Daniel in der ZwischenZeit schon etwas geschrieben, was aber nicht ganz genau und nur teilweise richtig ist. Was du gezeigt hast und Daniel als Bsp aufgegriffen hat, ist nämlich kein 2dimensionales VBA-Array, sondern ein 2stufiger Tensor(1,1) [1+1=2 → Stufe bzw Rang]. Auf diese Weise kann man übrigens auch einen Vektor konstruieren, nur dürfen die Elemente-Arrays dann nur je 1 Wert enthalten. So könnte man in VBA auch einen quasi 1dimensionalen Vektor erhalten. Daniel irrt allerdings insofern, dass VBA diese Tensoren automatisch umwandelt. VBA kann sie nur verarbeiten. Sobald man eine SubProzedur einen solchen Tensor auf ein Xl-Blatt ausgeben lassen will, wird es Probleme geben. Die treten nur dann nicht auf, wenn sie Ergebnis einer UDF sind, die in einer ZellFml eingesetzt wird. Dann sorgt der FmlText-Interpreter von Xl für die Anpassung an die XL-2-Dimensionalität, sofern das auch möglich ist.
Insofern passt deine Kurzform tatsächlich nicht zu diesem Array, denn während du die Elemte der ersteren wie üblich identifizieren kannst, das 1. mit (1, 1), geht das beim Tensor nicht. Das 1.Element wird hier standardmäßig so indiziert: (0)(0)
Der 1dimensionale Kovektor stimmt in VBA mit dem 1stufigen Tensor(0,1) überein. Eine weitere Übereinstimmung ist bei den sog skalaren (0stufigen) Tensoren(0,0) zu finden, denn diese sind auch Ergebnis mancher Xl-Fktt (zB ZEILE und SPALTE). Wird das bei der Anwendung von UDFs ohne IsArray-Berücksichtigung in ZellFmln nicht beachtet, ist das Ergebnis ein FehlerWert, obwohl diese Fktt ja einen vermeintlichen Einzelwert liefern (sieht man im FktsAssi, auf den leider gern verzichtet wird). Das hat aber auch Vorteile, denn auf echte Einzelwerte (Skalare) kann keine Schleife angewendet wdn, weil sie eben nicht indizierbar sind.
Luc :-?
Anzeige
Was genau Luc ist denn
15.06.2020 21:38:25
Daniel
An meinem Beitrag ungenau und nicht richtig?
Dass VBA die Tensoren automatisch umwandelt, habe ich so nicht geschrieben.
Als lies bitte genau, bevor du was zu andern Beiträgen schreibst.
Wie soll man denn dann das hier verstehen, ...
15.06.2020 22:15:51
Luc:?
…Daniel:
VBA ist zwar in der Lage, so ein Konstrukt bei Bedarf und erfüllten Voraussetzungen in ein echtes zweidimensionales Array zu wandeln …
Das klingt doch sehr nach einem Automatismus (ala Xl), während eine pgmmierbare Umwandlung doch eher selbstverständlich wäre. Es ist also zumindest missverständlich und somit unexakt. Denn immerhin bist du ja der Meinung, dass du meine Erläuterungen, falls angeblich nicht ausführlich genug, nacherklären musst. Diese Freiheit habe ich mir nun auch bei dir genommen… :-]
Luc :-?
Anzeige
AW: Wie soll man denn dann das hier verstehen, ...
15.06.2020 22:41:33
Daniel
Das man so ein Konstrukt mit VBA in ein zweidimensionales Array umwandeln kann, wenn man das Bedürfnis dazu hat, aber nicht, dass es automatisch geht.
Und naja, viel ausführlicher als du kann man ja nicht erklären, man muss sich ja nur die Länge deines Beitrags anschauen.
Ich habe mich auch nicht auf deinen Beitrag bezogen und diesen weder kommentiert noch kritisiert so wie du das tust.
Letzteres konntest du ja auch nicht, ...
15.06.2020 23:59:25
Luc:?
…Daniel,
weil mein diesbzgl Beitrag zum Zeitpkt des deinen erst versprochen, noch nicht aber geschrieben war.
Luc :-?
AW: Letzteres konntest du ja auch nicht, ...
16.06.2020 00:30:12
Daniel
Dann schreib auch keinen Unsinn über andere.
Ingenwann reichts.
Anzeige
Mir schon lange, Ingenwann! :-> owT
16.06.2020 22:34:48
Luc:?
:-?
AW: Kurzformen zum Anlegen eines Arrays
15.06.2020 14:25:27
Rudi
Hallo,
das hat weniger mit dem Anlegen von Arrays als mit der Funktion EVALUATE (Auswerten) zu tun.
Es wird der Ausdruck in den [] ausgewertet. Das ist die Kurzform. Es wird schlichtweg versucht, was aus dem Ausdruck in den [] zu machen. ;-)
A = [{10,20,30}] kann man auch als A = Evaluate("{10,20,30}") schreiben.
A=[Sum(5,5)] ergibt z.B. 10.
A=[B1] ergibt den Wert aus B1.
Gruß
Rudi
AW: Kurzformen zum Anlegen eines Arrays
15.06.2020 14:37:25
Martin
Hallo Rudi,
hab vielen Dank. In der Dokumentation zur Evaluate-Methode steht es wie von dir beschrieben:
Die Verwendung eckiger Klammern (etwa "[A1:C5]") entspricht dem Aufruf der Evaluate-Methode mit einem Argument String.
Aber ehrlich: Wonach hätte ich suchen sollen, um das selbst herauszubekommen?
Nochmals Danke!
Viele Grüße
Martin
Anzeige
Wobei noch etwas zu beachten ist, ...
15.06.2020 16:14:50
Luc:?
…Martin,
der Ausdruck in {} ist eine sog MatrixKonstante (hier als Kovektor notiert), mit der VBA nichts anfangen kann, denn die ist nur xl-spezifisch. Und genau so etwas, nämlich FmlTexte (auch ohne führendes =) wertet die vbFkt Evaluate aus, keine vbFktt! Das erklärt auch den 1basierten Index.
Der Nachteil dieser Kurzform ist, dass sie keine zusammengesetzten Texte auswerten kann und natürlich nur Original-US-Notationen, ganz so wie eben auch Evaluate. Außerdem wdn solche Ausdrücke gern mehrfach berechnet. Evaluate hat 2 EinsatzEbenen, Application und Worksheet. Bei ersterer wird gern doppelt so oft berechnet, was bei Verwendung in UDFs in ZellFmln schon eine Performance-Bremse sein kann. Mit der Kurzform hast du aber keine Wahl. µS empfiehlt das auch nicht.
Hansueli geht übrigens davon aus, dass du ein Fast-Profi bist, weil du mal so etwas in der Art geschrieben hast. Aber wie man sieht, kennst du doch so manches nicht… ;-]
Oben ist dir übrigens ein Fehler unterlaufen, weil du offensichtlich nicht die unterschiedlichen Array-Typen kennst, wodurch deine Kurzform eben nicht zum Obigen passt. Dazu schreibe ich dir nachher oben noch was.
Gruß, Luc :-?
„Die universelle Befähigung zur Unfähigkeit macht jede menschliche Leistung zu einem unglaublichen Wunder.“ Stapps ironisches Paradoxon
Nichtsdestotrotz Durchblick verbessern mit …

Anzeige
AW: Wobei noch etwas zu beachten ist, ...
15.06.2020 17:36:10
Martin
Hallo Luc,
ich danke auch dir für deine Erklärung.
Ich finde es übrigens sehr interessant, wie ich auf einen älteren Beitrag "festgenagelt" werde und der Zusammenhang meiner Äußerung unter den Teppich gekehrt wird. Ich hatte mein Wissenslevel damals tatsächlich als "Fortgeschritten bis Profi" bezeichnet, weil einem Anfänger von einem Helfer mit einer recht herablassenden Art mit Verweis auf die Microsoft Hilfe geantwortet wurde. Diese Hilfe war in dem Fall aber tatsächlich nicht sehr verständlich formuliert. Hier der Beitrag:
https://www.herber.de/forum/cgi-bin/callthread.pl?index=1762191
Nun habe ich mein angegebenes Level bereits auf "VBA-Basiswissen" heruntergestuft, aber wenn du möchtest, dann kann ich künftig auch "Kaum Excel/VBA-Kentnisse" angeben :-(
Viele Grüße
Martin
Anzeige
Das habe ich nicht verlangt und BW ist evtl ...
15.06.2020 19:05:05
Luc:?
…etwas untertrieben, Martin… ;-]
Luc :-?
AW: Kurzformen zum Anlegen eines Arrays
15.06.2020 16:18:29
Daniel
Hi
wenn man sich klar machen will, was die [] können und wie sie funktionieren, muss man sich einfach vorstellen, dass diese in VBA das "Wurmloch" zu Excel darstellen.
Dh innerhalb dieser Klammern programmierst du nicht mehr in VBA, sondern du "formulierst" in einer Excelzelle, das Ergebnis dieser Formel wird dann nach VBA zurückgegeben.
noch ein hinweis, das:
A = Array(Array(10, 20, 30), Array(110, 120, 130), Array(210, 220, 230))
erzeugt kein zweidimensionales Array!
A ist ein eindimensionales Array, bei dem die Einzelwerte keine Einzelwerte sind, sondern wiederum eindimensionale Arrays.
Das merkst du daran, dass Ubound(A, 2) oder die Einzelwertabfrage A(1, 1) so nicht funktionieren.
VBA ist zwar in der Lage, so ein Konstrukt bei Bedarf und erfüllten Voraussetzungen in ein echtes zweidimensionales Array zu wandeln, aber zunächst einmal ist das ganze eindimensional.
Gruß Daniel
Anzeige
AW: Kurzformen zum Anlegen eines Arrays
15.06.2020 17:44:02
Martin
Hallo Daniel,
ja, ich habe es geprüft und muss dir Recht geben. Bevor ich meinen Beitrag geschrieben hatte, habe ich die Variable(n) sogar überwacht, konnte in der Darstellung unter "Ausdruck" aber keinen Unterschied feststellen. Aber unter "Typ" ist es ersichtlich. Hätte ich es mal gleich mit LBound oder UBound getestet.
Viele Grüße
Martin
Mir gefällt's - für meine Konstruktionsmakros
15.06.2020 19:06:07
lupo1

Sub T()
[A1:A3] = [{"Dies";"ist";"praktisch"}]
[B1:B3] = WorksheetFunction.Transpose(Split("Dies ist praktisch"))
End Sub
A ist halt bei wenigen Daten kürzer als B. Also: Danke, Martin!
So, so, Lupo, das kanntest Du noch nicht?! ;-] owT
15.06.2020 20:19:52
Luc:?
:-?
Anzeige
Differenzierte Antwort
16.06.2020 09:12:46
lupo1
Bei snb habe ich zum ersten Mal
[A1] = [...]
gesehen (Kurzform von Evaluate).
Du hast recht - von daher hätte ich es schon wissen müssen.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige