Erster Inhalt einer Spalte in ListView auslesen.

Skayritares

Grünschnabel
Hallo zusammen,

Ich habe eine Listview, welches Daten enthält aus einer Array stammen.
Nun teste ich das Auslesen der Werte.

Dazu habe ich diesen Code eingebaut:
Visual Basic:
With ListView1
  .LabelEdit = lvwManual
  For x = 1 To 4
    strLsvAusgabe = strLsvAusgabe & .ListItems(x).SubItems(i)
  Next x
End With


MsgBox strLsvAusgabe

Nun habe ich das Problem, dass die Inhalte in der ersten Spalte (da wo A1, B1, C1, D1) steht nicht mit ausgelesen werden.
Was muss ich tun, dass die Werte in der ersten Spalte mit ausgelesen werden?
Ich lade auch die Excel-Datei hoch.


Mein Ziel ist, dass man Daten, die sich im Array befinden bearbeiten kann.
In der Zelle A1 habe ich die Texte welches mit ";" getrennt sind und im Makro gesplittet und dann alles in einem Array gespeichert wird.
Hier der Code:
Visual Basic:
  If TPL.Cells(1, 1).Value = "" Then
    MsgBox "Keine Daten vorhanden!", vbExclamation
    Exit Sub
  Else
  ReDim arrLW(1 To UBound(Spl) / 4, 1 To 4)
  For i = 1 To UBound(arrLW, 1)
    arrLW(i, 1) = Spl((i * 4) - 4)
    arrLW(i, 2) = Spl((i * 4) - 3)
    arrLW(i, 3) = Spl((i * 4) - 2)
    arrLW(i, 4) = Spl((i * 4) - 1)
  Next i
  End If
 

Anhänge

Lösung
Der Ansatz ist gut. Aber, wenn ein Problem auftaucht ist nachher arrLW leer. Das kann man relativ einfach lösen.
[VBA] Cached Object in einer Function [Yaslaw.Info]
Also das arrLW als Property lösen. Dann wird arrLW bei bedarf neu erstellt.

SQL:
Public Property Get arrLW()
    Static staticArrLW()
    
    On Error GoTo LOAD_ARRAY
    If UBound(staticArrLW) = 0 Then GoTo LOAD_ARRAY
    
EXIT_HANDLER:
    arrLW = staticArrLW
    Exit Property
    
LOAD_ARRAY:
    Dim spl$(): spl = Split(TPL.Cells(1, 1).value, ";")
    ReDim staticArrLW(1 To UBound(spl) / 4, 1 To 4)
    For i = 1 To UBound(staticArrLW, 1)
        staticArrLW(i, 1) = spl((i * 4) - 4)
        staticArrLW(i, 2) = spl((i * 4) - 3)
        staticArrLW(i, 3) = spl((i * 4) -...
Mal ohne die Testdatei angeschaut zu haben.
Meistens beginnt der index mit 0, nicht mit 1
Visual Basic:
For x = 0 To 3
 
Klingt gut, ich habe s so geändert, aber da bekomme ich "Laufzeitfehler '35600': Anwendungs- oder objektdefinierter Fehler."
 
OK, Index von 1-4 Stimmt.
Aber die Erste Spalte sind keine Subeitems. Du kannst mit .text() darauf zugreifen.

Test im Direktfenster
Code:
? ListView1.ListItems(1).Text
A1
? ListView1.ListItems(1).SubItems(1)
A2

? ListView1.ListItems(2).Text

B1
? ListView1.ListItems(2).SubItems(1)
B2
Was auffällt, ist das bei B1 noch ein Zeilenumbruch mit drin ist.
Das sieht man noch besser, wenn man eine ANalysefunktion zum verwendet. zB [VBA] print_r() [Yaslaw.Info]
Code:
print_r ListView1.ListItems(1).Text
<String> 'A1'

print_r ListView1.ListItems(2).Text
<String> '\nB1'
Das solltest du beim aufdröseln des CSV noch entfernen.
 
Zuletzt bearbeitet:
Lösung für das Zeilenumbruchproblem. Die Daten Zeilenweise auslesen
Visual Basic:
'AUslesen der Daten
    Dim rows$():    rows = Split(Testdaten, vbLf)
    Dim list():     ReDim list(UBound(rows))
    For i = 0 To UBound(rows)
        list(i) = Split(rows(i), ";")
    Next i
Visual Basic:
'Abfüllen der ListView1
    ListView1.ListItems.clear
    Dim node: For Each node In list
        ListView1.ListItems.Add , , node(0)
        For i = 1 To 3
            ListView1.ListItems(ListView1.ListItems.count).SubItems(i) = node(i)
        Next i
    Next node
 
Inzwischen habe ich was anders ausprobiert, ich habe alle Zeilenumbrüche entfernt.
Und dann habe ich diesen Code entwickelt, es sollte bei einem ausgewählten Item, jeweils in die Textboxen laden.
Aber momentan habe ich nur mit einer Textbox als Demo und funktioniert.
Visual Basic:
Private Sub ListView1_Click()
Dim lngLsvItem As Long
Dim lngAZ As Long

lngAZ = ListView1.SelectedItem.Index

TextBox1 = arrLW(lngAZ, 1) 
End Sub

Aber ich werde deine Codes in nächster Zeit mal ausprobieren.
Also vielen Dank!
 
Der Ansatz ist gut. Aber, wenn ein Problem auftaucht ist nachher arrLW leer. Das kann man relativ einfach lösen.
[VBA] Cached Object in einer Function [Yaslaw.Info]
Also das arrLW als Property lösen. Dann wird arrLW bei bedarf neu erstellt.

SQL:
Public Property Get arrLW()
    Static staticArrLW()
    
    On Error GoTo LOAD_ARRAY
    If UBound(staticArrLW) = 0 Then GoTo LOAD_ARRAY
    
EXIT_HANDLER:
    arrLW = staticArrLW
    Exit Property
    
LOAD_ARRAY:
    Dim spl$(): spl = Split(TPL.Cells(1, 1).value, ";")
    ReDim staticArrLW(1 To UBound(spl) / 4, 1 To 4)
    For i = 1 To UBound(staticArrLW, 1)
        staticArrLW(i, 1) = spl((i * 4) - 4)
        staticArrLW(i, 2) = spl((i * 4) - 3)
        staticArrLW(i, 3) = spl((i * 4) - 2)
        staticArrLW(i, 4) = spl((i * 4) - 1)
    Next i
    GoTo EXIT_HANDLER
End Property

Darauf kann man nachher wie gewohnt zugriefen
SQL:
TextBox1 = arrLW(lngAZ, 1)
 
Lösung
Ich würde möglchst gar nix im Modul hinter der Tabelle setzen. Besser ein eigenes Modul. Da sollte auch der ganez restlche Code rein. Im Tabellenmodul nur noch die Triggers abfangen und dann auf das neue Modul zugreifen.

Im Notfall kannst du natürlich auch das Property in das Tabellenmodul setzen. Macht dann aber kein Spass zu debuggen und du kannst es nur im Kontex der Tabelle verwenden.
 

Neue Beiträge

Zurück