2016-07-04 68 views
1

我是Excel VBA新手,没有太多经验。我有两个数据工作表,我比较,然后如果一个值匹配我复制并粘贴到第二个工作表。我使用for循环来比较每一行,并想知道是否有更好的方法来做到这一点?我目前正在使用蛮力,并希望有一种方式,以便我的程序不会运行很长时间。 (我在不同的工作表上重复这段代码13次)。从本质上讲,如果符合某些条件,这些代码就会整合信息。以下是我的代码。如何在我的Excel VBA代码中重构比较循环的速度?

Sub consolidate(z) 
     Sheets(z).Range("B1:AXH100").Delete '''deletes former values''' 
     For i = 1 To 30 
     For x = 1 To 500 
     If IsEmpty(Sheets("Sheet1").Cells(x, 13)) Then 'if cell value is empty skip it' 
      a = 1 
     Else: 
      If Sheets("Sheet1").Cells(x, 18) = Sheets(z).Cells(1, 1) Then 'check to see if value is same' 
      If Sheets("Sheet1").Cells(x, 13) = Sheets(z).Cells(i, 1) Then 'check to see if value is same' 
       Sheets("Sheet1").Cells(x, 15).Copy 'copy value' 
       Sheets(z).Select 'select second sheet' 
       Cells(i, 1).Select 
       ActiveSheet.Cells(ActiveCell.Row, Columns.Count).End(xlToLeft).Offset(0, 1).Select 'offsets cell to the 
    left' 
       Selection.PasteSpecial past:=xlPasteValues 'pastes' 
     End Sub 
+1

哪里有可能,你应该尽量避免使用选择单元格,因为这会导致屏幕更新,这很慢。你可以尝试在开始时加入Application.ScreenUpdating = False,看看它是否改善了它。这里的替代选择被给出为[链接](http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) – Clusks

+2

代码似乎不完整(缺少'下一步's abd'End If's)你也可以避免使用'Copy'并直接在'targetRange.Value = sourceRange.Value'中分配值。 – arcadeprecinct

回答

0

正如我回答here,如果你需要访问或更改几个单元,你好得多读取单元到一个数组,直接与阵列(或多个)工作,并把结果返回到Excel一旦你完成了。这是相当多的工作,Excel的数组处理不是最好的,但速度方面没有比较。

This article更详细地解释了该过程。