2017-02-07 80 views
-4

感谢您提前给予帮助。我设法创建了一个宏,它在名为“ClientTradeDetails”的工作表的O列中搜索单元格值“True”,如果单元格值为“True”,它将占用整行并将其粘贴到名为“TrueValues”的工作表中。需要加速代码(从一张纸复制/粘贴到另一张)

它的工作原理,但它非常缓慢。正如你所看到的,我的主表中有65536行数据需要经过。我想复制/粘贴是问题,但我不知道如何改变这一点,以避免复制方法。任何帮助?

Sub MoveTrue() 

Sheets("ClientTradeDetails").Select 

Dim tfCol As Range, Cell As Object 

    Set tfCol = Range("O2:O439050") 'Substitute with the range ' 

    For Each Cell In tfCol 

     If Cell.Value = "True" Then 
      Cell.EntireRow.Cut 
      Sheets("TrueValues").Select 
      ActiveSheet.Range("A65536").End(xlUp).Select 
      Selection.Offset(1, 0).Select 
      ActiveSheet.Paste 
     End If 

    Next 

End Sub 
+0

问题在于,您在单个Excel表单中包含那么多数据,并且您期望一个宏可以弥补糟糕的数据管理选择。 – DejaVuSansMono

+2

使用[AutoFilter方法](https://msdn.microsoft.com/en-us/library/office/aa221844.aspx)在一列上过滤true并批量传输值。如果需要的话,重复其他列。您目前正在搜索(针对所有意图和目的)整个工作表。当然,你只有几列可能包含真实的。 – Jeeped

+0

@Jeeped的意思是说我认为用'Intersect(UsedRange,Cell.EntireRow).Cut'这样的东西代替'Cell.Entire.Cut'。这样你只需复制需要的列。不是整行(可能没有填充所有列。另请参阅[避免选择](http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros )。这会大大增加你的速度,而且,根据AutoFitler值的数量也可以减慢,但肯定比循环所有这些行快。 –

回答

0

这可能有点复杂得多,你要找的,但它比复制和粘贴数据更有效率:

Sub GetTrueValues() 

Dim ws As Worksheet 
Dim arr() As Variant 
Dim arrFound() As Variant 
Dim arrOut() As Variant 

Dim i As Long 
Dim j As Long 
Dim k As Long 

Dim lConst As Long: lConst = 15 ' For the O column 

Set ws = ActiveWorkbook.Sheets("SheetName") 
arr() = ws.UsedRange.Value 

For i = LBound(arr()) To UBound(arr()) 
    If arr(i, lConst) = "True" Then 
     k = k + 1 
     ReDim arrFound(1 To k) 
     arrFound(k) = i 
    End If 
Next 

ReDim arrOut(1 To k, 1 To UBound(arr(), 2)) 
For i = 1 To UBound(arrFound()) 
    For j = LBound(arr()) To UBound(arr(), 2) 
     arrOut(i, j) = arr(arrFound(k), j) ' Using the previously stored integer, 
              ' retrieve the records of interest. 
    Next 
Next 

ActiveWorkbook.Sheets.Add 
ActiveSheet.Range("A1").Resize(UBound(arrOut(), 1), UBound(arrOut(), 2)).Value = arrOut() 

End Sub 

这个宏的主要作用是发现的记录数具有true的值,然后将所有这些放入数组中,并将数组吐出到工作表中。您可以根据需要更改将其打印出来的部分。

相关问题