Excel VBA: Vektor ab leeren Einträgen abschneiden

yxy

Lieutenant
Registriert
Juli 2014
Beiträge
552
Hallo,

ich finde einfach keine Lösung zu diesem doch sehr einfach scheinenden Problem.
Und zwar habe ich folgendes Problem:

Ich möchte ein Array erstellen, das n*m lang ist (d.h. ein Vektor).
Problem: Wenn ich das Array definiere muss ich die Größe angeben (n und m werden aber erst beim ausführen des Programms bekannt). Daher habe ich das Array einfach mal total überdimesioniert
Code:
Dim ArFinal(1000) As Variant
Dann habe ich das Array mit einer for-Schleife gefüllt.
Nun möchte ich gerne die Elemente abschneiden, die keinen Wert haben. D.h. das Array so kürzen, dass nur n*m Zeilen bleiben.
Ich finde aber einfach keine Lösung dazu.

Könnt ihr mir da weiterhelfen, oder habt ihr vielleicht eine elegantere Lösung?

Grüße
yxy
 
Hallo,

bau doch das Array dynamisch auf

Beispiel 1:​


'Die Variablen definieren
Dim staedte()
Dim size As Integer
Dim i As Integer

'Anzahl der Einträge in Spalte 1 der Variable size zuweisen
size = WorksheetFunction.CountA(Worksheets(1).Columns(1))

'Die Größe des Arrays anpassen
ReDim staedte(size)

'Dem Array die Werte aus Spalte 1 nach und nach zuweisen
For i = 0 To size
staedte(i) = Cells(i,1).Value
Next i

'Größe des Arrays ausgeben lassen
MsgBox UBound(staedte)


Beispiel 2:​


'Die Variablen definieren
Dim staedte()
Dim size As Integer
Dim i As Integer

'Anzahl der Einträge in Spalte 1 der Variable size zuweisen
size = WorksheetFunction.CountA(Worksheets(1).Columns(1))

'Die Größe des Arrays anpassen
ReDim staedte(size)

'Dem Array die Werte aus Spalte 1 nach und nach zuweisen
For i = 0 To (size – 1)
staedte(i) = Cells(i+1,1).Value
Next i

'Größe des Arrays ausgeben lassen
MsgBox UBound(staedte)
 
  • Gefällt mir
Reaktionen: Janush
Du hast doch nur ein eindimensionales Array als Beispiel angegeben, kein n*m Array? Was trifft jetzt zu?

Ansonsten solltest du per if - clause einfach keine leeren Werte hereinschreiben.

Bist du fertig mit herein schreiben dann: redim preserve Array (Zähler)
 
Stonerrock schrieb:
Hallo,

bau doch das Array dynamisch auf

Beispiel 1:​


'Die Variablen definieren
Dim staedte()
Dim size As Integer
Dim i As Integer

'Anzahl der Einträge in Spalte 1 der Variable size zuweisen
size = WorksheetFunction.CountA(Worksheets(1).Columns(1))

'Die Größe des Arrays anpassen
ReDim staedte(size)

'Dem Array die Werte aus Spalte 1 nach und nach zuweisen
For i = 0 To size
staedte(i) = Cells(i,1).Value
Next i

'Größe des Arrays ausgeben lassen
MsgBox UBound(staedte)


Beispiel 2:​


'Die Variablen definieren
Dim staedte()
Dim size As Integer
Dim i As Integer

'Anzahl der Einträge in Spalte 1 der Variable size zuweisen
size = WorksheetFunction.CountA(Worksheets(1).Columns(1))

'Die Größe des Arrays anpassen
ReDim staedte(size)

'Dem Array die Werte aus Spalte 1 nach und nach zuweisen
For i = 0 To (size – 1)
staedte(i) = Cells(i+1,1).Value
Next i

'Größe des Arrays ausgeben lassen
MsgBox UBound(staedte)
Pefekt, danke. Ich kannte den Befehl ReDim nicht
Ergänzung ()

Majestro1337 schrieb:
Du hast doch nur ein eindimensionales Array als Beispiel angegeben, kein n*m Array? Was trifft jetzt zu?

Ansonsten solltest du per if - clause einfach keine leeren Werte hereinschreiben.

Bist du fertig mit herein schreiben dann: redim preserve Array (Zähler)
n*m ist eine Zahl d.h. z.B. 2*5=10 d.h. ein Vektor mit 10 Elementen. Problem ist aber gelöst, danke :)
 
Beachte aber, dass per ReDim der Inhalt des Arrays verschwindet, sollte schon was drin sein.
Mit ReDim Preserve bleibt der Inhalt erhalten
 
Ich will das PRESERVE noch mal betonen.

Indes - wir leben im Jahre 2021, und auch bei mir nagt die Programmiererehre ein Array nicht auf Vorrat zu groß zu definieren. Wegen des Speicherplatzes.
Ich pfeife mittlerweile drauf. Allgemein zähle ich ab XY(1) und übergehe die 0. Beim Zählen ab 1 kommt dann die ermittelte Anzahl der gefüllten Felder in XY(0) und darauf bauen dann Zählschleifen auf.

Aus Neugier: wenn m und n…
(ich mein’; warum soll nicht ein Produkt die Länge dieses 1-dimensionalen Arrays, Vektors, bestimmen?)
…an sich nicht ursächlich vor dem DIM des Arrays nötig sind kann man auch oben DIM XY() angeben und unten REDIM XY(n*m). Oder, unelegant, einfach erst dann ›weiter unten‹ wenn m und n bekannt sind DIM ausführen.

CN8
 
Zurück
Oben