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

Redim Preserve

Redim Preserve
08.01.2023 17:05:28
Herbert_Grom
Hallo,
manchmal steht man auf der Leitung und sieht den Wald vor lauter Bäumen nicht! Der folgende Code ist nur ein Ausschnitt aus dem ganzen Code. Der Rest läuft ohne Probleme durch.

Option Explicit
Option Base 1
Sub test()
Dim dAuswahlDatum As Date, arrDaten(), lArrCount&, lRowS&, lCol&, lLastRow&
For lRowS = 4 To lLastRow
If Cells(lRowS, 1) = dAuswahlDatum Then
lArrCount = lArrCount + 1
ReDim Preserve arrDaten(1 To lArrCount, 1 To 16)
For lCol = 1 To 16
arrDaten(lArrCount, lCol) = Cells(lRowS, lCol)
Next lCol
End If
Next lRowS
End Sub
Beim 2. Durchlauf steigt er mir in der Redim-Zeile aus, wenn lArrCount auf 2 wechselt. Ich habe schon alle möglichen Redim-Varianten ausprobiert, aber keine funktionierende gefunden. Könnt ihr mir bitte sagen, wo ich da den Fehler eingebaut habe? Vielen Dank im Voraus.
Servus

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

Betreff
Datum
Anwender
Anzeige
AW: Redim Preserve
08.01.2023 17:15:33
GerdL
Hallo Herbert,
mit Redim Preserve kann man nur die letzte (rechte) Dimension des Datenfelds ändern.
Da ist umgekehrtes Einlesen und vor/bei der Ausgabe Transponieren angesagt.
Gruß Gerd
AW: Redim Preserve
08.01.2023 17:41:16
Herbert_Grom
Hallo Gerd,
danke für deine Antwort. Wenn ich es schon vorweg dimensioniere, wie in diesem Bild gezeigt, dann läuft er durch. Zumindest die die "ArrDaten(1,1 - 1,16). Wenn ich es aber am Ende korrigieren will, weil es evtl. mehr oder weniger als die 10 dimensionierten Datensätze sind, dann klappt es leider nicht. Sitz der Redim-Befehl evtl. in der falschen Zeile? Wie müsste ich es machen, dass er immer nur die Anzahl der lArrCount dimensioniert?
Servus
Userbild
Anzeige
AW: Redim Preserve
08.01.2023 17:26:12
Daniel
Hi
ReDim Preserve kann bei mehrdimensionalen Arrays immer nur den letzten Index verändern, also hier die Spaltenanzahl. Die Zeilen müssen bleiben wie sie sind.
Du bauchst hier aber kein Redim Preserve, weil du ja schon vorab zählen kannst, wieviele Zeilen du bekommst und dann gleich die richtige Größe verwenden kannst:

Sub test()
Dim dAuswahlDatum As Date, arrDaten(), lArrCount&, lRowS&, lCol&, lLastRow&
ReDim arrDaten(1 to Worksheetfunction.CountIf(Columns(1), dAuswahlDatum), 1 to 16)
For lRowS = 4 To lLastRow
If Cells(lRowS, 1) = dAuswahlDatum Then
lArrCount = lArrCount + 1
For lCol = 1 To 16
arrDaten(lArrCount, lCol) = Cells(lRowS, lCol)
Next lCol
End If
Next lRowS
End Sub
Noch ein Tipp
Wenn du die Liste nach Spalte A sortierst, kannst du auch Anzahl und erste Zeile des Blocks ermitteln und dann ohne Schleife die Werte direkt ins Array schreiben.
Gruß Daniel
Anzeige
AW: Redim Preserve
08.01.2023 18:05:46
Herbert_Grom
Hallo Daniel,
vielen Dank für deine Info. Das ist der richtige Tipp, einfach die mögliche Anzahl vorher ermitteln mit CountIf. Nochmals vielen Dank!!!
Servus
Achtung bei mehreren DIM in einer Zeile
08.01.2023 23:29:49
Marc

Dim dAuswahlDatum As Date, arrDaten(), lArrCount&, lRowS&, lCol&, lLastRow&
hierbei muss man aufpassen, da nur das erste Dim "dAushwahlDatum" eine eindeutige Typtzweisung hat, die anderen Variablen, sind nicht eindeutig zu gewiesen,
daher empfiehlt es sich folgend es zu schreiben:

Dim dAuswahlDatum As Date, arrDaten() As Array, lArrCount& as Integer, lRowS& As Integer, lCol& as Integer, lLastRow& as Intger

Anzeige
denkste!?
09.01.2023 06:59:32
ralf_b
Stimmt nicht. Die "&" Zeichen sind die Alternative zu Long und die Zuweisung in der Form passt auch einzeilig.
AW: Achtung bei mehreren DIM in einer Zeile
09.01.2023 09:24:08
Herbert_Grom
Hallo Marc,
vielen Dank für deinen Tipp, doch da solltest du dich mal über die Variablen-Kürzel informieren, denn das "&" ist sehr wohl eine regelkonforme Variablendeklaration.
Servus
& übersehen
09.01.2023 13:45:40
Marc
Entschuldige ja habe das & einfach übersehen und nicht wahrgenommen.
da liegt mein Fehler vor ja
AW: Redim Preserve
09.01.2023 11:38:35
snb
Minimiere das Lesen/Schrieben in eiens Arbeitsblattes.
Verwende Arrays oder ähnliches (wie unten)
Verzichte auf Option Base 1 (wir verwenden ein Dezimal System wo 20 minus 10 identisch isch zu 10 - 0)
Menen Vorschlag:

Sub M_snb()
With CreateObject("New:{8BD21D20-EC42-11CE-9E0D-00AA006002F3}")
.List = Sheet1.Cells(1).CurrentRegion.Value
For j = UBound(.List) To 0 Step -1
If .List(j, 0)  dAuswahlDatum Then .RemoveItem j
Next
sn = .List
End With
End Sub
oder

Sub M_snb()
With Sheet1.Cells(1).CurrentRegion
.AutoFilter 1, dAuswahlDatum
.Offset(1).Copy Sheet1.Cells(1, 100)
.AutoFilter
End With
sn = Sheet1.Cells(1, 100).CurrentRegion
sheet1.Cells(1, 100).CurrentRegion.clear
End Sub

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige