Запускайте «FindNext», только если кнопка нажата в пользовательской форме - PullRequest
0 голосов
/ 08 июля 2019

Я настраиваю форму пользователя, чтобы найти название компании.Каждая компания имеет 10 строк данных.Мне нужна кнопка, чтобы выбрать первую строку, а затем остановить и запустить findnext только при повторном нажатии кнопки.

В настоящее время мой код правильно находит название компании, но из-за цикла он непосредственно выбирает последнюю строку сназвание компании.Мне нужно выбрать первый раз, когда имя появляется, а затем найти следующий, только если я снова нажму на кнопку

Private Sub CommandButton1_Click()
Dim lastrow As Long, i As Long, c As String
Dim mycell As Range

lastrow = Sheets("Rent Roll").Range("A" & Rows.Count).End(xlUp).Row
c = TextBox1.Text

With Sheets("Rent Roll").Range("C5:C" & lastrow)
Set mycell = .Find(what:=c, LookIn:=xlValues)

If Not mycell Is Nothing Then
firstAddress = mycell.Address

   Do
   mycell.Select

   Set mycell = .FindNext(mycell)

   Loop While Not mycell Is Nothing And mycell.Address <> firstAddress

Else
MsgBox ("Not Found")

End If

End With

Exit Sub


End Sub

Если я введу «Google», он должен выбрать первую строку и затем остановиться.Затем, если я снова нажму на кнопку, используйте findnext и выберите следующую ячейку с «Google»

1 Ответ

0 голосов
/ 08 июля 2019

Вы должны быть в состоянии что-то вроде этого:

Private Sub CommandButton1_Click()
    Static lastCell As Range  '<< static variables preserve values between calls
    Static lastTerm As String

    Dim ws As Worksheet, rngSrch As Range
    Dim lastrow As Long, i As Long, c As String
    Dim f As Range, afterCell As Range

    Set ws = ThisWorkbook.Worksheets("Rent Roll")
    Set rngSrch = ws.Range(ws.Range("C5"), ws.Cells(Rows.Count, "C").End(xlUp))

    c = TextBox1.Text

    'new search term?
    If c <> lastTerm Then
        Set lastCell = Nothing
        lastTerm = c
    End If

    If Len(c) = 0 Then Exit Sub '<< nothing to search for

    If lastCell Is Nothing Then
        Set afterCell = Rng.Cells(Rng.Cells.Count)
    Else
        Set afterCell = lastCell
    End If

    Set f = rngSrch.Find(what:=c, after:=afterCell, LookIn:=xlValues)
    If f Is Nothing Then
        MsgBox ("'" & c & "' not found")
    Else
        If f.Row < lastCell.Row Then
            MsgBox "Already at the last row" '<< do this, or just keep wrapping round?
        Else
            f.Select
            Set lastCell = f
        End If
    End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...