2016-09-22 136 views
1

這是我第一次製作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 

回答

0

您不能退出消息框,在記錄停止和檢查。 (通過檢查在這裏我的意思是看記錄,然後點擊控制箱讀取或複製的文本。)

取而代之的是MsgBox提示,你應該做到以下幾點:

  1. 添加一些控制按鈕像cmdContinue到UserForm。
  2. 您需要添加一個公共或模塊級變量,如bContinue as Boolean。這個變量默認爲False
  3. _Click程序cmdContinue按鈕應設置bContinue值爲True,我們將在步驟4中使用該值。
  4. 當過程「找到」一個匹配的元素時,填充UserForm中的字段並執行一個循環,直到滿足一些條件(這基本上是一個帶有逃逸條件的無限循環)。
  5. 任選地,包括MsgBox以指示用戶應該按下「繼續」按鈕(或,如果存在,其複製/等等的其他按鈕。的數據,他們可以用這些代替

例如,我認爲這是基本的方法:

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 

我用非常簡單的形式進行測試,和兩個按鈕,一個觸發與DoEvents無限循環,而另一個停止無限循環:

enter image description here

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 
+1

非常感謝大衛,完美的工作! – aakmajian

+0

@aakmajian歡呼!如果你能夠在你的項目中成功實現這一點,那麼對於「第一次」的VBA用戶來說,你的表現非常好!很高興我能幫上忙! –

+0

我確實得到了這個工作,但是我後面的按鈕有問題。除了使用SearchDirection:= xlPrevious和.FindPrevious外,我有兩個後退按鈕「返回」和「繼續」,它們使用與上述相同的代碼(加上您的代碼)。當我點擊「返回」時,不是轉到最近查看的記錄(即真正的上一個記錄),而是轉到倒數第二個記錄。就好像代碼搜索最後一個記錄然後去了那個之前那樣。 「繼續」按預期工作。你有沒有任何建議? (我需要編輯我原來的帖子來添加這個?) – aakmajian