2016-11-15 6 views
1

У меня есть этот код, который я использую для поиска диапазона, когда я нажимаю элемент в своем списке. Я никогда не зацикливался на списке и хочу знать, как я добавляю цикл, чтобы выполнять то, что мне нужно, не нажимая каждый элемент в списке. Вот код, я использую:Excel VBA цикл через список

Sub FindListValue() 

Dim FirstAddress As String 
Dim rSearch As Range 'range to search 
Dim c As Range 

With Sheets("PN-BINS") 
    Set rSearch = .Range("B1", .Range("B65536").End(xlUp)) 
End With 

Dim i As Long 

' loop through all items in ListBox1 
For i = 0 To Me.ListBox1.ListCount - 1 

    ' current string to search for 
    strFind = Me.ListBox1.List(i) 

    With rSearch 
    Set c = .Find(strFind, LookIn:=xlValues, LookAt:=xlWhole) 
    If Not c Is Nothing Then 'found it 
    c.Select 
    Me.ListBox1.AddItem strFind & " | " & c.Offset(0, -1).Value, Me.ListBox1.ListIndex + 1 
    Me.ListBox1.RemoveItem (Me.ListBox1.ListIndex) 
    'Exit Sub 

    Else: 'MsgBox strFind & " is not listed!" 'search failed 

    End If 
    End With 

    ' the rest of your code logics goes here... 
Next i 

End Sub 
+0

Я не уверен, что я понимаю вопрос. Вы выбрали что-то из своего списка и хотите использовать это значение, чтобы найти что-то в диапазоне (что вы можете сделать либо с помощью цикла, либо с помощью метода «Найти»), поэтому, когда происходит щелчок по каждому элементу в списке войти в него? – jsheeran

+0

Когда я нажимаю элемент в списке, я заменяю строку поисковой информацией из диапазона, который отлично работает, если я нажимаю каждый элемент. То, что я хочу сделать, заключается в том, что вам нужно просто щелкнуть элементы в списке вместе и просто выполнить поиск по каждой строке в списке. Если он найден, замените строку. Если он не найден, просто ничего не делайте. Надеюсь, у меня есть смысл. – Noob2Java

+0

@ user3340949 попробуйте код в моем ответе ниже и посмотрите, работает ли он на вас –

ответ

1

Для того, чтобы перебрать все элементы в ListBox1, используйте следующий цикл:

Dim i     As Long 

' loop through all items in ListBox1 
For i = 0 To Me.ListBox1.ListCount - 1 

    ' current string to search for 
    strFind = Me.ListBox1.List(i) 

    ' the rest of your code logics goes here... 


Next i 

Кстати, это лучше, если вы определяете rSearch диапазон в следующим образом (без использования Activate и ActiveSheet)

With Sheets("PN-BINS") 
    Set rSearch = .Range("B1", .Range("B65536").End(xlUp)) 
End With 

Редактировать 1: Весь код

Sub FindListValue() 

Dim FirstAddress  As String 
Dim rSearch    As Range 'range to search 
Dim c     As Range 
Dim i     As Long 

With Sheets("PN-BINS") 
    Set rSearch = .Range("B1", .Range("B65536").End(xlUp)) 
End With 

' loop through all items in ListBox1 
For i = 0 To Me.ListBox1.ListCount - 1 

    strFind = Me.ListBox1.List(i) ' string to look for 

    Set c = rSearch.Find(strFind, LookIn:=xlValues, LookAt:=xlWhole) 

    ' current ListBox1 item is found 
    If Not c Is Nothing Then 
     Me.ListBox1.AddItem strFind & " | " & c.Offset(0, -1).Value, i + 1 
     Me.ListBox1.RemoveItem (i) 

     ' ****** not sure if you want to use the line below ? ****** 
     Exit Sub 
    Else 
     MsgBox strFind & " is not listed!" 'search failed 
    End If 

Next i 

End Sub 
+0

Спасибо за помощь. Я редактировал свой вопрос с изменениями, которые я только что сделал, исходя из вашего предложения. Я получаю сообщение об ошибке «c.select». Не правильно ли я установил код? – Noob2Java

+0

@ user3340949 вы не должны использовать код, который вы получаете в своих ответах внутри своего сообщения, этим вы занимаетесь своим пост. Вы можете либо принять ответ, который вы получили, либо пометить рядом с ним «v», или (если они не работают) комментарий, где они все еще дают вам сообщение об ошибке. В любом случае, нет необходимости использовать эту строку 'c.Select', вы можете просто удалить ее –

+1

спасибо за помощь, код отлично работает. Спасибо за информацию о редактировании сообщений, я буду уверен, и не буду этого делать в будущем. – Noob2Java