Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1816to1820
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
array formel in vba
09.03.2021 15:39:05
Fred
Hallo Excel Profis,
Ich habe da ein "Problem" mit einer Matrixformel. Lasse ich gewisse Makros laufen, dauert die Abarbeitung unglaublich lang an. Das ist erst so, seit ich eine Matrixformel (von Lupo1) nutzen möchte.
Mein Gedanke ging nun da hin, dass ich mit einem Makro diese gewisse Formel
1.) eintrage
2.) entsprechend runterkopiere
3.) und dann die Formeln in entsprechende Werte umwandele.
dachte, das geht mit folgenden Makro:
  With ActiveSheet
ENDE1 = Sheets("Basis").Cells(Rows.Count, 1).End(xlUp).Row - 0
Worksheets("Basis").Range("R2").FormulaArray = "=SUMME(WENNFEHLER(--(TEIL(WECHSELN(GLÄTTEN(""- _
11 ""&WECHSELN(N2;""+"";"" +""));"" "";WIEDERHOLEN("" "";199));SPALTE(B:AF)*199-198;199)-""TEIL(WECHSELN(GLÄTTEN(""-11 ""&WECHSELN(N2;""+"";"" +""));"" "";WIEDERHOLEN("" "";199));SPALTE(A:AE)*199-198;199)

"FormulaArray" ist doch in diesen Fall richtig!?
Kann mir bitte jemand helfen.
Gruss
Fred

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: array formel in vba
09.03.2021 16:05:40
onur
1) Formula.Array versteht nur ENGLISCHE Formeln.
2) Microsoft meint dazu:
Range.FormulaArray-Eigenschaft (Excel)
...
Gibt eine Arrayformel für einen Bereich zurück oder legt sie an. Gibt eine einzelne Formel oder einen Visual Basic-Array zurück (oder kann als solche(r) festgelegt werden). Wenn der angegebene Bereich keine Arrayformel enthält, gibt diese Eigenschaft nullzurück. Variant mit Lese-/Schreibzugriff.
Syntax
Ausdruck. FormulaArray
Ausdruck Eine Variable, die ein Range-Objekt darstellt.
Bemerkungen
Bei der FormulaArray-Eigenschaft sind maximal 255 Zeichen erlaubt.

Anzeige
AW: array formel in vba
09.03.2021 16:36:47
Fred
Hallo Onur,
ich muß also die Matrixformel (die ich nicht verstehe) in R1C1 umschreiben ?
Gruss
Fred

AW: array formel in vba
09.03.2021 16:42:01
onur
Englisch oder Deutsch ist etwas anderes wie A1 oder Z1S1.
Scgreibe mal in A1 eine Arrayformel und im Vba_editor-Direktfenster diese hier:
? Range("A1").FormulaArray.
Dann siehst du erstens, wie die Formel aussehen muss und zweitens, dass alle Befehle auf englisch sind.

AW: array formel in vba
09.03.2021 16:05:59
Daniel
HI
ist prinzipell schon richtig und machbar.
allerdings macht die länge der Formel an mehreren stellen probleme.
1. sie ist wahrscheinlich für den Recorder zu lang.
das kannst du damit beheben, dass du die Formel nicht direkt als ganzes angibst, sondern erst mal in eine Variable schreibst und das in mehreren Schritten:
also nicht
.FormulaArray = "=ganz lange Formel"

sondern
FO = "=erster Teil"
FO = FO & "zweiter Teil"
FO = FO & "dritter Teil"
.FormulaArray = FO
also die Formel so in abschnitte geteilt, dass es für dich übersichtlich ist und der Editor es verarbeiten kann.
2. Das größere Problem dürfte sein, dass die Formellänge, die .FormulaArray verarbeiten kann, stark limitiert ist, also wesentlich kürzer als du Formeln selber in Excel eingeben kannst. (ich meine 256 Zeichen)
Für normale Formlen gilt das auch, allerdings mit mehr Zeichen und hier gibt es einen Workaround.
Bei ArrayFormeln funktioniert der nicht und ich kenne keinen anderen Workaround.
wenn du sowieso mit Makros arbeitest, dann könntest du auch ggf die ganze Rechung in VBA machen. bei so text-Sachen hast du da auch mehr möglichkeiten das zu programmieren als mit Formeln.
vielleicht reicht es ja aus um die Sache zu beschleunigen, wenn du in der Formel bei allen Spalte(...)-Funktionen nicht die ganze Spalte als Zellbereich angibst (Spalte(B:AF)) sondern nur eine Zeile: Spalte(B$1:AF$1)
eine Ursache für die lange Rechenzeit könnte sein, die Formeln unnötig oft berechnet werden.
Eine Formel wird immer dann neu berechnet, wenn sich in dem Zellbereich, den sie verwenden, ein Wert ändert. Durch so angaben wie B:AF wird dieser Bereich allerdings sehr groß, was aber nicht notwendig ist, da die Inhalte aus diesem Bereich keinen Einfluss auf das Ergebnis haben.
Daher sollte man für die Spalte- und Zeile-Funktion die Zellbereiche so klein wie möglich wählen und möglichst auf Bereiche legen, die sich nicht ändern (überschriftenzeile).
Bei Abarbeitung von Makros kann es aber auch oft ausreichen, die automatische Neuberechnung von Formeln zu deaktivieren (Application.Calculation = xlcalculationmanual)
dann werden die Formeln nicht neu berechnet und das Makro läuft schneller.
hinter im Makro das einschalten nicht vergessen, denn diese Einstellung bleibt bei Makroende erhalten.
Gruß Daniel

Anzeige
AW: array formel in vba
09.03.2021 16:34:34
Yal
Hallo Fred,
es geht un dein Tor-Problem in
https://www.herber.de/forum/archiv/1816to1820/t1818527.htm#1818527
Ich wurde einfach die Eingabe mit einem UDF (User Defined Function) splitten:

Public Function InSpalten_aufteilen(Target) As String()
Dim A
Dim i
A = Split(Target.Text, " ")
For i = 0 To UBound(A)
A(i) = CStr(Application.Evaluate(A(i)))
Next
InSpalten_aufteilen = A
End Function
dann diese Function in der Blatt als Matrix-Formel verwenden:
Parameter aus der Spalte A,
Ergebnisse in die Spalte B bis ...
Spricht (ab Zeile 2):
Bereich B2:M2 (12 Spalten) markieren,
=InSpalten_aufteilen(A2) als Formel eingeben
mit Shift+Strg+Enter abschliessen
Der Trick: aus 45+2 wird durch "Evaluate" zu 47
Ab der Spalte O2 und 12 Spalten nach rechts
~f~=WENNFEHLER(((B2-C2) ~f~
Am Ende die Summe darauf.
VG
Yal

Anzeige
AW: array formel in vba
09.03.2021 16:45:04
Yal
Hallo Fred,
Mein Vorschlag war eigentlich doof: es geht besser, wenn man es direkt berechnet.
(dieses Code muss in einem Modul liegen, nicht im Code-Pane eines Worksheets)
Public Function AnzahlTor(Target, Abstand) As Long
Dim A
Dim i
Dim Mem
Dim S
A = Split(Target.Text, " ")
For i = 0 To UBound(A)
A(i) = Application.Evaluate(A(i))
If Mem  0 Then S = S - ((A(i) - Mem) 
Dann fügst Du in B2
=AnzahlTor(A5;10)
Wenn es nicht funktioniert, gehe über den Funktion-Assistent im Bereich "Benutzerdefiniert".
VG
Yal

AW: array formel in vba
09.03.2021 16:46:14
Fred
Hallo Yal, Onur und Daniel,
ich weis schon gar nicht mehr wo links und rechts ist ... einfach zuviel Programmiersprache ...
Vieleicht sollte ich wieder zum Ursprung gehen;
Die Suche nach einer Formel;
https://www.herber.de/bbs/user/144584.xlsx
Vieleicht gibt es doch eine "freundlichere Formel" als die Matrixformel von Lupo?
Gruss
Fred

Anzeige
AW: array formel in vba
09.03.2021 16:51:48
onur
Mehrere Werte in eine EINZIGE Zelle zu quetschen, ist ein "Liebestöter" für jede Formel, es verkompliziert alles ungemein.
Wieso nicht nebeneinander ?

AW: array formel in vba
09.03.2021 17:12:31
Fred
Hallo Onur,
du hast mir vor ca. 2 Jahren ein Makro geschrieben, welches die Trefferzeiten auseinander legt.
Hier sind die Zeiten in einzelnen Tellen abgelegt. Ich bräuchte allerdings die Lösung (wie oft innerhalb von 10min. getroffen wird) als "normale Formel",- damit ich diese auf Erweiterungen der Tabelle selbst anpassen kann.
Hier mal die Datei
https://www.herber.de/bbs/user/144602.xlsb
Gruss
Fred

Anzeige
AW: array formel in vba
09.03.2021 17:35:42
Fred
Hallo Yal und Onur,
den ganzen Tag mache ich an dieser "einen Sache" rum und gehe eher 2 Schritte zurück als nur einen vorwärts. Studiere was "wechseln, wiederholen ..." im Zusammenhang bedeutet undundund ...
Und dann die zwei Funktonen auf einen Schlag
von Yal
Public Function AnzahlTor(Target, HZ, Optional Abstand = 10) As Long
Dim A
Dim i
Dim Mem As Long
Dim S As Long
Dim Z As Long
'On Error Resume Next
A = Split(Target.Text, " ")
For i = 0 To UBound(A)
If A(i) = "" Then A(i) = 0
Z = CLng(Split(A(i), "+")(0))
A(i) = Application.Evaluate(A(i))
If (Z  45 And HZ = 2) Then
If Mem  0 Then S = S - ((A(i) - Mem) 
von Onur
Public Function Tore(tor As String, hz As Integer, dt As Integer) As Integer
Application.Volatile
Dim mi, mx, arr, i, t1, t2
mi = 0: mx = 45
If hz = 2 Then
mi = 46: mx = 90
End If
arr = Split(tor, " ")
For i = 0 To UBound(arr) - 1
If InStr(arr(i), "+") Then arr(i) = 999
t1 = Val(arr(i)): t2 = Val(arr(i + 1))
If t1 >= mi And t1 = mi And t2 
Vielen VIELEN DANK für eure kompetente Arbeit!!
Gruss
Fred

Anzeige
Vielen Dank für die Rückmeldung.
10.03.2021 11:17:19
Yal
Hallo Fred,
jetzt noch die Frage, die dein VBA-Kompetenz erhöhen wird:
Wo sind die Utnerschied zwischen die beiden Versionen? (sind ja sehr ähnlich)
Bei dem
If InStr(arr(i), "+") Then arr(i) = 999
von Onur könnte es dazu führen manche Tore in der Verlängerung ignoriert werden.
Das muss Du in ausführlich testen.
VG
Yal

UDF mit "kleinen Fehler"
13.03.2021 13:31:11
Fred
Hallo Excel,- VBA Profis,
ich habe vor geraumer Zeit ein UDF (Nutzer definierte Funktion) von Onur bekommen.Im Ergebnis soll die Funktion ermitteln, wie oft ein "Folgetreffer" innerhalb von einer angegebenen Zeit und angegebener Halbzeit, gefallen ist.
Hier die Funktion:
Public Function Tore(tor As String, hz As Integer, dt As Integer) As Integer
Application.Volatile
Dim mi, mx, arr, i, t1, t2
mi = 0: mx = 45
If hz = 2 Then
mi = 46: mx = 90
End If
arr = Split(tor, " ")
For i = 0 To UBound(arr) - 1
If InStr(arr(i), "+") Then arr(i) = 999
t1 = Val(arr(i)): t2 = Val(arr(i + 1))
If t1 >= mi And t1 = mi And t2 
Ich mußte nun feststellen, dass die ermittelte Anzahl "nur" für die 2. Hz korrekt sind.
Die zu ermittelnde Anzahl in der 1. Halbzeit ist teilweise nicht korrekt.
Die "Trefferzeiten" stehen alle in EINER Zelle und zu Beginn steht ein Leerzeichen. Ich habe festgestellt, dass wenn ich dieses Leerzeichen lösche, die Anzahl von der Funktion richtig wiedergegeben wird.
Meine Frage;
Kann mal bitte jemand auf die Funktion schauen und evt. dahin ergänzen, dass dieses "erste Leezeichen" bei der Berechnung entsprechend berücksichtigt wird?
Vieleicht alles ein bischen wirre geschrieben, daher eine Beispielmappe mit dieser Funktion;
https://www.herber.de/bbs/user/144730.xlsb
Gruss
Fred

Anzeige
AW: UDF mit "kleinen Fehler"
13.03.2021 15:31:22
onur
Mach aus
arr = Split(tor, " ")

das
arr = Split(LTrim(tor), " ")


Onur: Perfekt!
13.03.2021 15:35:07
Fred
vielen Dank Onur!
Gruss
Fred

UDF mit "kleinen Fehler"
13.03.2021 13:31:31
Fred
Hallo Excel,- VBA Profis,
ich habe vor geraumer Zeit ein UDF (Nutzer definierte Funktion) von Onur bekommen.Im Ergebnis soll die Funktion ermitteln, wie oft ein "Folgetreffer" innerhalb von einer angegebenen Zeit und angegebener Halbzeit, gefallen ist.
Hier die Funktion:
Public Function Tore(tor As String, hz As Integer, dt As Integer) As Integer
Application.Volatile
Dim mi, mx, arr, i, t1, t2
mi = 0: mx = 45
If hz = 2 Then
mi = 46: mx = 90
End If
arr = Split(tor, " ")
For i = 0 To UBound(arr) - 1
If InStr(arr(i), "+") Then arr(i) = 999
t1 = Val(arr(i)): t2 = Val(arr(i + 1))
If t1 >= mi And t1 = mi And t2 
Ich mußte nun feststellen, dass die ermittelte Anzahl "nur" für die 2. Hz korrekt sind.
Die zu ermittelnde Anzahl in der 1. Halbzeit ist teilweise nicht korrekt.
Die "Trefferzeiten" stehen alle in EINER Zelle und zu Beginn steht ein Leerzeichen. Ich habe festgestellt, dass wenn ich dieses Leerzeichen lösche, die Anzahl von der Funktion richtig wiedergegeben wird.
Meine Frage;
Kann mal bitte jemand auf die Funktion schauen und evt. dahin ergänzen, dass dieses "erste Leezeichen" bei der Berechnung entsprechend berücksichtigt wird?
Vieleicht alles ein bischen wirre geschrieben, daher eine Beispielmappe mit dieser Funktion;
https://www.herber.de/bbs/user/144730.xlsb
Gruss
Fred
Anzeige

320 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige