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

FormulaArray-Problem

FormulaArray-Problem
Sebastian
Hi,
ich habe ein Problem mit der Zuweisung einer Matrixformel per VBA.
Wenn ich die unten stehende Formel per .Formula= eingebe, funktioniert es (nur eben nicht als Matrixformel, somit recht wertlos).
Wenn ich sie per .FormulaArray zuweise, bekomme ich die Fehlermeldung
"Die FormularArray-Eigenschaft des Range-Objektes kann nicht zugewiesen werden."
Ich habe mich über die Limitationen informiert und weiß, dass es einen Bug gibt, wessentwegen 255 Zeichen Maximum nicht überschritten werden dürfen
- der String ist aber bei weitem nicht so lang (207 Zeichen), auch die deutsche "Übersetzung", die Excel daraus macht, ist mit 227 unterhalb des Limits.
Der zugewiesene String lautet:
"=IF(J3="""","""",IF(SUM(IF(MOD(COLUMN(L3:BB3),3)=0,L3:BB3,0))=0,"""",ROUND(SUM(IF(MOD(COLUMN(J3:AZ3)-1,3)0,0,IF(ISNUMBER(J3:AZ3)*ISNUMBER(L3:BB3),J3:AZ3*L3:BB3,0)))/SUM(IF(MOD(COLUMN(L3:BB3),3)=0,L3:BB3,0)),0)))"

und er steht für die (Matrix-)Formel:
{=WENN(J3="";"";WENN(SUMME(WENN(REST(SPALTE(L3:BB3);3)=0;L3:BB3;0))=0;"";  RUNDEN(SUMME(WENN(REST(SPALTE(J3:AZ3)-1;3)0;0;WENN(ISTZAHL(J3:AZ3)*ISTZAHL(L3:BB3);J3:AZ3*L3:BB3; 0) ))/SUMME(WENN(REST(SPALTE(L3:BB3);3)=0;L3:BB3;0));0))) }

Aufgabe ist es, den Durchschnitt gewichteter Werte zu erzeugen:
die jeweils erste (Punkte) und dritte (Gewichtung) Spalte eines Sets aus drei sollen multipliziert, alle diese Werte addiert
und durch die Summe der Gewichtungszahlen geteilt werden.
Weise ich die Formel zunächst über .formula= zu und wandle sie dann (per shift+strg+enter) in eine Matrixformel um, funktioniert es.
Hat jemand eine Idee, was ich falsch mache? Mein Testcode:
Dim s As String
s = "=IF(J3="""","""",IF(SUM(IF(MOD(COLUMN(L3:BB3),3)=0,L3:BB3,0))=0,"""",ROUND(SUM(IF(MOD( _
COLUMN(J3:AZ3)-1,3)0,0,IF(ISNUMBER(J3:AZ3)*ISNUMBER(L3:BB3),J3:AZ3*L3:BB3,0)))/SUM(IF(MOD(COLUMN(L3:BB3),3)=0,L3:BB3,0)),0)))"
MsgBox s
MsgBox Len(s)
Range("bc3").FormulaArray = s
Liebe Grüße und habt Dank für jede Hilfe!
Sebastian

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Ein kurzer Blick in die VBE-Hilfe lässt diese...
11.10.2010 00:03:13
Luc:-?
…Frage als recht überflüssig erscheinen, Sebastian,
denn da steht, was du falsch machst — die Schreibweise der Bereichsadressen → Z1S1 bzw eigentl R1C1 wird verlangt! ;->
Gruß Luc :-?
Leider jetzt zu lang - kürzbar?
11.10.2010 02:23:06
Sebastian
Hey vielen Dank,
ARGL. Ertappt. Ich habe tatsächlich dort nicht nachgeschlagen, dafür aber das ganze Netz durchwühlt.
Die Excel-Hilfe hat mir bisher so selten wirklich weitergeholfen, die hatte ich gar nicht mehr auf dem Schirm. Sorry.
Vielen Dank auf jeden Fall für Deine Hilfe, Luc:-?!! Jetzt weiß ich wenigstens, warum es nicht funktioniert.
Leider konnte ich das Problem letztlich zwar verstehen, aber nicht lösen:
Dummerweise ist die Formel mit R1C1-Notation länger als 255 (nämlich 284) Zeichen. Gibt es irgendeinen Weg, sie "kleiner" zu machen?
Ich habe leider nicht viel Erfahrung mit dieser Notation. Ich habe versucht, die "R" oder die eckigen Klammern wegzulassen, beides geht nicht.
Ich bastle gerade an einem Workaround, der mit copy&paste arbeitet, aber das ist eigentlich keine gute Lösung.

{=IF(RC[-45]="","",IF(SUM(IF(MOD(COLUMN(RC[-43]:RC[-1]),3)=0,RC[-43]:RC[-1],0))=0,"",ROUND(_
SUM(IF(MOD(COLUMN(RC[-45]:RC[-3])-1,3)0,0,_
IF(ISNUMBER(RC[-45]:RC[-3])*ISNUMBER(RC[-43]:RC[-1]),RC[-45]:RC[-3]*RC[-43]:RC[-1],0)))
/SUM(IF(MOD(COLUMN(RC[-43]:RC[-1]),3)=0,RC[-43]:RC[-1],0)),0)))}
Von der Funktionalität her brauche ich die Sachen leider.
SUM(IF(MOD(COLUMN(RC[-43]:RC[-1]),3) 
summiert nur jedes dritte Element.
Da dies den Zähler der Division (Durchschnittsbildung) darstellt, muss ich vorher eine Null ausschließen.
Somit kommt der Term leider zwei Mal vor :(
ISNUMBER(RC[-45]:RC[-3])*ISNUMBER(RC[-43]:RC[-1])
stellt fest, ob ich auch wirklich Zahlen in den Faktoren habe.
RC[-45]:RC[-3]*RC[-43]:RC[-1]
ist die eigentliche Multiplikation.
Die Rundung kann ich nicht durch die Anzeige vornehmen, da die Zahl automatisiert weiterverwendet wird.
Kann man da irgendwas eleganter ausdrücken?
Vielen Dank schon mal für die erste Hilfe - ich würde mich freuen, wenn jemand hier noch eine Idee hat,
wie ich das Ganze doch noch zu einem guten Ende bringen kann.
Beste Grüße,
Sebastian
Anzeige
AW: Leider jetzt zu lang - kürzbar?
11.10.2010 05:50:49
fcs
Hallo Sebastian,
du kannst die Spaltenbezüge in deiner Formel wahrscheinlich als absolute Bezüge angeben. Dann wird die R1C1-Schreibweise deutlich kürzer und VBA kann den Formeltext verarbeiten.
Gruß
Franz
Sub Makro3()
Dim s As String
s = "=IF(RC10="""","""",IF(SUM(IF(MOD(COLUMN(RC12:RC54),3)=0,RC12:RC54,0))=0,"""", " _
& "ROUND(SUM(IF(MOD(COLUMN(RC10:RC52)-1,3)0,0,IF(ISNUMBER(RC10:RC52)*" _
& "ISNUMBER(RC12:RC54),RC10:RC52*RC12:RC54, 0) ))/SUM(IF(MOD(COLUMN(RC12:RC54),3)=0," _
& "RC12:RC54,0)),0)))"
Range("bc3").FormulaArray = s
End Sub
Erzeugte Formel in BC3:
{=WENN($J3="";"";WENN(SUMME(WENN(REST(SPALTE($L3:$BB3);3)=0;$L3:$BB3;0))=0;"";
RUNDEN(SUMME(WENN(REST(SPALTE($J3:$AZ3)-1;3)
0;0;WENN(ISTZAHL($J3:$AZ3)*ISTZAHL($L3:$BB3);$J3:$AZ3*$L3:$BB3; 0)
))/SUMME(WENN(REST(SPALTE($L3:$BB3);3)=0;$L3:$BB3;0));0)))}

Anzeige
Außerdem ist die Fml tatsächlich kürzbar,...
11.10.2010 10:12:28
Luc:-?
…Sebastian, Morn!,
auch, wenn's in Englisch nicht allzuviel bringt…
Endergebnis nach Franz:
{=WENN($J3="";"";WENN(SUMME((REST(SPALTE($L3:$BB3);3)=0)*$L3:$BB3)=0;"";
RUNDEN(SUMME((REST(SPALTE($J3:$AZ3)-1;3)=0)*ISTZAHL($J3:$AZ3)*ISTZAHL($L3:$BB3)*
$J3:$AZ3*$L3:$BB3)/SUMME((REST(SPALTE($L3:$BB3);3)=0)*$L3:$BB3);0)))}
Das dürfte dann aber ggf auch für eine relative Adressnotation reichen.
Gruß Luc :-?
AW: Außerdem ist die Fml tatsächlich kürzbar,...
11.10.2010 16:44:21
Sebastian
Hey Ihr zwei,
Respekt!! Jau, so funktioniert die Zuweisung. Und ich habe wieder eine Menge gelernt.
DANKE!!
Sebastian
Bitte sehr! Gern geschehen! ;-) owT
12.10.2010 16:38:57
Luc:-?
:-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige