Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1252to1256
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

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

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
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
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
AW: Array-Dimensionierung
25.02.2012 00:50:31
Tino
Hallo,
du brauchst doch nur entsprechend mit + oder - 1 zu rechnen.
Gruß Tino
Anzeige
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

58 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige