Excel VBA - Application.WorksheetFunction.Match

Zvoni

Erfahrenes Mitglied
Ah, der Klassiker!
Code:
If IsNull(ListBox1.List(ListBox1.ListIndex,6)) Then 
UserForm3.TextBox_Betr_DSW.Text = ""   'oder vbNullstring
Else
UserForm3.TextBox_Betr_DSW.Text = ListBox1.List(ListBox1.ListIndex,6)
End If
Solltest du übrigens bei allen betroffenen Feldern der Listbox machen, bei welchen eine NULL drinstehen kann (!)
btw: Falls du die Zuweisung Listbox-Spalte zu Textbox in eine Prozedur/Funktion auslagerst, kannst du innerhalb der Prozedur/Funktion dann eine einfach Fehlerbehandlung machen, anstatt jedes Feld zu prüfen.
irgendwas in der Art wie (ungetestet)
Code:
Private Sub CommandButton2_Click()

If ListBox1.ListIndex > 1 Then   'Eine Zeile ist angeklickt
   
    Load UserForm3
    SetTextFromList UserForm3.TextBox_Ticketnummer.Text, ListBox1.List(ListBox1.ListIndex, 0)
    'usw.

End Sub

Public Sub SetTextFromList(ByRef txt As Textbox, ByRef lstField as Variant)
On Error Resume Next
txt=""   'oder vbNullString
txt=lstField  'Falls es knallt, passiert nix
On Error Goto 0
End Sub
 

jerry0110

Erfahrenes Mitglied
Ich versteh das nicht. Wenn ich die Liste initialisiere dann zeigt er mir alle offenen Daten an.
Wenn ich dann einen Auswähle (ohne zu suchen) dann öffnet er mir die Userform mit allen Daten. Ohne Fehlermeldung. Alle Felder sind gefüllt.

Wenn ich aber einen Datensatz suche und dann auf Ansicht klicke, dann kommt eine Fehlermeldung. Und jetzt mit der Änderung ohne Daten. Also nicht alle Felder sind gefüllt. :(

Was ist der Unterschied zur ersten Auswahl und zur Auswahl nach einer Suche?
 

Yaslaw

n/a
Moderator
IsNull....
Ich implementiere jeweils eine Umsetzung von NZ für Excel
Visual Basic:
'/**
' * Wandelt NULL in Empty oder einen Defaultwert
' * @param  Variant
' * @param  Variant
' * @return Variant
' */
Private Function NZ(ByRef iValue As Variant, Optional ByRef iDefault As Variant = Empty) As Variant
    If IsNull(iValue) Then
        NZ = iDefault
    Else
        NZ = iValue
    End If
End Function
dann währe Zvonis isNull() Umsetzung nur noch ein Einzeiler
Visual Basic:
UserForm3.TextBox_Betr_DSW.Text = nz(ListBox1.List(ListBox1.ListIndex,6))
 

jerry0110

Erfahrenes Mitglied
Ich glaube ich weiß wo der Fehler ist.
Beim UserForm_Initialize habe ich eine for Schleife. mit einer Array.
Bei der Suchfunktion geben ich nur 6 Listbox Items zurück. Deshalb zeigt er auch nur 6 Sachen an.
Wenn ich dann auf Ansicht gehe, dann ist natürlich alles über dem Listbox Item 6 = NULL.

Ich muss jetzt nur noch die for schleife auch in die Suche rein bekommen. dann sind auch die anderen Items nicht mehr NULL.

Oder seh ich das falsch?
 

jerry0110

Erfahrenes Mitglied
Hab den Code jetzt angepasst. Jetzt zeigt er alles ohne Fehler an.

Visual Basic:
Private Sub CommandButton3_Click()

    Dim c As Range
    Dim rngBereich As Range
    Dim lngAnzahl As Long
    Dim strFirst As String
    
    ListBox1.Clear
    
    With Sheets("Datentabelle")
        Set rngBereich = .Columns("A:Q")
        Set c = rngBereich.Find(txtSuche, LookIn:=xlValues, lookat:=xlPart)
        If Not c Is Nothing Then
            strFirst = c.Address
            Do
                ListBox1.AddItem .Cells(c.Row, 1)
                lngAnzahl = ListBox1.ListCount
                ListBox1.List(lngAnzahl - 1, 1) = .Cells(c.Row, 2)
                ListBox1.List(lngAnzahl - 1, 2) = .Cells(c.Row, 3)
                ListBox1.List(lngAnzahl - 1, 3) = .Cells(c.Row, 4)
                ListBox1.List(lngAnzahl - 1, 4) = .Cells(c.Row, 5)
                ListBox1.List(lngAnzahl - 1, 5) = .Cells(c.Row, 6)
                ListBox1.List(lngAnzahl - 1, 6) = .Cells(c.Row, 7)
                ListBox1.List(lngAnzahl - 1, 7) = .Cells(c.Row, 8)
                ListBox1.List(lngAnzahl - 1, 8) = .Cells(c.Row, 9)
                ListBox1.List(lngAnzahl - 1, 9) = .Cells(c.Row, 10)
                ListBox1.List(lngAnzahl - 1, 10) = .Cells(c.Row, 11)
                ListBox1.List(lngAnzahl - 1, 11) = .Cells(c.Row, 12)
                ListBox1.List(lngAnzahl - 1, 12) = .Cells(c.Row, 13)
                ListBox1.List(lngAnzahl - 1, 13) = .Cells(c.Row, 14)
                ListBox1.List(lngAnzahl - 1, 14) = .Cells(c.Row, 15)
                ListBox1.List(lngAnzahl - 1, 15) = .Cells(c.Row, 16)
                ListBox1.List(lngAnzahl - 1, 16) = .Cells(c.Row, 17)
                ListBox1.List(lngAnzahl - 1, 17) = .Cells(c.Row, 18)
                ListBox1.List(lngAnzahl - 1, 18) = .Cells(c.Row, 19)

                Set c = rngBereich.FindNext(c)
            Loop While Not c Is Nothing And c.Address <> strFirst
        End If
    End With
End Sub
 

jerry0110

Erfahrenes Mitglied
Nur wie kann ich jetzt der Suche sagen, dass er nur die Anzeigen soll, die in der Spalte 19 ein True haben?

Mach ich das hier:

Set c = rngBereich.Find(txtSuche, LookIn:=xlValues, lookat:=xlPart)

Oder mit einer If Schleife. Und wenn ja wo genau soll ich die hinsetzen?
 

Zvoni

Erfahrenes Mitglied
Code:
If Not c Is Nothing Then
  strFirst=c.Address
  Do
    If .Cells(c.Row, 19) Then
       ListBox1.AddItem .Cells(c.Row, 1)
    .
    .
     End If
   
     Set c = rngBereich.FindNext(c)

   Loop While