2016-04-27 39 views
-1

儘管閱讀了幾個線程來搜索類似問題的答案,但我一直無法自行調試我的代碼。VBA基於範圍值將整個行復制到新工作表

我試圖編寫一個宏來搜索AE和BF之間的術語「航空工程師」的所有單元格,然後將包含該術語的所有行復制到新工作表。整個片共有99289.

我曾嘗試使用下面的代碼沒有任何的運氣嘗試:

Sub MoveAero() 
Dim strArray As Variant 
Dim wsSource As Worksheet 
Dim wsDest As Worksheet 
Dim NoRows As Long 
Dim DestNoRows As Long 
Dim I As Long 
Dim J As Integer 
Dim rngCells As Range 
Dim rngFind As Range 
Dim Found As Boolean 

strArray = Array("Aeronautic") 

Set wsSource = ActiveSheet 

NoRows = wsSource.Range("A65536").End(xlUp).Row 
DestNoRows = 1 
Set wsDest = ActiveWorkbook.Worksheets.Add 

For I = 1 To NoRows 

    Set rngCells = wsSource.Range("AE" & I & ":BF" & I) 
    Found = False 
    For J = 0 To UBound(strArray) 
     Found = Found Or Not (rngCells.Find(strArray(J)) Is Nothing) 
    Next J 

    If Found Then 
     rngCells.EntireRow.Copy wsDest.Range("A" & DestNoRows) 

     DestNoRows = DestNoRows + 1 
    End If 
Next I 
End Sub 

感謝任何幫助!

+0

將搜索字符串存儲到變量而不是數組。 – findwindow

+0

考慮描述你的意思是「沒有任何運氣」。有錯誤嗎?如果是這樣,哪條線會引發錯誤,錯誤信息是什麼? –

+0

@DavidZemens當我按照寫入的方式運行宏時,添加了新工作表,但沒有任何內容被複制。沒有錯誤發生 – Mac

回答

0

你的問題是在你的j循環:

For J = 0 To UBound(strArray) 

數組的上界(UboundstrArray爲0。這是一個單一的元素"Aeronautic"的數組。

所以你的循環正在循環一次並退出。

而是試圖通過您的循環範圍:

For Each rngCell in rngCells.Cells 
    if rngCell.value = "Aeronatic" Then 
     Found = True 
     Exit For 
    End if 
Next rngCell 

在這裏,我們通過您剛纔的電池後,電池是rngCells範圍內循環。然後我們測試該單元格是否具有您正在查找的值。如果我們找到它,我們將found設置爲true並退出for循環。您不必退出for循環,但我們找到了我們想要的,所以沒有理由不保存一些cpu時間。


的完整代碼,刪除不必要的變量和移動一點點圍:

Sub MoveAero() 
Dim wsSource As Worksheet 
Dim wsDest As Worksheet 
Dim NoRows As Long 
Dim DestNoRows As Long 
Dim I As Long 
Dim J As Integer 
Dim rngCells As Range 
Dim rngCell as Range 

Set wsSource = ActiveSheet 

NoRows = wsSource.Range("A65536").End(xlUp).Row 
DestNoRows = 1 
Set wsDest = ActiveWorkbook.Worksheets.Add 

For I = 1 To NoRows 

    Set rngCells = wsSource.Range("AE" & I & ":BF" & I) 

    For Each rngCell in rngCells.Cells 
     if rngCell.value = "Aeronatic" Then 
      'Moved this logic up from the IF block below 
      rngCells.EntireRow.Copy wsDest.Range("A" & DestNoRows) 
      DestNoRows = DestNoRows + 1 
      Exit For 
     End if 
    Next rngCell 

Next I 
End Sub 

或者,你可以使用range對象是.find方法,而不是第二For循環。 (不需要使用兩者來滿足您的需求)。

Sub MoveAero() 
Dim wsSource As Worksheet 
Dim wsDest As Worksheet 
Dim NoRows As Long 
Dim DestNoRows As Long 
Dim I As Long 
Dim rngCells As Range 

Set wsSource = ActiveSheet 

NoRows = wsSource.Range("A65536").End(xlUp).Row 
DestNoRows = 1 
Set wsDest = ActiveWorkbook.Worksheets.Add 

For I = 1 To NoRows 

    Set rngCells = wsSource.Range("AE" & I & ":BF" & I) 

    'Try to find your search term in the range 
    If Not (rngCells.Find("Aeronautic") Is Nothing) Then 
     rngCells.EntireRow.Copy wsDest.Range("A" & DestNoRows) 
     DestNoRows = DestNoRows + 1 
    End If 

Next I 
End Sub 
+0

將「For J」替換爲您選擇的內容後的所有內容,現在我得到一個沒有下一個錯誤的for。如果您可以重新發布完整更正的代碼,我將不勝感激。我似乎正在搞砸試圖粘貼你的建議。謝謝! – Mac

+0

太棒了!非常感謝@JNevill。非常感謝 – Mac

+0

沒問題。我發佈了兩個版本。我相信第二個會更快,因爲它在行/範圍上使用find()而不是循環遍歷每個單元格。 – JNevill

相關問題