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

Probleme mit .formulaarray

Probleme mit .formulaarray
11.02.2014 10:59:57
Maria
Hallo Forumgemeinde,
erstmal vielen Dank für die vielen Tipps und Lösungen die ich bisher hier im Forum gefunden habe! Nun möchte ich selbst eine Frage stellen, da ich auch nach langer Internetrecherche und Ausprobieren nicht auf meinen Fehler komme.
Es geht um diese Formel in meinem Code

With wsData.Range(ColumnToLetter(ColEndeVorg) & FirstRow & ":" & ColumnToLetter(ColEndeVorg) &   _
_
_
x)
.FormulaArray = "=if(rc" & ColOrt & """in Zukunft"",MAX(IF((R" & FirstRow & "C" & ColFA & ":R[ _
_
_
-1]C" & ColFA & "=RC" & ColFA & "),R" & FirstRow & "C" & ColEnde & ":R[-1]C" & ColEnde & ",RC" & _
_
ColEnde & ")),"""")"
.Value = .Value
.NumberFormat = "dd.mm.yyyy"
End With

ColEndeVorg, ColFA, ColEnde sind dabei festgelegte Spaltenindizes (as integer), FirstRow die erste Datenzeile (Zeile 6) und x die letzte beschriebene Zeile (wird zuvor ermittelt. Die Formel funktioniert leider nicht...
Das "Problem" steckt bereits in folgendem Teil der aus übersichtlicheren und vereinfachten _
Formel, der auch zur Arrayrechenweise zwingt:

With wsData.Range("w6:w" & x)
.FormulaArray = "=MAX(IF((R6C2:R[-1]C2=RC2),R6C16:R[-1]C16,RC16))"
.Value = .Value
.NumberFormat = "dd.mm.yyyy"
End With

Ich dachte bisher, dass man .FormulaArray genau wie .FormulaR1C1 direkt in eine gesamte Spalte/Spaltenbereich schreiben kann. Wenn ich dass mache, steht aber in jeder Zeile der Bezug zur ERSTEN Zeile (also hier Zeile 6). Bspw. RC2, was normalerweise in Zeile 7 dann R7C2 ergibt etc. scheint nicht zu funktionieren. Auch R[]C2 oder R[0]C2 löst bei mir das Problem nicht.
Nun habe ich gefunden, bereits zwei Lösungsvarianten im Netz gefunden, die bei mir aber beide auch nicht einwandfrei funktionieren und mir auch mehr als Umgehung des Problems anstatt Lösung erscheinen.
1.
Die Formel als .FromulaR1C1 eingeben und anschließend

.FormulaArray=.FormulaR1C1

was getestet mit einigen Zeilen auch funktioniert, aber bei meiner vollständigen Liste ( _ aufgrund der Input-Datenquelle über 67 000 Zeilen, die ich anschließend über Pivot erfolgreich aussortiere/auswerte) einen Laufzeitfehler 13: Typen unverträglich liefert. Ich habe schon viele Varianten ausprobiert und festgestellt, dass der Code bis x= 65 541 funktioniert und bei 64 542 abbricht - also könnte ich den Bereich splitten und auf 2 Mal die Formel eintragen. Allerdings bricht der Teil

.value =. value 
ab mit der Fehlermeldung Überlauf. Dies lässt sich wiederum umgehen, wenn man die gesamte Spalte kopiert über .copy und dann über pastespecial xlpastevalues nur die Werte einfügt - aber wieder nur ein Umweg...
2.
Die Array-Formel nicht in den gesamten Bereich, sondern nur in die erste Zeile einfügen und dann kopieren.
With wsData.Range("w6")
.FormulaArray = "=MAX(IF((R6C2:R[-1]C2=RC2),R6C16:R[-1]C16,RC16))"
.copy Destination:= wsData.Range("w7:w" & x)
.Value = .Value
.NumberFormat = "dd.mm.yyyy"
End With

Gleiches Problem bei .value =.value ...
Weis jemand wie ich das Problem richtig löse und am Besten in den Bereich wsData.Range("w6:w" & x) direkt die Arrayformel eintragen kann? Was mache ich falsch, dass bei mir der Bezug immer auf die erste Zeile ist?
Irgendwie ist für mich .FormulaArray wie ein Buch mit Sieben Siegeln - viel gelesen, aber immer noch nicht komplett verstanden...
Irgendwelche andere Vorschläge?
Sorry, dass es so lange geworden ist, aber jetzt wisst ihr, was ich schon alles ausprobiert habe, und dass es immer noch nicht funktioniert :)
Vielen Dank für jeden Tipp!
Gruß
Maria

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Probleme mit .formulaarray
11.02.2014 11:29:14
Rudi
Hallo,
eine Matrixformel kann man nicht auf einen Schlag in einen Bereich einfügen. Das geht auch von Hand nicht. Ganz simpler Test: B1:B10 markieren, =A1 shift+strg+enter. In allen Zellen steht {=A1}.
.Value = .Value ist erheblich langsamer als die .PasteSpecial-Methode und sollte nur bei einzelnen Zellen oder sehr kleinen Bereichen verwendet werden.
Fazit: Lösung 2 mit Pastespecial ist der richtige Weg.
Gruß
Rudi

AW: Probleme mit .formulaarray
11.02.2014 13:47:45
Maria
Hallo Rudi,
vielen Dank für deine Erklärungen! Ich habe es jetzt genau so wie du beschrieben hast gemacht.
Ich habe mich von folgendem Forumsbeitrag in die Irre leiten lassen: https://www.herber.de/forum/archiv/588to592/591072_FormulaArray_vs_Formula.html
Aber dies scheint ein Sonderfall zu sein...
Nochmals vielen Dank für die schnelle Hilfe!
Wünsche dir noch einen schönen Tag.
Gruß
Maria

Anzeige
Deine Formulierung ist ziemlich missverständl, ...
11.02.2014 17:10:14
Luc:-?
…Rudi;
natürlich kann man eine MatrixFml im Ggsatz zu normalen Fmln „auf einen Schlag“ in einen ganzen Bereich einfügen, aber nur, wenn sie auch für den ganzen Bereich gilt. Wenn es sich hier aber um 1zellige MatrixFmln handelt, geht das natürlich auch nicht anders als mit normalen. ;->
Aber…, die lassen sich auch auf 1× in einen ZellBereich schreiben, wenn man das über die Bildung eines Datenfelds realisiert wie folgd Bsp beweist:
Sub testFmlBer()
Const adQBer$ = "A1:A3", adZBer$ = "B1:B3", _
txQWt$ = "{1;2;3}", txZWt$ = "{""=A1"";""=A2"";""=A3""}"
Dim QWt, ZWt
QWt = Evaluate(txQWt): ZWt = Evaluate(txZWt)
Range(adQBer) = QWt: Range(adZBer).Formula = ZWt
End Sub
Gruß Luc :-?

Anzeige
AW: Deine Formulierung ist ziemlich missverständl, ...
12.02.2014 21:36:23
Maria
Hallo Luc,
danke für deine Antwort. Leider muss ich nochmal nachfragen:
Wenn ich Google richtig verstanden habe, ist es bei mir eine einzellige Matrixformel, weil nur ein Wert als Ergebniss rauskommt, wie bspw auch bei Summewenn etc.
Allerdings habe ich es auch nach x Versuchen nicht geschafft, die Formel auf MAX(WENN... anzupassen.
"Fehler 2015"
Liegt das daran dass bei Evaluate immer absolute Bezüge in der A1-Bezugsart nötig sind und so R[-1]C2 nicht geht? Oder habe ich dich falsch verstanden?
Vielen, vielen Dank!
Schöne Grüße
Maria

AW: Deine Formulierung ist ziemlich missverständl, ...
14.02.2014 12:08:49
Maria
Sorry, ich hab das Häckchen für offene Fragen vergessen.
Würde mich wahnsinnig über eine Antwort freuen, da ich immer noch nicht weitergekommen bin.
Danke und Gruß
Maria

Anzeige
AW: Deine Formulierung ist ziemlich missverständl, ...
14.02.2014 12:24:22
EtoPHG
Hallo Maria,
Ich habe in einem neueren Beitrag einen Lösungsvorschlag bezgl. Matrix-Formeln einfügen gemacht, der auch mit einem Copy arbeitet. Vielleicht liefert er dir einen Ansatz.
Deine Überläufe entstehen vermutlich wegen falscher Zeilen- und Spalten-Variablen. Solche sollten immer vom Datentyp Long sein. Egal wie kleine Bereiche gebraucht werden.
Während dem Einfügen von Matrixformeln mittels Code würde ich die automatische Berechnung ausschalten und anschliessend u.U. nur auf die eingefügten Bereiche per Code ausführen.
Gruess Hansueli

Anzeige
Array-Formel ohne Copy
15.02.2014 16:38:13
Maria
Hallo EtoPHG,
der Lösungsansatz mit .copy funktioniert.
Aber es funktioniert auch der Code von Luc, der die Formel direkt in alle Zellen ohne .copy schreibt!!! Das ist natürlich eine super elegante Lösung!
Leider bin ich noch nicht ganz dahinter gestiegen was der Code genau macht bzw. bei allen meinen Anpassungsversuchen bringt der Code den Fehler 2015...
Kann mir bei der Anpassung des Codes noch jemand helfen oder einen Tipp geben?
Sub testFmlBer()
Const adQBer$ = "A1:A3", adZBer$ = "B1:B3", _
txQWt$ = "{1;2;3}", txZWt$ = "{""=A1"";""=A2"";""=A3""}"
Dim QWt, ZWt
QWt = Evaluate(txQWt): ZWt = Evaluate(txZWt)
Range(adQBer) = QWt: Range(adZBer).Formula = ZWt
End Sub
Danke und Gruß
Maria

Anzeige
Ach je, Maria, dich hatte ich inzwischen ganz ...
16.02.2014 00:43:57
Luc:-?
…vergessen (sogar mehrmals), zumal meine AW ja auch an Rudi gerichtet war. Mein Bsp war deshalb ja auch nicht speziell auf deine Bedürfnisse, die so genau allerdings auch niemand außer dir kennt, ausgerichtet. ;-)
Aus meiner Sicht begehst du einen KardinalFehler, der aber nicht in 1.Linie darin besteht, dass du das mit dem FormulaArray falsch verstanden hättest, eher im Ggteil → die R1C1-AdressNotation ist hier für RelativAdressen idR zwingend, sondern indem du mitten aus deinen ganz speziellen Lösungs­über­legungen heraus eine sich aus genau diesen ergebende Frage an uns richtest ohne dein eigentliches Problem zu benennen, geschweige denn ausreichend zu beschreiben. Es ist nun sehr schwer, aus diesen wenigen Angaben Letzteres zu rekonstruieren. Du tust also den 2.Schritt vor dem 1. und dir und uns damit keinen Gefallen!
Dein 1.Schritt wäre eigentlich, manuell eine vernünftige und auch fktionierende Fml (MatrixFml wohl nur wg WENN) zu erzeugen, die genau das tut, was du erreichen willst. Ohne entsprd Verifizierung deinerseits wissen wir nicht mal das, da darf einem deine Fml schon mal seltsam vorkommen!
So, dann prüfe doch erst mal nach, ob mit folgd kleinen TestPgm die Fmln erzeugt wdn, die du haben willst (ohne dass du sie gleich mit ihrem Ergebnis überschreibst und somit nicht auf Richtigkeit prüfen kannst):
Sub testMaria()
Const naWsh$ = "Tabelle1"
Dim x As Long, wsData As Worksheet
Set wsData = ThisWorkbook.Sheets(naWsh)
For x = 6 To 10
With wsData.Cells(x, 23)
.FormulaArray = "=MAX(IF(R6C2:R[-1]C2=RC2,R6C16:R[-1]C16,RC16))"
'            .Value = .Value
.NumberFormat = "dd.mm.yyyy"
End With
Next x
End Sub
Die NamensKonstante des Blattes kannst du frei ändern. Wenn hierbei alles stimmt, können wir ggf auch über eine schnellere Variante diskutieren, ansonsten wäre erstmal eine exakte Fml erforderlich.
Gruß + schöSo, Luc :-?

Anzeige
Ach, was soll's, ich schreibe dir doch gleich ...
16.02.2014 01:41:25
Luc:-?
…mal 2 mögliche EndVarianten für 1zellige MxFmln auf (die 2. ist schneller), Maria;
die Konstanten kannst du ja entsprd anpassen:
Sub testMaria1()        'Anm: Nur f.1zellige MxFmln!
Const anfZl As Long = 6, endZl As Long = 10, relSp As Long = 23, naWsh$ = "Tabelle1", _
txMxFml$ = "=MAX(IF(R6C2:R[-1]C2=RC2,R6C16:R[-1]C16,RC16))"
Dim x As Long, wsData As Worksheet
Set wsData = ThisWorkbook.Sheets(naWsh)
For x = anfZl To endZl
With wsData.Cells(x, relSp)
.FormulaArray = txMxFml: .NumberFormat = "dd.mm.yyyy": .Value = .Value
End With
Next x
Set wsData = Nothing
End Sub
Sub testMaria2()        'Anm: Nur f.1zellige MxFmln!
Const anfZl As Long = 6, endZl As Long = 10, relSp As Long = 23, naWsh$ = "Tabelle1", _
txMxFml$ = "=MAX(IF(R6C2:R[-1]C2=RC2,R6C16:R[-1]C16,RC16))"
Dim fmAnz As Long, relBer As Range, wsData As Worksheet
Set wsData = ThisWorkbook.Sheets(naWsh): fmAnz = endZl - anfZl + 1
With wsData
Set relBer = .Range(.Cells(anfZl, relSp), .Cells(endZl, relSp))
End With
With WorksheetFunction
'        relBer.FormulaArray = txMxFml   'Anm: Nur f.m-zellige MxFmln!
relBer.FormulaArray = .Transpose(Split(LTrim(.Rept(" " & txMxFml, fmAnz))))
End With
With relBer
.NumberFormat = "dd.mm.yyyy": .Value = .Value
End With
Set relBer = Nothing: Set wsData = Nothing
End Sub
Morrn, Luc :-?

Anzeige
Genial!!!
17.02.2014 11:00:31
Maria
Hallo Luc,
Vielen, vielen herzlichen Dank!!! Ich habe deine letzte Variante genommen und angepasst. Super, schnell und elegant! Da wäre ich NIE von selbst drauf gekommen!
Ich habe auch zugegebener Maßen etwas gebraucht um alle Codebestandteile zu verstehen und antworte deshalb auch erst zwei Tage später :)
Auch mit deiner Anmerkung, dass ich es mir schwerer mache als nötig ist, hast du sicherlich Recht.
Für mich war schwer einzuschätzen, welche Informationen ihr benötigt, oder was nur zusätzlich verwirrt (Und meine Frage ist ja schon eine Seite voll geworden ;))
Insgesamt ist mein Ziel eine Datei zu erstellen, bei dem man auf dem ersten Tabellenblatt bei mehren DropDown Felder seine Auswahl treffen kann und andere DropDownfelder dann teilweise die Auswahlmöglichkeit einschränken. Bei jedem Klick/Auswahl wird über den Code ein Diagramm angepasst und dann eben nur Daten entsprechend der aktuellen Auswahl dargestellt. Der Filter läuft über eine Pivottabelle.
Hierfür habe ich schon einige Module geschrieben und soweit funktioniert auch alles reibungslos.
Jetzt zu dem Problemfall im Speziellen. Bei meiner Datenquelle, die ich auch über VBA importiere stehen Aufträge mit allen nötigen Arbeitsfolgen und falls erledigt einem gemeldeten Fertig-Termin.
Starttermine für die Folgen gibt es keine, benötige ich aber für eine Darstellung auf dem Zeitstrahl (wie viele Aufträge hat/hatte wer wann in Bearbeitung? Wieviel kann er abarbeiten? Ist er überlastet etc.)
Die Logik ist nun, dass ich für den Starttermin der Arbeitsfolge den Endtermin des Vorgängers nehme (alle Arbeitsfolgen sind sequenziell). Allerdings geht es nicht, dass ich immer nur die Zeile oberhalb nehme, da es "richtige" Arbeitfolgen und Arbeitsfolgen "nur zur Info" (diese sind ohne Endtermin und sind erkennbar über ein besonderes Merkmal in einer anderen Spalte) gibt.
Also ist mein Ziel meiner Formel, das "letzte Datum" / "höchste Datum" / max zu nehmen, mit der Bedingung, dass es immer noch die gleiche Auftragsnummer ist und nur Vorgänger und nicht die Arbeitsfolge selbst oder irgendwelche Nachfolger berücksichtigt werden...
Aber dies alles nur zur Verdeutlichung...
Nochmal vielen herzlichen Dank. Es funktioniert mit einer vertretbaren Laufzeit und ich bin happy! Und außerdem habe ich noch viele andere Sachen gelernt wie das mit dem $ für String und dass ich durch einen Doppelpunkt nicht immer eine neue Zeile benötige und und und...
Schöne Grüße
Maria

Anzeige
Na, dann danke für die Erläuterung deiner ...
17.02.2014 23:12:17
Luc:-?
…Absichten, Maria;
ich konnte die fragliche MxFml nur schwer einordnen, also feststellen, ob sie auch richtig und tatsächlich 1zellig ist, aber das wird ja dann wohl so sein. ;-)
Was das Lernen betrifft → det wah'n bissken ooch meene Absicht, denn so sollte es eigentlich auch immer sein, newá…?! ;-)
Weiter viel Erfolg!
Gruß Luc :-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige