2013-10-20 140 views
0

我工作的一個CommandButton宏搜索在另一個工作表中的列文本字符串,如果找到,並將文字「發現」在原來的工作表中的列。搜索文本字符串由原始工作表中兩個特定單元格中的文本定義。遍歷列,搜索文本

我已經構建了認定上的另一個工作表的範圍內對該文本進行一些工作的代碼,但它與行1000的處理時速度很慢。如何將我的代碼轉換爲在這種情況下使用循環(我認爲這是最快的方法)?

我當前的代碼:

Private Sub CommandButton1_Click() 
On Error Resume Next 
Application.ScreenUpdating = False 
Dim artist As String 
artist = ActiveSheet.Range("C4").Text 

Dim title As String 
title = ActiveSheet.Range("C5").Text 

Dim tick As String 
tick = "found" 

Dim c As Range 
Dim d As Range 
For Each c In Sheets("Repertoire").Range("F1:F2000") 
For Each d In Sheets("Repertoire").Range("G1:G2000") 

If c.Value = artist And d.Value = title Then 

Sheets("Dashboard").Range("F4").Value = artist 
Sheets("Dashboard").Range("G4").Value = title 
Sheets("Dashboard").Range("H4").Value = tick 

End If 
Next 
Next 

End Sub 
+0

你有沒有考慮過使用VLOOKUP? –

+0

我有,但我需要使用CommandButton來完成此任務。 VLOOKUP可以集成到VBA中嗎? – Byate

+1

如果你想VBA,那麼你可能要考慮使用[.Find而.FindNext(http://www.siddharthrout.com/2011/07/14/find-and-findnext-in-excel-vba/) –

回答

1

Try this using Find method

Private Sub CommandButton1_Click() 
    Dim artistFound As Range, titleFound As Range, artist As String, title As String, c As Range, d As Range 

    artist = ActiveSheet.Range("C4") 
    title = ActiveSheet.Range("C5") 

    Set c = Sheets("Repertoire").Range("F1:F2000") 
    Set d = Sheets("Repertoire").Range("G1:G2000") 

    Set artistFound = c.Find(What:=artist, After:=c.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False) 
    Set titleFound = d.Find(What:=title, After:=d.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False) 

    If Not artistFound Is Nothing And Not titleFound Is Nothing Then 
     With Sheets("Dashboard") 
      .Range("F4").Value = artist 
      .Range("G4").Value = title 
      .Range("H4").Value = "found" 
     End With 
    End If 
End Sub 
+0

這真是太棒了 - 但是如果在同一行上找到藝術家和標題,是否有辦法返回以下值? '.Range(「F4」)。Value = artist .Range(「G4」)。Value = title 。Range(「H4」)。Value =「found」' – Byate

+0

您的意思是您的匹配條件是如果藝術家和標題在「Repertoire」表單中的同一行上? –

+0

刪除所有對'd'和'titleFound'的引用,並將'If ...'行替換爲:'If not artistFound is Nothing and artistFound.Offset(0,1)= title Then'。這是否做到了? –

0

你真正的問題是嵌套循環。

如果需要,這兩個藝術家和標題中的「劇目」在同一行上出現,那麼你就需要掃描下來的列只有一次找對。

如果您需要藝術家F欄出現在任何地方和任何地方的標題出現在G列,那麼你就需要先掃描下來列女性尋找藝術家,然後掃描下來G列中尋找稱號。

在這兩種情況下,你不需要嵌套循環。

編輯#1

基於您的評論:

Sub Button1_Click() 
    artist = ActiveSheet.Range("C4") 
    title = ActiveSheet.Range("C5") 
    tick = "Found" 
    Set c = Sheets("Repertoire").Range("F1:F2000") 
    Set d = Sheets("Repertoire").Range("G1:G2000") 
    For Each cc In c 
     If cc.Value = artist And cc.Offset(0, 1).Value = title Then 
      Sheets("Dashboard").Range("F4").Value = artist 
      Sheets("Dashboard").Range("G4").Value = title 
      Sheets("Dashboard").Range("H4").Value = tick 
      Exit Sub 
     End If 
    Next cc 
End Sub 

我,因爲我是使用去蟲一個表單按鈕使用的button1_Click

+0

是的,剛剛意識到這是一個問題。你如何用VBA指定兩個搜索字符串存在於同一行上? – Byate

+0

真的很有用,謝謝。只要我獲得更多的聲望點,我會盡快回復這個答案。 – Byate

+0

感謝您的反饋。 –