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

Forumthread: VBA: Array - dimensionierung

VBA: Array - dimensionierung
Dennis
Hallo zusammen,
ich habel mal eine kurze Frage zu Arrays.
Wenn ich in VBA Arrays erstellen beginnen diese ja immer bei 0:
dim aArray (1,1)
aArray(0,0) = 2
Also 0 ist immer die erste Zeile und die erste Spalte im Array.
Jetzt kann in VBA ja aber auch direkt ein ganzes Array aus Excel heraus auslesen:
dim aArray()
aArray = Range(Cells(1, 1), Cells(20, 3))
Hier beginnt nun das Array aber nicht mehr bei 0 sondern bei 1.
Ich verstehe nun nicht wieso das einmal bei 0 beginnt (erstellung über VBA), bzw. bei 1 wenn es ausgelsen wird?
Gruss Dennis
Anzeige
AW: VBA: Array - dimensionierung
24.02.2012 15:30:14
Tino
Hallo,
du kannst ein Array auch bei eins beginnen lassen.
Dim aArray(1 to 10, 1 to 1)
Gruß Tino
AW: VBA: Array - dimensionierung
24.02.2012 15:50:40
ransi
HAllo

du kannst ein Array auch bei eins beginnen lassen.
Dim aArray(1 to 10, 1 to 1)
Oder du benutzt den "Frauenschalter" ;-)
Option Base 1

Ich verstehe nun nicht wieso das einmal bei 0 beginnt (erstellung über VBA), bzw. bei 1 wenn es ausgelsen wird?
Ich (ehrlich gesagt) auch nicht.
ransi
Anzeige
AW: VBA: Array - dimensionierung
24.02.2012 20:26:36
Dennis
Hallo zusammen,
danke für die Hinweise.
Muss ich einmal versuchen das Array bei 1 beginnen zu lassen.
"option Base 1" hatte ich nicht eingestellt. Von daher finde ich es sehr merkwürdig, das beim auslesen des Arrays VBA das Array mit 1 beginnen lässt und nicht mit 0 sowie es sich für mich gehört.
Hat noch jemand vielleicht eine Idee wie ich das VBA dazu zwingen kann, dass es mit 0 beginnt?
Gruss Dennis
Anzeige
AW: VBA: Array - dimensionierung
24.02.2012 20:47:37
Dennis
Hallo zusammen,
danke für die Hinweise.
Muss ich einmal versuchen das Array bei 1 beginnen zu lassen.
"option Base 1" hatte ich nicht eingestellt. Von daher finde ich es sehr merkwürdig, das beim auslesen des Arrays VBA das Array mit 1 beginnen lässt und nicht mit 0 sowie es sich für mich gehört.
Hat noch jemand vielleicht eine Idee wie ich das VBA dazu zwingen kann, dass es mit 0 beginnt?
Gruss Dennis
Anzeige
Array-Dimensionierung
24.02.2012 21:23:22
Erich
Hi,
wenn man in VBA den Bereich A1:B4 einlesen lässt, wird automatisch ein einsbasiertes Array
arr(1 to 4, 1 to 2) erstellt.
Eine Alternative wäre das nullbasierte Array - mit identischen Werten:
arr(0 to 3, 0 to 1) oder kürzer
arr(3, 1)
Letztlich ist es egal. Vielleicht war (bei M$?) ausschlaggebend für die Entscheidung für 'einsbasiert',
dass sich hier Zeilen- und Spaltennummern des Bereichs in den Indizes des Arrays identisch wiederfinden.
Die Werte aus Zeile 2 findet man mit Index 2 - auch im Array.
Beim nullbasierten Array hätten die Werte der Zeile 1 den Index 0. Das könnte schon mal Umrechnungen erforderlich machen.
Deklariert man selbst in VBA ein Array, hat man dabei alle Freiheiten, man legt selbst fest, wo die Zählung beginnt.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Anzeige
AW: Array-Dimensionierung
25.02.2012 00:18:19
Dennis
Hallo Erich,
vielen Dank für deine erklärung.
Dann werde ich es wohl so hinnehmen, dass es einmal nullbasiertes und ein einbasiertes Array gibt.
werde mal ausprobieren ob das alles so klappt wie ich es mir vorstelle wenn ich alles als einbasiertes Array definiere.
Ich möchte Matrizenmulpiplikationen durchführen und bisher ist es immer daran gescheitert das eben das eine Array nullbasiert war und das andere einbasiert und somit die Spalten nicht übereingestimmt haben.
Danke und Gruss
Dennis
Anzeige
AW: Array-Dimensionierung
25.02.2012 00:50:31
Tino
Hallo,
du brauchst doch nur entsprechend mit + oder - 1 zu rechnen.
Gruß Tino
Array-Dimensionierung - Beispiel
25.02.2012 07:45:22
Erich
Hi Dennis,
es gibt nicht nur nullbasierte oder einsbasierte Arrays. Die Basis kann jede ganze Zahl sein - auch eine negative.
(Bei negativen Indizes könnte man z. B. daran denken, die 0 für das aktuelle Jahr, -1 und -2 für die beiden Vorjahre,
1, 2, 3 für die drei Folgejahre zu nehmen.)
Mit der Matrizenmultiplikation hat das nichts zu tun. Bei Verwendung unterschiedlich basierter Matrizen
wird allenfalls der Umgang mit den Indizes etwas interessanter.
Es kommt allein darauf an, wie viele Zeilen/Spalten die Matrizen haben, also nicht die genauen Nummern,
sondern nur die Anzahl Zeilen und Spalten ist wichtig.
Ich habe mal eine kleine Mappe gebaut, in der eine Matrix arrA (einsbasiert) vom Tabellenblatt eingelesen wird,
die zweite Matrix arrB wird im Makro direkt gefüllt und auf dem Blatt ausgegeben.
Dann werden im Makro die beiden Matrizen multipliziert und das Produkt arrC auch in das Blatt geschrieben.
Zusätzlich werden im Blatt noch die beiden Blatt-Matrizen arrB und arrA per MMULT miteinander multipliziert.
Das Ergebnis sollte natürlich gleich dem VBA-Ergebnis sein. :-) Tipp: Excelhilfe zur Fkt. MMULT lesen.
Das Spannende an den Matrizen arrB und arrC: Sie sind weder null- noch einsbasiert, sondern irgendwie.
Und man kann sie auch in VBA multiplizieren...
Hier die Mappe: https://www.herber.de/bbs/user/79091.xls
Da ich selbst oft nicht mag, wenn man erst mal eine Mappe laden muss, um eine Aufgabe zu verstehen zu können,
hier der Code:

Sub MatrixMult()
Dim arrA, arrB(3 To 7, 100 To 102), arrC()
Dim zz As Long, ss As Long, ii As Long
' ------------------------------------------------- Matrix A einlesen
arrA = Cells(2, 3).Resize(3, 6)     ' einsbasiert (1 to 3, 1 to 6)
' ------------------------------------------------- Matrix B rechnen
For zz = 3 To 7
For ss = 100 To 102
arrB(zz, ss) = 3 * zz + ss - 107
Next ss
Next zz
Cells(6, 2).Resize(5, 3) = arrB     ' Ausgabe der Matrix B
' ------------------------------------------------- Produkt der Matrizen
' arrC: =MMULT(arrB;ArrA)
ReDim arrC(7 To 11, -2 To 3)
For zz = 7 To 11
For ss = -2 To 3
For ii = 1 To 3
arrC(zz, ss) = arrC(zz, ss) + arrB(zz - 4, ii + 99) * arrA(ii, ss + 3)
Next ii
Next ss
Next zz
' Ausgabe der Matrix C
Cells(13, 6).Resize(UBound(arrC, 1) - LBound(arrC, 1) + 1, _
UBound(arrC, 2) - LBound(arrC, 2) + 1) = arrC
End Sub
und die Tabelle (ohne Formel):
 BCDEFGHIJKLM
2 123456     
3 111213141516 arrA   
4 212223242526     
5            
6234         
7567 119128137146155164  
88910 218236254272290308  
9111213 317344371398425452 MMULT
10141516 416452488524560596  
11    515560605650695740  
12 arrB          
13    119128137146155164  
14    218236254272290308  
15    317344371398425452 arrC
16    416452488524560596  
17    515560605650695740  

Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Anzeige
AW: Array-Dimensionierung - Beispiel
27.02.2012 13:17:18
Dennis
Hallo Erich,
danke für die ausführliche Erklärung und die Tabelle.
Ich hatte bisher die Matrizenmultiplikation mit der Excel Funktion durchgeführt (WorksheetFunction.MMult(Matrix1, Matrix2).
Wenn diese dann aber nicht identisch waren, bzw. einmal 1-basiert und einmal 0-basiert hat das eben nicht funktioniert.
Vielleicht sollte ich einfach auf die Excel-Funktionen verzichten wenn es möglich ist. Dann weiß ich wengstens was genau passiert...
Nochmals danke und Gruss
Dennis
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

VBA: Arrays richtig dimensionieren


Schritt-für-Schritt-Anleitung

  1. Array deklarieren: Um ein Array in VBA zu definieren, verwendest du die Dim-Anweisung. Du kannst entscheiden, ob du ein nullbasiertes oder ein einbasiertes Array möchtest.

    Dim aArray(1 To 10) ' einbasiertes Array
    Dim bArray(0 To 9) ' nullbasiertes Array
  2. Array aus Excel auslesen: Du kannst ein Array direkt aus einem Excel-Bereich auslesen. Beachte, dass das resultierende Array standardmäßig einsbasiert ist:

    Dim cArray()
    cArray = Range(Cells(1, 1), Cells(20, 3).Value
  3. Array anpassen: Um die Größe eines Arrays dynamisch zu ändern, kannst du die ReDim-Anweisung verwenden. Hierbei ist zu beachten, dass du die ursprünglichen Werte verlierst, wenn du kein Preserve angibst:

    ReDim Preserve cArray(1 To 30) ' erweitert das Array
  4. Zugriff auf Array-Elemente: Greife auf die Elemente des Arrays zu, indem du die Indizes angibst:

    aArray(1) = 5
    MsgBox aArray(1) ' gibt 5 aus

Häufige Fehler und Lösungen

  • Problem: Unterschiedliche Indizes zwischen null- und einbasierten Arrays. Lösung: Achte darauf, konsistent zu bleiben. Wenn du ein einbasiertes Array verwendest, solltest du auch bei der Arbeit mit Excel-Funktionen wie MMULT darauf achten, dass die Indizes übereinstimmen.

  • Problem: Fehler beim Zugriff auf Array-Elemente. Lösung: Überprüfe die Dimensionierung deines Arrays. Wenn das Array mit Dim aArray(1 To 10) definiert ist, versuche nicht, auf aArray(0) zuzugreifen.


Alternative Methoden

  • Option Base 1: Mit dieser Anweisung kannst du die Standardbasis für Arrays auf 1 setzen. So kannst du alle Arrays als einbasiert definieren, ohne bei jeder Deklaration die Indizes manuell anpassen zu müssen:

    Option Base 1
    Dim aArray(10) ' jetzt von 1 bis 10
  • Arrays in VBA: Du kannst auch mehrdimensionale Arrays verwenden, um komplexere Datenstrukturen zu erstellen:

    Dim matrix(1 To 3, 1 To 3) ' 2D Array

Praktische Beispiele

  1. Matrizenmultiplikation: Hier ist ein Beispiel für eine einfache Matrizenmultiplikation in VBA:

    Sub MatrixMult()
       Dim arrA As Variant, arrB As Variant, arrC As Variant
       arrA = Range("A1:C3").Value ' einbasiertes Array
       arrB = Range("D1:F3").Value ' einbasiertes Array
       ReDim arrC(1 To 3, 1 To 3)
    
       ' Multiplikation
       For i = 1 To 3
           For j = 1 To 3
               arrC(i, j) = arrA(i, 1) * arrB(1, j) + arrA(i, 2) * arrB(2, j) + arrA(i, 3) * arrB(3, j)
           Next j
       Next i
    
       ' Ausgabe
       Range("G1:I3").Value = arrC
    End Sub
  2. Dynamisches Array: Hier wird gezeigt, wie man ein dynamisches Array resize und befüllen kann:

    Dim numbers() As Integer
    ReDim numbers(1 To 5)
    For i = 1 To 5
       numbers(i) = i * 2 ' füllt das Array mit Werten
    Next i

Tipps für Profis

  • Verwendung von Preserve: Wenn du die Größe eines Arrays änderst, aber die bestehenden Daten behalten möchtest, vergiss nicht Preserve zu verwenden.
  • Negative Indizes: Du kannst auch negative Indizes verwenden, um eine besondere Struktur zu erzeugen. Zum Beispiel:
    Dim arr(-5 To 5) As Integer

FAQ: Häufige Fragen

1. Warum beginnt ein Array in VBA bei 0 oder 1? Das hängt davon ab, wie das Array deklariert wurde. Standardeinstellung in VBA ist 0, aber du kannst die Basis mit Option Base ändern.

2. Wie kann ich ein Array in Excel VBA erstellen? Du kannst ein Array mit der Dim-Anweisung definieren und die Größe angeben, entweder statisch oder dynamisch.

3. Wie führe ich eine Matrizenmultiplikation in VBA durch? Verwende eine Schleife, um die Werte der Matrizen zu multiplizieren und in ein neues Array zu speichern. Die Funktion MMULT kann ebenfalls verwendet werden, jedoch ist dies einfacher, wenn du die Kontrolle über die Indizes haben möchtest.

4. Was ist der Unterschied zwischen ein- und nullbasierten Arrays? Ein einbasiertes Array beginnt bei 1, während ein nullbasiertes Array bei 0 beginnt. Dies kann zu Verwirrung führen, wenn du mit Excel-Daten arbeitest, die standardmäßig einsbasiert sind.

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