Microsoft Excel

Herbers Excel/VBA-Archiv

nur die zahlenwerte der matrizen addieren

Betrifft: nur die zahlenwerte der matrizen addieren von: jana eule
Geschrieben am: 01.03.2013 21:51:20

Hey,
ich brauch dringend eure Hilfe!
Ich möchte alle Werten von zwei Matrizen kombinieren und addieren. Bsp:
Matrix 1:
1 2 3 4
Matrix2:
5 6 7 8
Daraus soll eine neue Matrix mit den Summen werden: 1+5;1+6;1+7;1+8;2+5;2+6…
Dafür habe ich folgende Formel, mit der das auch funktioniert:
{=(A1:D1)+MTRANS(A3:D3)}
Wenn ich in den Matrizen aber auch Texte oder Leerzellen habe und will, dass nur die Zahlenwerte addiert warden, welche Formel gibt es hierfür? Bsp.:
M1:
1 FALSCH 2 3
M2:
4 5 FALSCH 6
Daraus soll folgende Matrix werden: 1+4;1+5;1+6;2+4;2+5;2+6;3+4;3+5;3+6
Ist dies möglich mit einer Formel zu lösen?
LG

  

Betrifft: Ja, mit Fktt, d.Texte ignorieren! Gruß owT von: Luc:-?
Geschrieben am: 01.03.2013 22:44:13

:-?


  

Betrifft: ...oder mit einer Matrixformel wie ... von: Luc:-?
Geschrieben am: 01.03.2013 23:54:40

…{=A1:D1+A3:D3}, Jana!
Deine FALSCH-Werte wdn dabei als 0 interpretiert, weil sie Wahrheitswerte sind. WAHR würde als 1 interpretiert → das wird durch die Operatoren veranlasst. MTRANS ist hierbei also gar nicht nötig. Bei echten Texten klappt das natürlich nicht. Hier wäre folgende Formel erforderlich:
{=WENN(ISTZAHL(A1:D1);A1:D1;0)+WENN(ISTZAHL(A3:D3);A3:D3;0)}
Das fktioniert übrigens auch mit Wahrheitswerten statt Texten, falls diese nicht einbezogen wdn sollen.
SchöSo, Gruß Luc :-?


  

Betrifft: AW: ...oder mit einer Matrixformel wie ... von: jana eule
Geschrieben am: 02.03.2013 09:48:06

hey Luc,
danke für deine antwort!
aber mit der formel funktioniert das nicht. es werden immer nur die werte die untereinander stehen addiert.
LG


  

Betrifft: Oh, da habe ich deine Wiederholungen glatt ... von: Luc:-?
Geschrieben am: 02.03.2013 11:59:48

…übersehen, Jana;
was soll denn das für einen Sinn machen?
Gruß+schöWE (Gott, ist ja erst Sa!), Luc :-?


  

Betrifft: zwei Matrizen kombinieren und addieren von: Erich G.
Geschrieben am: 02.03.2013 01:17:01

Hi Jana,
mit einer Formel kann das wohl auch gehen, aber hier würde ich VBA bevorzugen.
Die Funktion MatrixAdd kannst du als Matrixfunktion direkt in der Tabelle einsetzen oder aber per
Aufruf eines Makros wie MatrAdd die Ergebnisse in einen Bereich schreiben lassen.

In diesem Beispiel hat MatrAdd die Ergebnismatrix in A4:L4 geschrieben:

 ABCDEFGHIJKLMN
11020dfWAHR40         
2FALSCH246sds8        
3              
4121416182224262842444648 von Sub MatrAdd
5              
6121416182224262842444648#NVFunktion

Formeln der Tabelle
ZelleFormel
A6{=MatrixAdd(A1:E1;A2:H2)}
B6{=MatrixAdd(A1:E1;A2:H2)}
C6{=MatrixAdd(A1:E1;A2:H2)}
D6{=MatrixAdd(A1:E1;A2:H2)}
E6{=MatrixAdd(A1:E1;A2:H2)}
F6{=MatrixAdd(A1:E1;A2:H2)}
G6{=MatrixAdd(A1:E1;A2:H2)}
H6{=MatrixAdd(A1:E1;A2:H2)}
I6{=MatrixAdd(A1:E1;A2:H2)}
J6{=MatrixAdd(A1:E1;A2:H2)}
K6{=MatrixAdd(A1:E1;A2:H2)}
L6{=MatrixAdd(A1:E1;A2:H2)}
M6{=MatrixAdd(A1:E1;A2:H2)}
Enthält Matrixformel:
Umrandende
{ } nicht miteingeben,
sondern Formel mit STRG+SHIFT+RETURN abschließen!
Matrix verstehen


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4

Und hier die Codes:
Option Explicit

Sub MatrAdd()
   Dim arr

   arr = MatrixAdd(Range("A1:E1"), Range("A2:G2"))
   Cells(4, 1).Resize(, UBound(arr, 2)) = arr
End Sub

Function MatrixAdd(rngA As Range, rngB As Range)
   Dim arrA, arrB, aa As Long, bb As Long, arrE() As Double
   Dim ii As Long, jj As Long, kk As Long

   arrA = rngA.Value
   For ii = 1 To UBound(arrA, 2)
      If Application.IsNumber(arrA(1, ii)) Then
         aa = aa + 1                   ' Anzahl Zahlen in rngA
         arrA(1, aa) = arrA(1, ii)
      End If
   Next ii
   
   arrB = rngB.Value
   For ii = 1 To UBound(arrB, 2)
      If Application.IsNumber(arrB(1, ii)) Then
         bb = bb + 1                   ' Anzahl Zahlen in rngB
         arrB(1, bb) = arrB(1, ii)
      End If
   Next ii
   
   ReDim arrE(1 To 1, 1 To aa * bb)    ' Anzahl Ergebnis
   For ii = 1 To aa
      For jj = 1 To bb
         kk = kk + 1
         arrE(1, kk) = arrA(1, ii) + arrB(1, jj)
      Next jj
   Next ii
   MatrixAdd = arrE
End Function
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich


  

Betrifft: Warum bevorzugen, ... von: Luc:-?
Geschrieben am: 02.03.2013 01:31:05

…Erich?
Rechnest du damit, dass das nur die „Spitze des Eisbergs“ war? ;-)
Übrigens, gerade schrieb ich „alle schlafen“! Nur natürlich wieder mal wir beide nicht! ;-)
Aber jetzt ist Schluss!
SchöSo, Luc :-?

PS: Deine Fkt könnte doch auch im TabBlatt verwendet wdn. Wenn du bei ihren Argg As Range weggelassen hättest, könnte sie auch Ausdrücke verarbeiten (allerdings dann auch ohne .Value)…


  

Betrifft: AW: Warum bevorzugen, ... von: Erich G.
Geschrieben am: 02.03.2013 09:55:09

Hi Luc :-?,
"Deine Fkt könnte doch auch im TabBlatt verwendet wdn." - meine ich auch! Schau mal in Zeile 6 meines Beispiels. ;-)

Was die Typangabe bei den Argumenten angeht, stimme ich dir auch zu. Allerdings sehe ich da einen Widerstreit
zwischen Variabilität und Typsicherheit. Es kommt einfach darauf an, was man mehr will...

Dir und allen auch ein schönes Wochenende!
Grüße aus Kamp-Lintfort von Erich


  

Betrifft: Ja, scheint ja sonnig zu wdn, ... von: Luc:-?
Geschrieben am: 02.03.2013 11:55:49

…Erich;
ansonsten war ja schon spät…
Typsicherheit, das Stichwort fehlte mir noch zur Erklärung resp Begründung der Einseitigkeit der MS-xlKinder RANG, ZÄHLENWENN, SUMMEWENN ggüber den Fktt des xlKerns. Danke, Erich! ;-)
Na, dann, schau'n wir mal! Luc :-?


  

Betrifft: AW: zwei Matrizen kombinieren und addieren von: jana eule
Geschrieben am: 02.03.2013 09:44:06

hey Erich,
danke für die antwort!
mit der formel funktioniert es irgendwie nicht da wird dann immer #NAME? angezeigt. woran könnte das liegen?
ich würde das lieber mit einer formle lösen,da ich noch nie mit vba gearbeitet habe,aber ich werde mich jetzt mal daran probieren =)
vielleicht klappt es ja,was ist denn der vorteil,wenn ich es mit vba mache?
LG


  

Betrifft: BeiSpielMappe von: Erich G.
Geschrieben am: 02.03.2013 10:00:47

Hi Jana,
wo hast du den Code hinkopiert? Er sollte in einenm allg. Modul (z. B. "Modul1") stehen,
dann ist die Fkt. auch im Tabellenblatt bekannt.

Ehe wir lange rätseln, lade ich hier einfach eine BeiSpielMappe hoch und bitte dich,
das mit deiner Mappe zu vergleichen:
https://www.herber.de/bbs/user/84141.xlsm

Mich würde interessieren, was bei dir anders war und damit das #NAME? verursachte.

Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich


  

Betrifft: AW: BeiSpielMappe von: jana eule
Geschrieben am: 02.03.2013 10:36:48

hey Erich,
ich glaube das problem ist eben, dass ich die formel nicht in ein modul geschreiben habe, habe sie einfach in das tabellenblatt eingefügt.
da ich in excel noch nicht so viel erfahrung hab,weiß ich überhaupt nicht was so ein modul ist =)
kannst du mir vielleicht erklären wie das geht?
LG


  

Betrifft: AW: BeiSpielMappe von: jana eule
Geschrieben am: 02.03.2013 10:41:26

hey,
kann es auch sein,dass ich diese formel noch freischalten muss?
denn wenn ich diese bei mir eingebe kommt sie nicht automatisch in diesem "auswahlfenster" für formeln.
wenn ich die formel aber bei deinem geschickten bsp. eingebe schon...


  

Betrifft: AW: BeiSpielMappe von: EtoPHG
Geschrieben am: 02.03.2013 11:10:09

Hallo Jana,

Wie musst du den Code in deine Arbeitsmappe kopieren, damit er als Formel aktiv wird?
1. Öffne deine Arbeitsmappe
2. Alt-F11 um VBA zu öffnen
3. Im Projektexplorer irgendwo auf deine Arbeitsmappe Rechtsklick - Einfügen - Modul
4. Den Code in das leere Code-Fenster (von Modul1) kopieren.

Gruess Hansueli


  

Betrifft: AW: zwei Matrizen kombinieren und addieren von: jana eule
Geschrieben am: 02.03.2013 11:27:43

Viele Dank euch allen!
Es funktioniert, und jetzt hab ich das auch mit dem Code kapiert, die Formel ist freigeschalten!
Schönes Wochenende euch allen!
LG


  

Betrifft: zwei Matrizen kombinieren und addieren - Formel von: Erich G.
Geschrieben am: 02.03.2013 17:49:02

Hi Jana,
danke für Deine Rückmeldung!
Nachdem du die VBA-Lösung zum Laufen gebracht hast: Es geht auch ohne VBA:

 ABCDEFGHIJKLMN
11020dfWAHR40         
2FALSCH246sds8        
3121416182224262842444648  
4121416182224262842444648  
5              
63             
74             

Formeln der Tabelle
ZelleFormel
A3{=WENN(SPALTE()>$A6*$A7;""; INDEX(1:1;KKLEINSTE(WENN(ISTZAHL($A$1:$IV$1); SPALTE($A$1:$IV$1)); 1+KÜRZEN((SPALTE()-1)/$A7))) +INDEX(2:2;KKLEINSTE(WENN(ISTZAHL($A$2:$IV$2); SPALTE($A$2:$IV$2)); 1+REST(SPALTE()-1;$A7))))}
A4{=WENN(SPALTE()>$A6*$A7;""; INDEX(1:1;KKLEINSTE(WENN(ISTZAHL(1:1); SPALTE(1:1)); 1+KÜRZEN((SPALTE()-1)/$A7))) +INDEX(2:2;KKLEINSTE(WENN(ISTZAHL(2:2); SPALTE(2:2)); 1+REST(SPALTE()-1;$A7))))}
A6=ANZAHL(1:1)
A7=ANZAHL(2:2)
Enthält Matrixformel:
Umrandende
{ } nicht miteingeben,
sondern Formel mit STRG+SHIFT+RETURN abschließen!
Matrix verstehen

A4 ist etwas kürzer als A3, aber evtl. langsamer. Und A4 läuft wohl nicht auf früheren XL-Versionen.

A6 und A7 dienen der Abkürzung - die Anzahlen kommen mehrfach vor, brauchen hier nur einmalig berechnet zu werden.

Schönes Wochenende allerseits!
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich


  

Betrifft: Formel korrigiert von: Erich G.
Geschrieben am: 02.03.2013 19:49:38

Hi Jana,
die Formel in A4 ist ok, aber die in A3 hatte in alten XL-Versionen ein Problem:
A1:IV1 ist dort die gesamte Zeile 1, Excel macht also 1:1 daraus,
möchte dann aber keine ganzen Zeilen oder Spalten in Matrixformeln.

Deshalb habe isch jetzt in A3 die Spalte IU statt IV geschrieben:

 ABCDEFGHIJKLM
11020dfWAHR40        
2FALSCH246sds8       
3121416182224262842444648 
4121416182224262842444648 
5             
63            
74            

Formeln der Tabelle
ZelleFormel
A3{=WENN(SPALTE()>$A6*$A7;""; INDEX(1:1;KKLEINSTE(WENN(ISTZAHL($A$1:$IU$1); SPALTE($A$1:$IU$1)); 1+KÜRZEN((SPALTE()-1)/$A7))) +INDEX(2:2;KKLEINSTE(WENN(ISTZAHL($A$2:$IU$2); SPALTE($A$2:$IU$2)); 1+REST(SPALTE()-1;$A7))))}
A4{=WENN(SPALTE()>$A6*$A7;""; INDEX(1:1;KKLEINSTE(WENN(ISTZAHL(1:1); SPALTE(1:1)); 1+KÜRZEN((SPALTE()-1)/$A7))) +INDEX(2:2;KKLEINSTE(WENN(ISTZAHL(2:2); SPALTE(2:2)); 1+REST(SPALTE()-1;$A7))))}
A6=ANZAHL(1:1)
A7=ANZAHL(2:2)
Enthält Matrixformel:
Umrandende
{ } nicht miteingeben,
sondern Formel mit STRG+SHIFT+RETURN abschließen!
Matrix verstehen

Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich


  

Betrifft: AW: zwei Matrizen kombinieren und addieren - Formel von: jana eule
Geschrieben am: 05.03.2013 16:23:20

Hey,
danke auch noch für diese Lösung!Bin die letzten Tage nicht dazu gekommen es auszuprobieren.
Als ich es vorhin ausprobiert habe, dachte ich bei der Formel aus 4, dass es nicht funktioniert, da erst noch Nullen mit angezeigt wurden,als ich dann aber 10 sec später auf das Blatt gesehen habe waren sie weg! Das dauert ja echt lang!Jetzt verstehe ich auch warum du geraten hast dieses Problem mit vba zu lösen =)
Da ich ziemlich viele Werte miteinander kombinieren möchte ist es auf jden Fall sinnvoll vba zu verwenden! Gibt es denn auch die Möglichkeit die Formel "matradd" in Spalten zu rechen, also wenn z.B die eine Matrix in A1:A5 steht und die andere in B1:B6?
Da ich, wie schon gesagt ziemlich viele Werte kombinieren möchte reicht die Anzahl der Spalten in Excel nicht aus, am Ende habe ich weit aus mehr Kombinationsmöglichkeiten als 16.000 und ca. so viele Spalten gibt es ja nur Excel...
LG Jana


  

Betrifft: zwei Spalten kombinieren und addieren - VBA von: Erich G.
Geschrieben am: 05.03.2013 17:19:57

Hi Jana,
da braucht es in VBA nur ein paa kleine Änderungen:

Option Explicit

Sub MatrAdd2()
   Dim arr

'   arr = MatrixAddZe(Range("A1:E1"), Range("A2:H2"))
'   Cells(9, 1).Resize(, UBound(arr, 2)) = arr

   arr = MatrixAddSp(Range("A1:A51"), Range("B1:B8"))
   Cells(1, 4).Resize(UBound(arr)) = arr
End Sub

Function MatrixAddSp(rngA As Range, rngB As Range)
   Dim arrA, arrB, aa As Long, bb As Long, arrE() ' As Double
   Dim ii As Long, jj As Long, kk As Long

   arrA = rngA.Value
   For ii = 1 To UBound(arrA)
      If Application.IsNumber(arrA(ii, 1)) Then
         aa = aa + 1                   ' Anzahl Zahlen in rngA
         arrA(aa, 1) = arrA(ii, 1)
      End If
   Next ii
   
   arrB = rngB.Value
   For ii = 1 To UBound(arrB)
      If Application.IsNumber(arrB(ii, 1)) Then
         bb = bb + 1                   ' Anzahl Zahlen in rngB
         arrB(bb, 1) = arrB(ii, 1)
      End If
   Next ii
   
   ReDim arrE(1 To aa * bb, 1 To 1)    ' Anzahl Ergebnis
   For ii = 1 To aa
      For jj = 1 To bb
         kk = kk + 1
         arrE(kk, 1) = arrA(ii, 1) + arrB(jj, 1)
'        arrE(kk, 1) = arrA(ii, 1) & "+" & arrB(jj, 1)
      Next jj
   Next ii
   MatrixAddSp = arrE
End Function
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich


  

Betrifft: AW: zwei Spalten kombinieren und addieren - VBA von: jana eule
Geschrieben am: 05.03.2013 17:47:27

Supi, es klappt!Vielen Dank!
Ich wünschte ich hätte auch so viel Ahnung von vba,schon toll was man damit alles machen kann!
LG


 

Beiträge aus den Excel-Beispielen zum Thema "nur die zahlenwerte der matrizen addieren"