Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1892to1896
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

zweidimensionales Array

zweidimensionales Array
25.07.2022 17:37:57
MartinG.
Hallo zusammen,
ähnlich C++ möchte ich gerne mehrere zweidimensionale Arrays füllen und im späteren Zustand drauf zugreifen.
Es werden mehrere Bereiche von Zustand 0 eingelesen und im Array0 (1-10)(1-10)
Anschließend werden alle möglichen Kombinationen durchgerechnet und mit Feldern aus Array 0 verglichen.
Je nach Ergebnis wird dann mit Array1 oder Array2 verglichen und diese ggf. überschrieben.
Am ehesten kann ich es wie einen Routenplaner beschreiben
Array0 ist die per Hand geplante Route (Zustand0)
Arrays1 ist die schnellste Route
Array2 ist die kürzeste Route
Am Ende wählt der Anwender zwischen den drei Zuständen 0,1 und 2.
ich könnte eine temporäre Arbeitsmappe erzeugen und dort die Felder hinschreiben, wird aber vermutlich deutlich langsamer und auch weniger elegant sein.
p.s.
Wieso definiert man teilweise so das Array?
ReDim ArrayZustand0(1 To 6) As String 'Array
Wenn man auch
ReDim ArrayZustand0(6) As String
schreiben könnte?
Mehrdimensional wäre dann
ReDim ArrayZustand0(10, letzteZeile) As String
?!
Welchen Dateityp würdet ihr mir empfehlen und was wären Stolpersteine?
Kann ich Uhrzeiten in dem Array miteinander vergleichen, selbst wenn das Array ein String ist? Bzw. vermutlich werde ich die bisher besten Werte sowieso in einer Variablen ablegen und das Array gilt nur als Textspeicher.
Herzlichen Dank für Rat und Tipps :)

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: zweidimensionales Array
25.07.2022 18:02:21
Daniel
Hi
die Frage ist, mit welchem StartIndex du dein Array beginnen willst.
mit Dim arr(10) gibst du ja nur einen Index an und das ist dann der EndIndex.
der Startindex wird dann vom System übernommen und der ist in der Regel 0.
mit dim arr(10) bekommst du als den Bereich von 0-10 (also 11 Elemente)
wenn man das Array mit einem anderen Startwert beginnen will oder unabhängig von der Systemeinstellung, dann muss man den Startindex ebenfalls mit angeben: dim arr(1 to 10) oder dim arr(0 to 10). es sind aber auch alle anderen Startindizes möglich: dim arr(15 to 24)
wenn du generell bei deinen Arrays den Startindex 1 haben willst, kannst du das für das Modul festlegen, in dem du oberhalb der Makros den Befehl eingibst: Option Base 1
dann ist ohne Angabe des Startindex dieser die 1 und nicht die 0. das geht aber nur für 1. willst du einen anderen Startindex, dann musst du das wie gezeigt angeben.
Gruß Daniel
Anzeige
AW: zweidimensionales Array
25.07.2022 18:08:24
onur
REDIM ist die Änderung einer Dimensionierung, die mit (z.B.)
DIM Arr()
erfolgt ist.
Dim Arr(1 to 6) geht nur von Arr(1) bis Arr(6) - Wenn du Dim Arr(6) schreibst, ist es das Selbe wie Dim Arr(0 to 6) - Also Arr(0) bis Arr(6), also 7 Elemente.
AW: zweidimensionales Array
25.07.2022 18:37:40
Daniel
ReDim geht auch solo!
das Dim Arr() kann man sich theoretisch sparen.
da ich es aber für sinnvoll halte, alle verwendeten Variablen im Programmkopf einmal aufzulisten bevorzuge ich die Variante mit dem ersten unspezifischen Dim Arr(), da ich das ReDim ja in der Regel erst später im Code einsetzen kann, weil die Dimensionsgrößen vorher berechnet werden müssen.
Aber da kann man auch anderer Meinung sein und dann nur das Redim verwenden ohne das Dim vorher.
ReDim ohne Dim vorher ist also kein Fehler, sondern eine Frage des Programmierstils.
Gruß Daniel
Anzeige
AW: zweidimensionales Array
25.07.2022 18:38:56
onur
Gut zu wissen - Danke Daniel!
AW: zweidimensionales Array
26.07.2022 07:55:09
Martin
Dankeschön ihr beiden!
Wie sieht es mit dem Format des Arrays aus?
String allein schon, weil Text, Uhrzeiten und Zahlen miteinander gemischt sind?!
Euch noch einen schönen Dienstag und dickes Danke für eure Erklärungen.
Ich nehme an das ganze gilt auch 1 zu 1 für ein zweidimensionales Array?
AW: zweidimensionales Array
26.07.2022 08:48:30
Daniel
Hi
Ja, gilt auch für 2-D.
Bei gemischten Inhalten als Variant deklarieren, bzw die Typangabe einfach weglassen.
Gruß Daniel
AW: zweidimensionales Array
26.07.2022 09:02:12
Martin
Welche Version würdest du empfehlen? Leer oder Variant?
Dankeschön, dann gleich mal das gelernte testen :)
AW: zweidimensionales Array
26.07.2022 09:08:23
Daniel
Wenn du bei der Deklaration keinen Typ angibst (leer), dann verwendet VBA den Typ Variant.
Es macht also keinen Unterschied, ob du schreibst dim x oder dim x as Variant
Gruß Daniel
Anzeige
AW: zweidimensionales Array
26.07.2022 09:08:36
Oberschlumpf
Hi Martin
für dich könnte auch der Benutzerdefinierte Datentyp (BD) in Frage kommen.
BD's können auch als Arrays deklariert werden - aber - solche Arrays können Datenfelder mit unterschiedlichen Datentypen enthalten!
ich finde, eine sehr gute Erklärung mit Beispielen zeigt MS hier:
https://docs.microsoft.com/de-de/office/vba/language/reference/user-interface-help/type-statement
Nix desto trotz möcht auch ich dir ein Bsp Zeigen - der folgende Code in ein allgemeines Modul:

Option Explicit
Type DeinDatensatz
DeinText As String
DeinDatum As Date
DeineZahl As Integer 'oder Double, oder Long..oder oder oder....du zeigst ja leider nicht ne Bsp-Datei per Upload
End Type
Dim DeineRoute(1 To 10) As DeinDatensatz 'auch wenn nur 1 to 10 angegeben ist (1dimensional); das Array DeineRoute ist trotzdem mehrdimensional, weil ja "pro Zeile im Array" 3 Werte enthalten sind/sein können
'mit Daten füllen könntest du das Array nun z Bsp so
With DeineRoute(1)
.DeinText = Range("A1").Value 'in der aktuellen Tabelle steht in Zelle A1 dein Text
.DeinDatum = Range("B1").Value 'in der aktuellen Tabelle steht in Zelle B1 dein Datum; es MUSS sich auch um ein echtes Datum handeln, weil ja .DeinDatum als DATE deklariert ist
.DeineZahl = Range("C1").Value 'in der aktuellen Tabelle steht in Zelle C1 deine Zahl (als Integer?, Double?, Long?...nur du weißt das)
End With
With DeineRoute(2)
.DeinText = Range("A2").Value
.DeinDatum = Range("B2").Value
.DeineZahl = Range("C2").Value
End With
With DeineRoute(3)
.DeinText = Range("A3").Value
.DeinDatum = Range("B3").Value
.DeineZahl = Range("C3").Value
End With
'....usw...
Natürlich könnte man dein Array auch mit For/Next füllen, da ich all das hier aber nur so direkt hier ohne Testen aufschreibe, ist mir die einfachste Form der Darstellung am liebsten.
So, vielleicht konnte ja auch ich ein wenig helfen - und - vielleicht zeigst du uns mal ne Bsp-Datei mit ausreichend vielen Bsp-Datenzeilen in den richtigen Spalten und allem anderen, was erforderlich ist, um dir vllt noch besser helfen zu können.
Ciao
Thorsten
Anzeige
AW: zweidimensionales Array
26.07.2022 10:47:34
Martin
Hallo Thorsten,
wooow. Vielen lieben Dank!
Das muss ich mir erstmal in Ruhe zu Gemüte führen.
Noch gibt es gar keine Beispielversion.
Ich bin gerade am Aufbauen und die Strukturen am Festlegen und testen.
Dankeschön nochmal euch allen!
Bin gespannt ob ich es nun alleine bis zum Ziel schaffe *grins*
Vielleicht brauche ich dann bei der Brutforce Variationsmethode nochmal Hilfe, um nicht die Hälfte aller Kombinationen doppelt durchzugehen ;)
Ich bin gespannt wie schnell das ganze dann wird.
p.s. Meine Geschwindigkeitsfunktionen:

Private Sub SpeedOn()
'Speedblock on
With Application
.ScreenUpdating = False
.DisplayStatusBar = False
.Calculation = xlCalculationManual
.EnableEvents = False
End With
ActiveSheet.DisplayPageBreaks = False
End Sub

Private Sub SpeedOff()
'Speedblock off
With Application
.ScreenUpdating = True
.DisplayStatusBar = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
.DisplayAlerts = True
End With
ActiveSheet.DisplayPageBreaks = True
End Sub

Anzeige
AW: zweidimensionales Array
26.07.2022 10:49:49
Martin
p.s. ich frage mich gerade, ob es Sinn macht, die Displaybreaks nur beim aktiven Sheet zu deaktivieren?
Wie deaktiviere ich sie temporär komplett und ist das sinnvoll?

Private Sub SpeedOn()
'Speedblock on
With Application
.ScreenUpdating = False
.DisplayStatusBar = False
.Calculation = xlCalculationManual
.EnableEvents = False
End With
ActiveSheet.DisplayPageBreaks = False
End Sub

Private Sub SpeedOff()
'Speedblock off
With Application
.ScreenUpdating = True
.DisplayStatusBar = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
.DisplayAlerts = True
End With
ActiveSheet.DisplayPageBreaks = True
End Sub

Anzeige
AW: zweidimensionales Array
26.07.2022 10:55:41
Daniel
Hi
das SpeedOn/SpeedOff bringt dir nur was, wenn du per Schleife Einzelzellen im Tabellenblatt bearbeitest.
vermeidest du Schleifen über Einzelzellen im Tabellenblatt durch alternative Bearbeitungsmethoden oder führst du die Berechnung und damit die Schleifen in einem Array durch (welches ja vom Tabellenblatt entkoppelt ist), dann bringt dir das SpeedOn sehr wenig bis nichts.
Wenn SpeedOn eine signifikante Verbesserung der Verarbeitungsgeschwindidigkeit, dann ist das ein Indikator dass der Code noch nicht die Fähigkeiten von Excel und VBA optimal nutzt und daher noch verbessert werden kann.
Gruß Daniel
Anzeige
AW: zweidimensionales Array
26.07.2022 12:54:48
Martin
Hi Daniel,
war eine Designentscheidung, dass viele Funktionen direkt Änderungen am Tabellenblatt vornehmen.
Und ist nun ziemlich fest drin ;)
Dankeschön aber noch für die Erklärung, war trotzdem Aufschlussreich.
Meine Frage wegen des Displaybrakes bleibt:
"ich frage mich, ob es Sinn macht, die Displaybreaks nur beim aktiven Sheet zu deaktivieren?
Wie deaktiviere ich sie temporär komplett und ist das sinnvoll?"

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige