Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1660to1664
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

Formula Array

Formula Array
15.12.2018 03:06:53
Domi
Hallo zusammen,
Ich bräuchte mal eure Hilfe zu Array-Formeln in VBA.
Bei meiner jetzigen Formel:
Worksheets("Datenabfrage").Range("B2").FormulaArray =VLOOKUP(24 & "a",CHOOSE({1,2},A17:A1871 & B17:B1871,C17:C1871),2,FALSE)
bekomme ich immer einen Syntax-Fehler bei der geschweiften Klammer nach "CHOOSE".
Ursprüngliche Formel:
{=SVERWEIS(24&"a";WAHL({1.2};A17:A1871&B17:B1871;C17:C1871);2;FALSCH)}
Diese Formel hatte ich vorher in der Zelle B2 als Formel stehen und
sie hat auch funktioniert. Nur ich will, wenn möglich, die Formeln in VBA-Code umwandeln, damit die Zellen frei von Formeln sind.
Vielleicht habt ihr ja eine Idee

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Deine Fml-Umwandlung wäre im Prinzip richtig, ...
15.12.2018 05:14:13
Luc:-?
…Domi,
nur ist es oft besser, hier die R1C1-Schreibweise zu benutzen. Außerdem hast du vergessen, und das ist dein HauptFehler(!), dass es sich bei Fmln um Text handelt. Du kannst der Range-Eigenschaft .FormulaArray also nur einen Fml-Text (= "=…") zuweisen, der dann allerdings auch zum Eintrag dieser Fml in die betroffene Zelle führt, was du ja eigentlich vermeiden willst. Allerdings könntest du die Fml anschließend durch ihr Ergebnis ersetzen.
Wenn du ganz ohne temporär eingetragene Fmln auskommen willst, musst du ganz anders herangehen, wobei zu beachten ist, dass dir in VBA normalerweise nicht der Xl-Fml-Interpreter zV steht, dessen Wirken erst dazu führt, dass die Fml auch berechnet wdn kann. Du kannst in VBA zwar die meisten Xl-Fktt benutzen, aber nur in ihrer Reinform über bspw Application.VLookUp oder WorksheetFunction.VLookUp. Dann müssen ihre Argumente aber auch VBA-gerecht sein und Matrix­Kon­stan­ten gehen gar nicht! Dafür müsstest du Array(1, 2) schreiben, wobei zu bezweifeln ist, dass das fktioniert, denn VLookUp erwartet hier eigentlich einen Einzelwert, kein Array. Dass das in einer ZellFml trotzdem fktioniert, ist dem Fml-Text-Interpreter zu verdanken. Folglich bliebe als einzige Möglichkeit, die Fml unverändert zu verwenden, den Fml-Text auszuwerten. Die vbMethode Evaluate macht das (bedingt) unter Nutzung des Xl-Fml-Text-Interpreters. Das Ergebnis musst du dann allerdings direkt der Zelle zuweisen (.Value), keiner Fml-Eigenschaft, also .Value = Evaluate("VLookUp(…)") schreiben! Besser ist allerdings, Worksheets("Datenabfrage").Evaluate zu schreiben, denn das wird nur halbsooft berechnet wie (Application.)Evaluate.
Morhn, Luc :-?
Anzeige
AW: Deine Fml-Umwandlung wäre im Prinzip richtig, ...
15.12.2018 21:38:20
Xyz
Vielen lieben Dank für die ausführliche Erklärung :)
Ich teste mal ein bisschen rum, ob das klappt. Danke!
Bitte sehr, aber eins muss ich doch korrigieren, …
16.12.2018 01:10:32
Luc:-?
…Xyz-Domi,
beim Versuch, deine Fml mit meiner neuesten Kreation zu adaptieren, und zwar diesmal nicht in einer ZellFml, sondern aus einer Sub­Prozedur heraus, ist mir aufgefallen, dass WAHL (Choose) doch so pgmmiert wurde, dass sie ein Array im 1.Argument erkennt und das dann so umsetzt, dass man mit dieser Fkt Matrizen aus (Zeilen-)Kovektoren bzw (Spalten-)Vektoren aufbauen kann, was quasi eine Art von Ggstück zu diskontinuierlichen Bereichen wäre, die man mit INDEX (bedingt an-)ordnen kann. Das ist wohl leider wenig bekannt, obwohl es sogar aus der Xl-Hilfe hervorgeht! Der Xl-FmlText-Interpreter wäre hierfür also nicht erforderlich, aber für die anderen WAHL-Argumente, besonders das zusammengesetzte 2. Man könnte also auch statt …
Worksheets("Datenabfrage").Range("B2").FormulaArray = "=VLOOKUP(""24a"",CHOOSE({1,2},A17:A1871&B17:B1871,C17:C1871),2,FALSE)" für den Fml-Ein­trag in Zelle B2 oder …
Worksheets("Datenabfrage").Range("B2") = Evaluate("VLOOKUP(""24a"",CHOOSE({1,2},A17:A1871&B17:B1871,C17:C1871),2,FALSE)") auch …
With WorksheetFunction
Worksheets("Datenabfrage").Range("B2") = .VLookup("24a", .Choose(Array(1, 2), _
ActiveSheet.Evaluate("A17:A1871&B17:B1871"), Range("C17:C1871")), 2, False)
End With
…schreiben. Wollte man ganz auf Evaluate verzichten, müsste das 2.Argument zyklisch gebildet wdn:
Const adQBer1$ = "A17:B1871", adQBer2$ = "C17:C1871", adZBer$ = "B2", suchWert$ = "24a"
Dim rx As Long, xr As Variant
ReDim jCol(Range(adQBer1).Rows.Count - 1, 0)
For Each xr In Range(adQBer1).Rows
jCol(rx, 0) = xr.Cells(1) & xr.Cells(2): rx = rx + 1
Next xr
eCol = Range(adQBer2)
With WorksheetFunction
Worksheets("Datenabfrage").Range(adZBer) = .VLookup(suchWert, .Choose(Array(1, 2), jCol, _
eCol), 2, False)
End With
jCol = Empty: eCol = Empty
Schö3AdSo, Luc :-?
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige