Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Ein Feld so effektiv wie möglich schrumpfen
#1
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?
Antworten Top
#2
Hallo,
(19.07.2016, 14: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
Antworten Top
#3
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 Smile
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#4
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!
Antworten Top
#5
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.
Antworten Top
#6
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)
Antworten Top
#7
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.
Antworten Top
#8
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)
Antworten Top
#9
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.
Antworten Top
#10
(23.07.2016, 18: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?
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste