這是我第一次製作Excel用戶窗體並使用VBA編碼。我正在Excel中創建一個用戶表單,以便能夠根據諸如「作者姓名」,「關鍵詞」,「種類」等搜索詞搜索科學論文(論文中的信息輸入到Excel中)。每個搜索詞當前都是一個不同的用戶表單,並且此示例基於「作者搜索」用戶表單。使用.find,.findnext,使用和不使用循環的excel用戶窗體中的下一個按鈕的問題
我的用戶表單有一個cmdSearch按鈕,允許用戶輸入作者姓名並找到與該搜索匹配的第一條記錄。表示諸如作者姓名,標題,摘要等字段的控制框然後從Excel文件中的該行填充。我正在嘗試向表單中添加一個cmdNext和cmdPrevious按鈕,以繼續向前搜索具有相同作者姓名的每一行,或者返回到先前查看的記錄。我修改了此前和其他網站上發現的代碼,並遇到兩個問題之一。
使用下面的代碼,當我點擊下一個按鈕時,在每個匹配的記錄中填入控制框,彈出消息框(「點擊下一個」)(它找到我的所有記錄,太棒了!)。問題是,如果您在消息框上單擊確定,它將直接進入下一個記錄和下一個消息框。您不能退出消息框,停止記錄並檢查。 (通過在這裏檢查,我的意思是查看記錄並單擊控制框來讀取或複製文本。)這會一直持續到所有記錄循環播放(可能會有很多消息框和大量點擊,這是由於記錄數)。
如果我刪除MsgBox的「單擊下一條記錄」,則循環會一路通過所有記錄,直到達到最後一條記錄(控制框將填充上一個匹配記錄和消息框的信息說「最後的記錄」),然後用戶就不能查看其間的任何記錄。
另一方面,如果我一起取出循環,當您單擊cmdNext按鈕時,它只會將您帶到第一個匹配記錄,並且當我再次單擊下一步時,沒有任何反應,它不會發生到那之後的下一個記錄。我用我的cmdPrevious按鈕使用SearchDirection:= xlPrevious有同樣的問題。
顯然有一些關於循環如何工作的地方,或者說我不明白的地方或者我正在做的事情,那麼當我嘗試不使用循環時,不允許cmdNext繼續查找下一條記錄。任何建議將不勝感激。下面是我使用的代碼:
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
非常感謝大衛,完美的工作! – aakmajian
@aakmajian歡呼!如果你能夠在你的項目中成功實現這一點,那麼對於「第一次」的VBA用戶來說,你的表現非常好!很高興我能幫上忙! –
我確實得到了這個工作,但是我後面的按鈕有問題。除了使用SearchDirection:= xlPrevious和.FindPrevious外,我有兩個後退按鈕「返回」和「繼續」,它們使用與上述相同的代碼(加上您的代碼)。當我點擊「返回」時,不是轉到最近查看的記錄(即真正的上一個記錄),而是轉到倒數第二個記錄。就好像代碼搜索最後一個記錄然後去了那個之前那樣。 「繼續」按預期工作。你有沒有任何建議? (我需要編輯我原來的帖子來添加這個?) – aakmajian