Registriert seit: 25.09.2014
Version(en): 2013
19.07.2016, 15:05
(Dieser Beitrag wurde zuletzt bearbeitet: 19.07.2016, 15:05 von Kathrin Doppelbauer.)
Hallo an diesem schönen Sonnentag,
ich habe mit ReDim ArFeld(1 to X) ein Feld definiert, das dann von 1 bis Y mit irgendwelchen Werten gefüllt wird. Da ich das Ganze möglichst variabel halten möchte, ist X immer gößer als Y. Geht ja per Definition auch nicht anders.
Sobald das Feld mit Werten bis zum Wert Y gefüllt ist, möchte ich das Feld dann schrumpfen und zwar so, dass es ab dem Wert Y, keine leeren Werte mehr im Feld gibt.
Der Befehl dazu ist euch Cracks natürlich allen bekannt.
Redim Preserve ArFeld (1 to Y).
Meine Frage ist jetzt nur, wie bestimme ich Y?
Ich könnte ja mit einer Schleife bei X beginnen, nachschauen ob ArFeld(X) = "" gilt, also leer ist und dann bis zu dem Wert runterzählen wo das Feld keine leere Werte mehr hat und hätte Y bestimmt. Aber es es das? Geht es nicht effektiver die leeren Zellwerte rauszuschmeißen?
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
Hallo, (19.07.2016, 15:05)Kathrin Doppelbauer schrieb: Sobald das Feld mit Werten bis zum Wert Y gefüllt ist, möchte ich das Feld dann schrumpfen und zwar so, dass es ab dem Wert Y, keine leeren Werte mehr im Feld gibt.
Meine Frage ist jetzt nur, wie bestimme ich Y? Du hast Y schon, sonst könntest Du das Feld nicht füllen. :21: Gruß Uwe
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
Hallo Kathrin, die Frage ist, wie genau Du Dein Array füllst oder zu Deinem Y kommst. So, wie Du es beschreibst, vermute ich, dass es Eintrag für Eintrag gefüllt wird. Du könntest dabei einen Zähler mitlaufen lassen und hast dann Dein Y. Eine andere Variante wäre, die Anzahl der Einträge vorher zu ermitteln und das Array dann erst zu dimensionieren und zu füllen. Ein Array muss übrigens nicht am Anfang schon wahnsinnig groß dimensioniert werden. Man könnte auch, was eher nicht zu empfehlen ist, das Array bei jedem Eintrag erweitern. Was zuweilen gemacht wird, ist, ein Array um größere Happen zu erweitern, z.B. um 50 oder 100. Wenn beim Füllen der Ubound erreicht ist, ziehst Du entsprechend nach: If Y > ubound(ArFeld) Then Redim Preserve ArFeld(1 to ubound(ArFeld)+50) Aber wie Du siehst, nehm ich hier auch schon ein Y
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Registriert seit: 25.09.2014
Version(en): 2013
Hallo André,
meine Fragestellung ist recht theoretisch formuliert. Aber die Ubound - Erweiterung ist als Alternative nicht schlecht. Es handelt sich bei meinen Aufgaben um relativ kleine Felder, damit geht auch bei dem anschließendem Redim Preserve für das Feld so gut wie keine Rechenzeit verloren. Das schafft mein Rechner schon!
Registriert seit: 19.02.2016
Version(en): 2013
23.07.2016, 16:35
(Dieser Beitrag wurde zuletzt bearbeitet: 23.07.2016, 16:35 von Codespiker.)
Für den Spezialfall, dass ein Feld nur mit Zahlen gefüllt wird geht das Entfernen von leeren Datenfeldern doch eigentlich auch so: Code: Sub Feldneudimensionierung() 'Alle leeren Feldelemente oberhalb der Auffüllung entfernen ReDim Ffeld(1 To 20) As Variant For i = 1 To 6 Ffeld(i) = i Next
ReDim Preserve Ffeld(1 To WorksheetFunction.Count("", Ffeld)) End Sub
Wobei ich mich dann wiederum frage, ob man es nicht auch irgendwie hinbekommen könnte, dass eine solche Feldneudimensionierung mit Datenfeldern geht, in denen nicht nur Zahlen, sondern auch Strings stehen.
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
Moin! Man muss das Array doch lediglich durchschleifen und dimensioniert beim ersten IsEmpty() neu: Sub Feldneudimensionierung()
Redim Ffeld(1 To 20) As Variant
Dim i As Long
For i = 1 To 10
Ffeld(i) = Chr(i + 64)
Next
For i = 1 To Ubound(Ffeld)
If IsEmpty(Ffeld(i)) Then
Redim Preserve Ffeld(1 To i - 1)
Exit For
End If
Next
End Sub Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Registriert seit: 19.02.2016
Version(en): 2013
Hallo Ralf, richtig mit einer Schleife gehts natürlich. Aber schau doch mal bitte in der Aufgabenstellung von Kathrin nach. Es geht ja gerade um Alternativen es nicht mit einer Schleife zu machen.
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
23.07.2016, 18:58
(Dieser Beitrag wurde zuletzt bearbeitet: 23.07.2016, 18:58 von RPP63.)
Ja, aber … :21: Da Array-Verarbeitung im Arbeitsspeicher erfolgt, ist hier die Schleife sauschnell und das einzig Sinnvolle. Mit einem "Monster-Array" dauert dies eine halbe Sekunde, wobei die Ermittlung des Chars wohl die Hauptlast darstellt. Sub Feldneudimensionierung()
Redim Ffeld(1 To 1048576) As Variant
Dim i As Long, Start As Double
Start = Timer
For i = 1 To 1000000
Ffeld(i) = Chr(i Mod 64 + 64)
Next
For i = 1 To Ubound(Ffeld)
If IsEmpty(Ffeld(i)) Then
Redim Preserve Ffeld(1 To i - 1)
Exit For
End If
Next
Debug.Print Timer - Start
End Sub Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Registriert seit: 19.02.2016
Version(en): 2013
Hallo Ralf, natürlich ist deine Methode sauschnell, aber ich glaub der Fragestellerin geht es um so wenig Code wie möglich. Und möglich wäre auch so etwas: Code: Sub FeldneudimensionierungII() ReDim Ffeld(1 To 65000) As Variant Dim i As Long, Start As Double Start = Timer For i = 1 To 30 Ffeld(i) = Chr(i Mod 64 + 64) Next
Range("A1:A" & UBound(Ffeld)) = Application.Transpose(Ffeld) x = WorksheetFunction.CountBlank(Range("A1:A" & UBound(Ffeld))) ReDim Preserve Ffeld(1 To UBound(Ffeld) - x) Debug.Print Timer - Start
End Sub
Kann nur bis (etwas über) 65000 Zeilen gehen. Nicht ganz so schnell wie dein Code, aber deutlich unter 1 Sekunde.
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
(23.07.2016, 19:52)Codespiker schrieb: geht es um so wenig Code wie möglich.
Und möglich wäre auch so etwas: ... Nicht ganz so schnell wie dein Code, aber deutlich unter 1 Sekunde. Wow. Leider läuft der Code bei mir nicht (Variable nicht definiert) ! Ganz toll ist auch, einfach in das gerade aktive Blatt zu schreiben. Und war der Code hier auch zu lang oder hat es Dir die Sprache verschlagen?
|