Matrixformeln und Arrays Home Home

WB01727_.gif (1537 Byte)

Seiteninhalt

Excel ohne Arrays wäre undenkbar, denn sie gehören gewissermassen zum Fundament. Daten werden in Zellen eingegeben, die auf einer mit einem Koordinatensystem ("Spalte" für die X-Achse, "Zeile" für die Y-Achse) versehenen Ebene (Tabellenblatt) angeordnet sind und dadurch ein zweidimensionales Array (Datenfeld) darstellen.

Erfahren Sie hier alles über VBA-Arrays und Matrixformeln.

Leserprofil
Geübte Excel-Anwender und VB-/VBA-Programmierer mit  Grundkenntnissen über
- Matrixformeln
- VBA-Arrays

WB01727_.gif (1537 Byte)

Inhalt

Matrixformeln
  Was ist eine Matrixformel?
  So geben Sie eine Matrixformel ein
  Wissenswertes über Matrixformeln

Arrays (Datenfelder)
  Was ist ein Array?
  Statische und dynamische Arrays
  Deklaration und Dimensionierung von Arrays

Arrays in der Praxis
  Arrays löschen
  Zellbereich in Array speichern

Limitationen von Arrays
  Berechnen der Speicherbeanspruchung eines Arrays

VBA-Beispiele

Links und Downloads
  Bugs und Probleme

  Weitere Informationen
  Downloads

Zum Seitenanfang


Matrixformeln

Was ist eine Matrixformel?

- Eine Matrixformel führt mehrere Berechnungen durch und gibt dann entweder ein einzelnes Ergebnis oder mehrere Ergebnisse zurück.
- Matrixformeln arbeiten mit zwei oder mehreren Gruppen von Werten, die als Matrixargumente bezeichnet werden.
- Jedes Matrixargument muss dieselbe Anzahl von Reihen und Spalten besitzen.
- Soll die Formel mehrere Ergebnisse zurückgeben, muss diese in mehreren Zellen eingegeben werden.
- Um eine Matrixformel einzugeben, drücken Sie STRG+UMSCHALT+EINGABE.
- Excel setzt Matrixformeln in geschweifte Klammern ({}).

Zum Seitenanfang

 

So geben Sie eine Matrixformel ein

Wenn Sie eine Matrixformel eingeben, schliesst Microsoft Excel die Formel automatisch in geschweifte Klammern ({}) ein. So geben Sie eine Matrixformel ein:
1. Soll die Matrixformel nur ein einzelnes Ergebnis liefern, klicken Sie auf die Zelle, in die Sie die Matrixformel eingeben möchten. Soll die Matrixformel mehrere Ergebnisse liefern, markieren Sie den Zellbereich, in den Sie die Matrixformel eingeben möchten.
2. Geben Sie die Matrixformel ein.
3. Drücken Sie STRG+UMSCHALT+EINGABE.

Um per VBA die Editierung und Eingabe einer Matrixformel zu simulieren, kann folgender VBA-Code eingesetzt werden:
Public Sub ReenterArrayFormula()
     SendKeys "{F2}"
     SendKeys "^+{Enter}"
  End Sub

Zum Seitenanfang

 

Wissenswertes über Matrixformeln

Eine Matrixformel kann mehrere Berechnungen durchführen und dann entweder ein einzelnes Ergebnis oder mehrere Ergebnisse liefern. Matrixformeln bearbeiten zwei oder mehr Wertesätze, die als Matrixargumente bezeichnet werden. Alle Matrixargumente müssen über dieselbe Anzahl von Zeilen und Spalten verfügen. Sie erstellen eine Matrixformel auf dieselbe Weise wie eine elementare Formel, die nur einen Wert liefert. Markieren Sie die Zelle oder die Zellen, in die die Formel eingegeben werden soll, erstellen Sie die Formel, und drücken Sie dann STRG+UMSCHALT+EINGABE, um die Formel einzugeben.

Wenn die Matrixformel nur ein einzelnes Ergebnis liefern soll, muß Microsoft Excel unter Umständen mehrere Berechnungen durchführen, um das Ergebnis zu erzeugen. Beispielsweise berechnet die folgende Formel nur für jene Zellen im Bereich D5:D15 den Mittelwert, bei denen die entsprechenden Zellen in derselben Zeile in Spalte A den Text "Albatros Fluggesellschaft" enthalten. Die Funktion WENN ermittelt im Bereich A5:A15 alle Zellen, die "Albatros Fluggesellschaft" enthalten, und gibt dann den Wert der entsprechenden Zellen im Bereich D5:D15 an die Funktion MITTELWERT zurück.

  {=MITTELWERT(WENN(A5:A15="Albatros Fluggesellschaft";D5:D15))}

Um mit Hilfe einer Matrixformel mehrere Ergebnisse zu berechnen, müssen Sie die Matrix in einen Zellbereich eingeben, der über dieselbe Anzahl von Zeilen und Spalten verfügt wie die Matrixargumente. In dem folgenden Beispiel ermittelt die Funktion TREND für eine Reihe von fünf Verkaufszahlen (in Spalte B) und eine Reihe von fünf Datumsangaben (in Spalte A) die Werte für die Verkaufszahlen, die sich aus dem linearen Trend ergeben. Damit alle Ergebnisse der Formel angezeigt werden, wird diese in fünf Zellen in Spalte C eingegeben (C10:C15).

  {=TREND(B10:B15;A10:A15)}

Sie können eine Matrixformel auch dazu verwenden, um einzelne und mehrere Ergebnisse für eine Reihe von Werten zu berechnen, die nicht in das Tabellenblatt eingegeben wurden. Matrixformeln können genau wie einfache Formeln Konstanten enthalten; die Matrixkonstanten müssen jedoch in einem bestimmten Format eingegeben werden. Beispielsweise können Sie anhand der fünf Werte und der fünf Datumsangaben aus dem vorherigen Beispiel die Verkaufszahlen für zwei weitere, zukünftige Daten prognostizieren. Da Formeln oder Funktionen nicht als Matrixkonstanten verwendet werden können, werden im folgenden Beispiel für die zusätzlichen Datumsangaben fortlaufende Zahlen für das dritte Argument der Funktion TREND verwendet:

  {=TREND(B10:B15;A10:A15;{35246;35261})}

Beachten Sie bitte, dass nicht alle Excel-Funktion in der Lage sind, Matrixkonstanten zu verwenden.

Zum Seitenanfang

 


Arrays (Datenfelder)

Was ist ein Array?

 

Zum Seitenanfang

Statische und dynamische Arrays

 

Zum Seitenanfang

Deklaration und Dimensionierung von Arrays

 

 

Meldung: Datenfeldargument muß vom Typ ByRef sein

Datenfelder, die mit Dim, ReDim oder Static deklariert wurden, können nicht mit ByVal übergeben werden. Für diesen Fehler gibt es die folgende Ursache und Lösung:

Zum Seitenanfang

 


Arrays in der Praxis

Arrays löschen

 

Zum Seitenanfang

 

Grösse einer Array-Dimension ändern (Redimensionierung)

Bei mehrdimensionalen Arrays ist normalerweise nur Änderung der letzten Dimension möglich.

Diese VBA-Prozedur redimensioniert bei einem zweidimensionalen Array beide Dimensionen:

Sub FreeArray()
   Dim intCol As Integer, intRow As Integer, intCounter As Integer
   Dim arr()
   Application.ScreenUpdating = False
   ReDim arr(1 To 2, 1 To 10)
   For intRow = 1 To 2
      For intCol = 1 To 10
         arr(intRow, intCol) = "Spalte " & intCol & " - " & "Zeile " & intRow
      Next intCol
   Next intRow
   MsgBox "Letzter Wert:" & Chr(10) & arr(2, 10)
   Workbooks.Add
   Range("A1:J2") = arr
   For intCounter = 1 To 11
      Cells(3, intCounter) = "Spalte " & intCounter & " - " & "Zeile 3"
   Next intCounter
   For intCounter = 1 To 3
      Cells(intCounter, 11) = "Zeile " & intCounter & " - " & "Spalte 11"
   Next intCounter
   arr = Range("A1").CurrentRegion
   ActiveWorkbook.Close savechanges:=False
   MsgBox "Letzter Wert:" & Chr(10) & arr(3, 11)
End Sub

Zum Seitenanfang

 

Anzahl Array-Elemente ermitteln

 

Zum Seitenanfang

 

Zwei Arrays miteinander vergleichen

 

Zum Seitenanfang

 

Array-Elemente einem anderen Array zuweisen

 

Zum Seitenanfang

 

Zellbereich in Array speichern

Sie werden jetzt vielleicht denken, dass es wirklich nicht so schwierig sein kann, einen Zellbereich in ein Array zu speichern.

Zum Seitenanfang

 

Anzahl Parameter in ParamArray ermitteln

Function ArrayCount(ParamArray arr() As Variant) As Integer
  ArrayCount = UBound(arr) + 1
End Function

Sub Aufruf()
  MsgBox ArrayCount(5, 7, 9, 11, 13)
End Sub

Zum Seitenanfang

 

Array auf Inhalt prüfen

Description

If you use 'Dim nArray()' and later want to see if you've redimensioned the array, or if it's still empty, traditionally you would just use some error logic and attempt to read from it. This bit of code demonstrates using CopyMemory to look into the VARIANT and SAFEARRAY structures to see if the array actually contains any dimensions. I present it, because it's actually a bit faster than using the error logic, and could save some runtime if you call such subroutine quite a bit.

Code

Private Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, src As Any, ByVal length As Long) As Long
  
Public Function IsArraySafe(ArrayVal As Variant) As Boolean
   If (VarType(ArrayVal) And vbArray) Then
      Dim lpSafeArray As Long
      Dim nDimensions As Long
     
      CopyMemory lpSafeArray, ByVal VarPtr(ArrayVal) + 8, 4
      CopyMemory nDimensions, ByVal lpSafeArray, 2
     
      If nDimensions > 0 Then
         IsArraySafe = True
      Else
         IsArraySafe = False
      End If
   Else
      Debug.Assert False
      'ArrayVal doesn't look to contain an Array
   End If
End Function

Sample Usage

If Not IsArraySafe(nArray()) Then
   Redim nArray(100)
End If

Zum Seitenanfang

 


Limitationen von Arrays

Wenn man in der Excel-Dokumentation (Online-Hilfe) nachschaut, dann erfährt man ziemlich wenig über die Limitationen und Grenzen von Excel-Arrays.

Zum Seitenanfang

 

Berechnen der Speicherbeanspruchung eines Arrays

Ein Zellbereich mit mehreren Spalten und Zeilen wird als zweidimensionales Datenfeld abgebildet. Die Untergrenze für die Indizes der beiden Array-Dimensionen ist 1 (für Excel-Zellbereiche).

Da der Wert einer Zelle (Value-Eigenschaft) nicht zwingend eine Zahl enthalten muss, sondern auch Buchstaben bzw. längere Texte oder Fehlerwerte vorkommen können, kann ein Bereich-Array weder als Zahl noch Text deklariert werden. Stattdessen erfolgt die Deklaration mit dem Datentyp Variant (der seinerseits intern den benötigten Datentyp verwendet).

Dieses Beispiel deklariert ein statisches Datenfeld fester Grösse für einen Zellbereich von 5'000 Zeilen und 26 Spalten (Spalten A-Z):
   Dim avarBereich(1 To 5000, 1 To 26) As Variant

Der beanspruchte Speicherbedarf wird so berechnet:
  Speicherbedarf = Anzahl Zeilen * Anzahl Spalten * Bytes des Datentyps
  Speicherbedarf = 5'000 * 26 * 16
  Speicherbedarf = 2'080'000 Bytes

Anmerkung
Die Default-Einstellung für VBA-Arrays ist 0. Bei Bedarf sollte daher die Anweisung "Option Base 1" verwendet werden. Die Basis eines mit der Array-Funktion oder dem Schlüsselwort "ParamArray" erstellten Datenfeldes ist Null. Die Option Base-Anweisung hat keinen Einfluss auf "Array" oder "ParamArray".

Zum Seitenanfang

 


VBA-Beispiele

 

Zum Seitenanfang

 


Links und Downloads

Bugs und Probleme

XL97: Run-Time Error Using FormulaArray Property
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q192989

XL97: Cannot Paste Array Formula in Its Original Cell
http://support.microsoft.com/search/preview.aspx?scid=kb;en-us;Q158080

XL2000: Benutzerdefinierte Funktion gibt bei großem Array "#WERT!" zurück
http://support.microsoft.com/default.aspx?scid=kb;de;d43187

XL2000: Run-Time Error Using FormulaArray Property
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q213181

XL2000: Excel May Fault in MSO9.DLL When Calling an XLL Function that Takes an Array
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q304442
arrow_r.gif (830 Byte) Dieses Problem lässt sich mit einem Hotfix beheben.

Zum Seitenanfang

 

Weitere Informationen

XL97: Maximum Array Size in Microsoft Excel
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q166342

XL2000: Maximum Array Size in Microsoft Excel
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q166342

XL2000: How to Use Dynamic Arrays in a Macro
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q213619

XL2000: Custom Function to Turn Nonadjacent Cells into an Array
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q213403

EXCEL: Returning Arrays
http://www.cpearson.com/excel/returnin.htm
arrow_r.gif (830 Byte) Kurzer aber sehr guter Artikel zum Thema "Arrays" von 'Pearson Software Consulting' mit VBA-Codebeispielen.

Zum Seitenanfang

 

Downloads

 

Zum Seitenanfang

WB01727_.gif (1537 Byte)

Haben Sie Fragen, Anregungen oder einen Fehler entdeckt?
Mail senden an philipp_von_wartburg@yahoo.de

Zuletzt aktualisiert am 27.01.2006 / 21:30 Uhr
© 2002-2006 by Philipp von Wartburg, CH-8916 Jonen
Alle Rechte vorbehalten