Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Probleme mit MMult in VBA

Forumthread: Probleme mit MMult in VBA

Probleme mit MMult in VBA
Frank
Hallo an Alle,
ich möchte gern MMult unter VBA nutzen, jedoch erhalte ich beim Ausführen des Codes folgende Meldung:
"Die MMult-Eigenschaft des WorksheetFunction-Objektes kann nicht zugeordnet werden."
Hier ist mein Code:
Sub Matrix_multiplizieren()
Dim Matrix(1 To 6, 1 To 6) As Variant
Dim Inverse
Dim Vektor(1 To 6) As Double
Dim Ergebnis
Dim i As Integer, j As Integer
For i = 1 To 6
For j = 1 To 6
Matrix(i, j) = Worksheets(1).Cells(i, j + 2)
Next j
Next i
For i = 1 To 6
Vektor(i) = Worksheets(1).Cells(i, 1)
Next i
Inverse = Application.WorksheetFunction.MInverse(Matrix)
Ergebnis = Application.WorksheetFunction.MMult(Inverse, Vektor) 'hier streikt VBA
End Sub
Kann mir bitte jemand sagen was ich falsch mache?
Vielen Dank und viele Grüße,
Frank
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Probleme mit MMult in VBA
17.11.2011 12:53:18
Harald
Hallo Frank,
vertausche Matrix und Vektor in MMUlt:
Ergebnis = Application.WorksheetFunction.MMult(Vektor, Inverse)
Gruß Harald
AW: Probleme mit MMult in VBA
17.11.2011 13:11:27
Frank
Vielen Dank Harald,
das ist aber komisch, denn ich bin vin der Syntax in Excel ausgegangen und da muss man bei MMult(Inverse,Vektor) angegeben (siehe Datei). Warum ist es in VBA genau andersrum?
das funzt in Excel: =MMULT(C8:H13;A1:A6) ,sprich MMult(Matrix, Vektor)
in VBA muss ich schreiben MMult(Vektor, Matrix)
https://www.herber.de/bbs/user/77541.xlsm
Das finde ich jetzt wirklich nicht sehr logisch, was meint Ihr?
Vielen Dank und viele Grüße,
Frank
Anzeige
Nicht logisch und noch schneller
17.11.2011 13:25:12
Harald
aber wenn's denn funktioniert.
Ich spekuliere mal, dass eine Matrix als Bereich eines Arbeitsblattes eben anders gespeichert wird, als eine Matrix in VBA. Wenn man das berücksichtigt, geht es noch schneller (und dann stimmt auch die Reihenfolge von Matrix und Vektor wieder):
Sub Matrix_multiplizieren()
Dim Matrix As Variant
Dim Inverse
Dim Vektor As Variant
Dim Ergebnis
Dim i As Integer, j As Integer
Matrix = Range("C1:H6")
Vektor = Range("A1:A6")
Inverse = Application.WorksheetFunction.MInverse(Matrix)
Ergebnis = Application.WorksheetFunction.MMult(Inverse, Vektor)
End Sub
Gruß Harald
Anzeige
AW: Nicht logisch und noch schneller
17.11.2011 13:34:08
Frank
Gut, dann wäre das geklärt :o). Warum auch immer das so ist - ich nehme das jetzt so hin. Deine Variante ist auch eine gute Idee, aber ich möchte/muss es gern dynamisch haben...
Vielen Dank nochmal Harald.
Viele Grüße, Frank
dynamisch geht auch
17.11.2011 14:06:55
Harald
Matrix = range(Cells(x1,y1),Cells(x2,y2))
Wobei X1, y1 die linke obere Ecke der Matrix ist (also die Startwerte für i und j in Deinem Code)
und x2, y2 ist die rechte untere Ecke der Matrix (also die Endwerte für i und j aus deinem Code)
Für den Vektor äquivalent:
Vektor = Range(Cells(x3,y3), Cells(x4,y3))
Hier 2*y3, da der Vektor eindimensional ist.
Gruß
Harald
Anzeige
;
Anzeige

Infobox / Tutorial

Probleme mit MMult in VBA lösen


Schritt-für-Schritt-Anleitung

Um die Funktion MMult in VBA korrekt zu verwenden, kannst du die folgende Schritt-für-Schritt-Anleitung befolgen:

  1. Definiere die Matrix und den Vektor: Erstelle eine Matrix und einen Vektor, die du multiplizieren möchtest.
  2. Verwende die MInverse-Funktion: Berechne die Inverse der Matrix mit Application.WorksheetFunction.MInverse(Matrix).
  3. Multipliziere die Inverse mit dem Vektor: Verwende Application.WorksheetFunction.MMult(Inverse, Vektor) für die Multiplikation.

Hier ist ein Beispielcode, der diese Schritte umsetzt:

Sub Matrix_multiplizieren()
    Dim Matrix As Variant
    Dim Inverse
    Dim Vektor As Variant
    Dim Ergebnis
    Matrix = Range("C1:H6") ' Definiere die Matrix-Bereich
    Vektor = Range("A1:A6") ' Definiere den Vektor-Bereich
    Inverse = Application.WorksheetFunction.MInverse(Matrix) ' Berechne die Inverse
    Ergebnis = Application.WorksheetFunction.MMult(Inverse, Vektor) ' Multipliziere Inverse mit Vektor
End Sub

Häufige Fehler und Lösungen

Ein häufiger Fehler, der bei der Verwendung von MMult in VBA auftritt, ist die falsche Reihenfolge der Parameter. In Excel ist die Syntax =MMULT(C8:H13;A1:A6), während du in VBA die Reihenfolge umkehren musst:

Ergebnis = Application.WorksheetFunction.MMult(Vektor, Inverse)

Wenn du eine Fehlermeldung erhältst, dass die MMult-Eigenschaft nicht zugeordnet werden kann, überprüfe bitte, ob du die Parameter in der richtigen Reihenfolge übergibst.


Alternative Methoden

Wenn du dynamische Bereiche nutzen möchtest, kannst du die Range-Funktion verwenden, um die Matrix und den Vektor zu definieren. Hier ist ein Beispiel:

Matrix = Range(Cells(x1, y1), Cells(x2, y2)) ' Dynamische Matrix
Vektor = Range(Cells(x3, y3), Cells(x4, y3)) ' Dynamischer Vektor

Das erlaubt dir, die Bereiche zur Laufzeit anzupassen und erhöht die Flexibilität deines Codes.


Praktische Beispiele

Hier ist ein praktisches Beispiel, das zeigt, wie du die MMult-Funktion in einem VBA-Skript verwenden kannst:

Sub Beispiel_MMult()
    Dim Matrix As Variant
    Dim Vektor As Variant
    Dim Ergebnis As Variant
    Matrix = Range("C1:H6")
    Vektor = Range("A1:A6")

    ' Berechne die Inverse der Matrix
    Dim Inverse As Variant
    Inverse = Application.WorksheetFunction.MInverse(Matrix)

    ' Multipliziere die Inverse mit dem Vektor
    Ergebnis = Application.WorksheetFunction.MMult(Inverse, Vektor)

    ' Ausgabe des Ergebnisses
    MsgBox Ergebnis
End Sub

Tipps für Profis

  • Verwende Variant für flexible Datentypen: Wenn du mit unterschiedlichen Daten arbeitest, ist es ratsam, Variant zu verwenden.
  • Fehlerbehandlung einfügen: Implementiere eine Fehlerbehandlung, um sicherzustellen, dass dein Code robust gegen falsche Eingaben ist.
  • Dynamische Bereiche: Nutze Cells für dynamische Matrix- und Vektordefinitionen, um die Flexibilität deines VBA-Codes zu erhöhen.

FAQ: Häufige Fragen

1. Warum muss ich die Reihenfolge der Parameter in VBA umkehren?
In VBA funktioniert MMult anders als in Excel. In Excel gibst du die Matrix zuerst an, gefolgt vom Vektor. In VBA ist es umgekehrt.

2. Was kann ich tun, wenn ich die Fehlermeldung "MMult kann nicht zugeordnet werden" erhalte?
Überprüfe die Reihenfolge der Parameter und stelle sicher, dass du die WorksheetFunction-Funktionen korrekt verwendest.

3. Wie kann ich die Inverse einer Matrix in VBA berechnen?
Verwende die Funktion Application.WorksheetFunction.MInverse(Matrix). Stelle sicher, dass die Matrix quadratisch ist, andernfalls wird ein Fehler angezeigt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige