2017-07-11 9 views
0

Ich habe die folgende Sub, um eine Zelle basierend auf drei Kriterien zu finden.VBA User ListBox und TextBox

Private Sub FindEstimate_Click() 

Dim i As Long 

i = 5 
Do 
    If Cells(i, 1) = TextBox1 And Cells(i, 6) = ListBox1 And Cells(i, 9) = ListBox2 Then 
     Cells(i, 1).Select 
    End If 
    i = i + 1 
Loop Until Cells(i, 1) = TextBox1 And Cells(i, 6) = ListBox1 And Cells(i, 9) = ListBox2 

End Sub 

Es funktioniert einfach nicht, und ich vermute, es hat etwas mit dem Loop Until Anweisung zu tun.

+0

Was genau wollen Sie mit 'Zellen (i, 6) = ListBox1' und' Zellen (i, 9) = ListBox2' überprüfen? das 'Selected' Element in der' ListBox'? –

+0

'Range.Find' ist wahrscheinlich eine bessere Idee als Looping. –

+0

Ich versuche, die erste Zelle einer Zeile basierend auf drei Kriterien zu finden. Die erste ist eine geschätzte Nummer (z. B. "8888" "8889"). Ein anderes ist (Spalte 6), ist Website (z. B. Facebook *, Twitter *, Pinterest *). Spalte 9 ist Monat (6/16, 7/16-7/17). –

Antwort

1

Sie besser für die Verwendung der Find Funktion und Schleife durch alle Find Ergebnisse in Spalte „A“ (für den Fall gibt es mehrere Übereinstimmungen mit TextBox1.Value), bis Sie mit ListBox1.Value und ListBox2.Value auch eine Übereinstimmung der Lage zu finden sind.

Dafür verwenden Sie eine Do < ->Loop While Not FindRng Is Nothing And FindRng.Address <> FirstAddres Schleife.

-Code

Option Explicit 

Private Sub FindEstimate_Click() 

Dim Rng As Range 
Dim FindRng As Range 
Dim FirstRng As Range 
Dim FirstAddress As String 


Set Rng = Range("A5:A" & Cells(Rows.Count, "A").End(xlUp).Row) 

With Rng 
    Set FindRng = .Find(what:=Me.TextBox1.Value, LookIn:=xlValues, _ 
         lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext) 

    If Not FindRng Is Nothing Then ' find was successful 
     ' Set FirstRng = FindRng 
     FirstAddress = FindRng.Address 

     Do 
      If FindRng.Offset(, 5).Value = Me.ListBox1.Value And FindRng.Offset(, 8).Value = Me.ListBox2.Value Then 
       FindRng.Select ' <-- not sure why you need to select it 
       Exit Do 
      End If 
      Set FindRng = .FindNext(FindRng) 
     Loop While Not FindRng Is Nothing And FindRng.Address <> FirstAddress 

    Else ' Find faild to find the value in TextBox1 
     MsgBox "Unable to find " & Me.TextBox1.Value & " at column A" 
    End If 
End With 

End Sub