Q:

Problems making next button in excel userform using .find, .findnext, with and without using a loop

This is my first time making Excel userforms and using VBA coding. I am creating a userform in Excel to be able to search for scientific papers based on search terms such as "Author name", "Keywords", "Species" etc (the information from the papers is typed into Excel). Each search term is currently a different userform and this example is based on the "Author Search" userform. 
My userform has a cmdSearch button that allows the user to type in the Author's name and find the first record matching that search. Control boxes representing fields such as Author names, title, abstract, etc. are then populated from that row in the Excel file. I am trying to add a cmdNext and cmdPrevious button to the form to continue searching forward to each row that has the same Author name or to go back to the previously viewed record. I have modified code previously found on this and other websites and encounter one of two problems.
Using the code below, when I click the next button, at each matching record the control boxes are populated and the message box ("Click for next") pops up (It is finding all my records, great!). The problem is that if you click OK on the message box it goes straight to the next record and next message box. You cannot exit the message box, stop at the record and examine. (By examine here I mean look at the record and click on a control box to read or copy the text.) This continues until it loops through all the records (which can be a lot of message boxes and a lot of clicks due to the number of records). 
If I remove the line MsgBox "Click for next record", the loop instead goes all the way through all the records until it reaches the last record (the control boxes are populated with info from the last matching record and message box says "Last record") and the user cannot then look at any of the records in between. 
If, on the other hand, I take out the loop all together, when you click the cmdNext button it takes you only to the first matching record and when I click Next a second time, nothing happens, it does not go to the next record after that. I have the same problems with my cmdPrevious button using SearchDirection:=xlPrevious.
There is obviously something about how the loop works or where put it that I don't understand or something I am doing that is not allowing the cmdNext to continue finding the next record when I try without using a loop. Any suggestions would be much appreciated. Below is the code I am using:
Private Sub cmdNext_Click()

Dim data As Range
Dim findrow As Range
Dim nextrow As Range
Dim ws As Worksheet
Dim Search As String

On Error Resume Next

Set ws = Worksheets("literature_format")
Set data = Sheet1.Range("H:H")

Search = Me.txtSearch.Value

If Search = "" Then
    MsgBox "Enter author or editor name"
    Else

Set findrow = data.find(What:=Search, LookIn:=xlValues, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)

If Not findrow Is Nothing Then
        Set nextrow = findrow
        Do
            Set findrow = data.FindNext(After:=findrow)
            If Not findrow Is Nothing Then
            If findrow.Address = nextrow.Address Then Exit Do
            Me.Control1.Value = findrow.Offset(0, 0)
            Me.Control2.Value = findrow.Offset(0, 3)
            Me.Control3.Value = findrow.Offset(0, 4)
            Me.Control4.Value = findrow.Offset(0, 15)
            Me.Control5.Value = findrow.Offset(0, 2)
            Me.Control6.Value = findrow.Offset(0, -7)
            Me.Control7.Value = "Name of author(s)"
            MsgBox "Click for next record"

            Else

            End If

        Loop
        MsgBox "Last record"

    Else

    End If

End If

End Sub

A:

You cannot exit the message box, stop at the record and examine. (By examine here I mean look at the record and click on a control box to read or copy the text.) 

Instead of a MsgBox prompt, you should do the following:

Add some control buttons like cmdContinue to the UserForm.
You'll need to add a public or module level variable such as bContinue as Boolean. This variable will be False by default.
The _Click procedure for the cmdContinue button should set the bContinue value to True, which we'll use in step 4.
When the procedure "finds" a matching element, populate the field(s) on the UserForm and execute a loop until some condition is met (this is basically an infinite loop with an escape condition). 
Optionally, include the MsgBox to indicate the user should press the "continue" button (or, if there are other buttons which copy/etc. the data, they could use those instead

For example, I think this is the basic approach:
    Do
        Set findrow = data.FindNext(After:=findrow)
        If Not findrow Is Nothing Then
        If findrow.Address = nextrow.Address Then Exit Do
        Me.Control1.Value = findrow.Offset(0, 0)
        Me.Control2.Value = findrow.Offset(0, 3)
        Me.Control3.Value = findrow.Offset(0, 4)
        Me.Control4.Value = findrow.Offset(0, 15)
        Me.Control5.Value = findrow.Offset(0, 2)
        Me.Control6.Value = findrow.Offset(0, -7)
        Me.Control7.Value = "Name of author(s)"

        'This should loop indefinitely until the user presses the "cmdContinue" button, and that will allow it to process the next record
        Do While Not bContinue
            DoEvents
        Loop
        ' reset to False so that the above loop will work for the next match
        bContinue = False
        Else

        End If

    Loop

I tested with a very simple form, and two buttons, one which triggers an infinite loop with a DoEvents, and another which stops the infinite loop:

Dim bContinue As Boolean

Private Sub CommandButton2_Click()
    bContinue = True
End Sub

Private Sub UserForm_initialize()

End Sub
Private Sub CommandButton1_Click()
    bContinue = False
    Do While Not bContinue
        DoEvents
    Loop
End Sub

