Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Array füllen

Array füllen
promsn
Hallo,
gibt es eine Möglichkeit das die Werte die in das Array geschrieben werden sollen, immer an die nächste Frei Position geschrieben werden?
Mein Problem ist das ich RecordSet habe welches mir die Anzahl der benötigten Zeilen ausgibt und somit ich die größe des Arrays bestimme. Beim ersten Durchlauf der for Schleife klappt das Prima. Da das Programm aber erneut in die Schleife muss beginnt es wieder bei 0 und löscht mir den ersten Eintrag und die folgende Einträge.
Hier mein Code:
rs.MoveFirst
For iView = 0 To rs.RecordCount - 1
ArrOBST(iView, 0) = iTab
ArrOBST(iView, 1) = rs!Distance
ArrOBST(iView, 2) = rs!Elevation
If TabStrip1.Value = ArrOBST(iView, 0) Then
ListView1.ListItems.Add , , ArrOBST(iView, 1)
End If
rs.MoveNext
Next 'iView
Anzeige
baue Dir einen Zähler ein...
28.06.2010 15:10:57
Tino
Hallo,
der sich die letzte Position merkt und
mit jedem Eintrag addierst Du eins zum Zähler hinzu.
Gruß Tino
AW: baue Dir einen Zähler ein...
28.06.2010 15:20:55
promsn
Hi,
dann bräuchte ich als noch eine Spalte?
VG
AW: baue Dir einen Zähler ein...
28.06.2010 15:40:22
Tino
Hallo,
nee, einfach eine Variable im Kopf definieren und diese Anfang oder/und am Ende auf 0 setzen.
Je nachdem wie Dein Array Dimensioniert ist,
muss die Addition vor oder nach dem füllen des Array stattfinden.
Nur ein Beispiel!
Dim HilfsZaehler As Long
Sub Start()
HilfsZaehler = 0
Call Beispiel
Call Beispiel2
HilfsZaehler = 0
End Sub
Sub Beispiel()
ArrOBST(HilfsZaehler, 0) = ITab
ArrOBST(HilfsZaehler, 1) = rs!Distance
ArrOBST(HilfsZaehler, 2) = rs!Elevation
HilfsZaehler = HilfsZaehler + 1
End Sub
Sub Beispiel2()
ArrOBST(HilfsZaehler, 0) = ITab
ArrOBST(HilfsZaehler, 1) = rs!Distance
ArrOBST(HilfsZaehler, 2) = rs!Elevation
HilfsZaehler = HilfsZaehler + 1
End Sub
Gruß Tino
Anzeige
AW: baue Dir einen Zähler ein...
28.06.2010 16:00:12
promsn
Hi,
okay. Ich hatte es genau so :). Nur mit einer Spalte wo ich den Hilfszähler ablege.
Kennst Du Dich auch mit Listview aus?
VG
Listview
28.06.2010 16:04:33
Tino
Hallo,
kommt darauf an, ein bar Kenntnisse habe ich.
Um was geht es?
Gruß Tino
AW: Listview
28.06.2010 16:11:23
promsn
Der Code zum füllen des Arrays steht in einer Private Sub ComboBox1_Change(). D.h. jedes mal wenn sich der Wert in der ComboBox ändert startet er den Code. Der funktioniert jetzt Prima. Auch das füllen der Listview klappt bei der ersten Eingabe in der ComoBox und die Arrays steht ganz oben. Jedoch wenn ich dann den Wert in der Combo ändere stehen die Werte ganz unten und dazwischen sind mehrere Zeilen nicht gefüllt. Auch ein ListView1.ListItems.Clear hilft da nicht.
Anzeige
AW: Listview
28.06.2010 16:35:53
Tino
Hallo,
ich denke das Dein Array beim zweiten Durchlauf nicht entsprechend gefüllt wird.
Mach doch mal an der entsprechenden stelle ein Haltepunkt und schau was im Array steht.
Gruß Tino
AW: Listview
29.06.2010 07:56:14
promsn
Hab ich schon. Es wird alles Richtig abgelegt. Er Durchläuft die Schleife nur so oft wieviele rs.recordcount bringt. Aber wie gesagt, es sind immer viele Leerzeilen davor. Wenn ich dann in meinem Tabs hin und her gehe im Sub TapStrip1.Change () den gleichen Code habe zum Füllen der Felder und Listview, besteht das Problem nicht...
Anzeige
hier ein Beispiel mit Listview
29.06.2010 11:00:47
Tino
Hallo,
habe Dir mal ein Beispiel aufgebaut.
Mehr kann ich auch nicht ohne eine Beispieldatei von Dir.
Entpacke die zip Datei und starte die Datei Abfrage.xls
https://www.herber.de/bbs/user/70320.zip
Gruß Tino
AW: hier ein Beispiel mit Listview
29.06.2010 12:19:37
promsn
Hi,
Super. Du hast mir echt geholfe. Der Fehler lag in meinem TapStripChange. Aber an von Deinem Code konnte ich den Fehler finden.
Jedoch komme ich nicht ganz so klar mit Deinem Code. Wie füllst man die zweite Spalte mit einem Array wert?
VG
Anzeige
AW: hier ein Beispiel mit Listview
29.06.2010 12:40:06
Tino
Hallo,
Listview1.ListItems(1).SubItems(1) = "Spalte 2"
Listview1.ListItems(1).SubItems(2) = "Spalte 3"
ListItems ist die Zeile und SubItems die Spalte,
wobei ListItems schon die erste Spalte füllt durch ListItems.Add... .
Gruß Tino
AW: hier ein Beispiel mit Listview
29.06.2010 12:50:14
promsn
Hi,
ich habe es jetzt so gelöst:
With ListView1
With .ListItems.Add(Text:=ArrOBST(j, 1))
.SubItems(1) = ArrOBST(j, 2)
End With
.Sorted = True ' Sortierte Anzeige
.SortKey = 0 ' Sortierung nach erster Spalte
.SortOrder = lvwAscending ' Aufsteigende Sortierung
End With
Das funktioniert auch soweit. Sobald ich jedoch die Sort nutze habe ich bei klicken auf einen Tab immer im ersten Tap im Listview in der ersten Zeile nichts drin stehen. Bei den anderen Tabs klappt das Prima. Wenn ich das Sort ausschalte passt alles, nur halt nicht sortiert.
VG
Anzeige
AW: hier ein Beispiel mit Listview
29.06.2010 13:04:52
promsn
Hi,
ich noch mal. Fehler gefunden (leeres array). Habe jedoch einen anderen. Es werden alle Tabs sortiert außer das erste.
AW: hier ein Beispiel mit Listview
29.06.2010 15:22:43
promsn
Fehler gefunden. ListView kann nicht nach Zahlen sortieren... grrr
AW: hier ein Beispiel mit Listview
30.06.2010 06:18:09
Tino
Hallo,
verwende doch Quicksort und baue den etwas um und Multipliziere im Quicksort den Wert im Array mit 1
http://www.online-excel.de/excel/singsel_vba.php?f=97
Allerdings darf kein Text in der Spalte mehr vorkommen.
Private Sub prcQuickSort(lngLbound As Long, lngUbound As Long, _
intSortColumn As Integer, bntSortKey As Boolean, vntArray() As Variant)
Dim intIndex As Integer
Dim lngIndex1 As Long, lngIndex2 As Long
Dim vntTemp As Variant, vntBuffer As Variant
lngIndex1 = lngLbound
lngIndex2 = lngUbound
vntBuffer = vntArray((lngLbound + lngUbound) \ 2, intSortColumn) * 1
Do
If bntSortKey Then
Do While vntArray(lngIndex1, intSortColumn) * 1  vntBuffer
lngIndex1 = lngIndex1 + 1
Loop
Do While vntBuffer > vntArray(lngIndex2, intSortColumn) * 1
lngIndex2 = lngIndex2 - 1
Loop
End If
If lngIndex1  _
vntArray(lngIndex2, intSortColumn) * 1 Then
For intIndex = LBound(vntArray, 2) To UBound(vntArray, 2)
vntTemp = vntArray(lngIndex1, intIndex)
vntArray(lngIndex1, intIndex) = _
vntArray(lngIndex2, intIndex)
vntArray(lngIndex2, intIndex) = vntTemp
Next
End If
lngIndex1 = lngIndex1 + 1
lngIndex2 = lngIndex2 - 1
ElseIf lngIndex1 = lngIndex2 Then
lngIndex1 = lngIndex1 + 1
lngIndex2 = lngIndex2 - 1
End If
Loop Until lngIndex1 > lngIndex2
If lngLbound 

Gruß Tino
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Array füllen in Excel VBA


Schritt-für-Schritt-Anleitung

Um ein Array in Excel VBA zu füllen, kannst Du folgende Schritte befolgen:

  1. Array definieren: Zuerst musst Du das Array definieren. Dies kann entweder als eindimensionales oder mehrdimensionales Array geschehen.

    Dim ArrOBST() As Variant
    ReDim ArrOBST(0 To 100, 0 To 2) ' Beispiel für ein 2D-Array
  2. Hilfszähler einfügen: Um sicherzustellen, dass die Werte immer an die nächste freie Position geschrieben werden, solltest Du eine Variable als Zähler verwenden.

    Dim HilfsZaehler As Long
    HilfsZaehler = 0
  3. Daten ins Array füllen: Verwende eine Schleife, um die Werte in das Array zu schreiben und den Zähler nach jedem Eintrag zu erhöhen.

    For i = 0 To rs.RecordCount - 1
        ArrOBST(HilfsZaehler, 0) = iTab
        ArrOBST(HilfsZaehler, 1) = rs!Distance
        ArrOBST(HilfsZaehler, 2) = rs!Elevation
        HilfsZaehler = HilfsZaehler + 1
        rs.MoveNext
    Next i
  4. Daten anzeigen: Um die Daten im ListView anzuzeigen, kannst Du den folgenden Code verwenden.

    With ListView1
        With .ListItems.Add(Text:=ArrOBST(HilfsZaehler, 1))
            .SubItems(1) = ArrOBST(HilfsZaehler, 2)
        End With
    End With

Häufige Fehler und Lösungen

  1. Kein Array-Wert gefunden: Achte darauf, dass der Zähler ordnungsgemäß erhöht wird. Wenn der Zähler nicht korrekt funktioniert, kann es sein, dass Du beim Füllen des Arrays auf leere Werte stößt.

  2. Leere Zeilen im ListView: Wenn das ListView nach dem Füllen des Arrays leere Zeilen anzeigt, könnte das daran liegen, dass das Array nicht vollständig gefüllt wurde. Überprüfe die Schleifenbedingungen und stelle sicher, dass das Array korrekt gefüllt wird.

  3. Falsche Sortierung: Wenn das ListView nicht korrekt sortiert ist, kann es helfen, die Sortierlogik zu überprüfen. Achte darauf, dass Du die Daten vor der Sortierung korrekt hinzufügst.


Alternative Methoden

  1. Array mit Werten füllen: Du kannst auch ein Array direkt mit Werten füllen, ohne eine Schleife zu verwenden:

    ArrOBST = Array(Array("Wert1", "Wert2"), Array("Wert3", "Wert4"))
  2. Excel VBA Array definieren und füllen: Nutze Split für das Füllen eines eindimensionalen Arrays:

    Dim Arr() As String
    Arr = Split("Wert1,Wert2,Wert3", ",")

Praktische Beispiele

Hier ist ein einfaches Beispiel, wie Du ein Excel VBA Array füllen kannst:

Sub Beispiel()
    Dim ArrOBST(0 To 10, 0 To 2) As Variant
    Dim i As Integer
    Dim HilfsZaehler As Long
    HilfsZaehler = 0

    For i = 0 To 10
        ArrOBST(HilfsZaehler, 0) = "Tab" & i
        ArrOBST(HilfsZaehler, 1) = i * 10
        ArrOBST(HilfsZaehler, 2) = i * 20
        HilfsZaehler = HilfsZaehler + 1
    Next i
End Sub

Tipps für Profis

  • Verwende ReDim Preserve: Wenn Du die Größe eines bereits gefüllten Arrays ändern möchtest, nutze ReDim Preserve, um die bestehenden Werte zu behalten.

  • Fehlerbehandlung einfügen: Implementiere eine Fehlerbehandlung, um Probleme beim Füllen des Arrays zu erkennen und zu beheben.

  • Verwende VBA-Funktionen: Nutze VBA-Funktionen wie UBound und LBound, um die Grenzen des Arrays zu ermitteln und Fehler zu vermeiden.


FAQ: Häufige Fragen

1. Wie kann ich ein eindimensionales Array in Excel VBA füllen? Du kannst ein eindimensionales Array mit einer Schleife füllen, indem Du einfach die Indizes anpasst.

2. Was ist der Unterschied zwischen einem eindimensionalen und einem mehrdimensionalen Array? Ein eindimensionales Array hat nur eine Dimension, während ein mehrdimensionales Array mehrere Dimensionen hat, was bedeutet, dass Du Daten in einer Matrix speichern kannst.

3. Wie kann ich die Größe eines Arrays nach dem Füllen ändern? Verwende ReDim Preserve, um die Größe eines Arrays zu ändern, ohne die bestehenden Daten zu verlieren.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige