如何避免需要每个循环激活工作表

我在Excel中设置了一些VBA代码,要求用户select第二个工作表,然后在其中search一个值(一个共享键链接两组数据,在Rng之后find6列,在那里我想添加检索值)在第二个表中,并将该行中的值添加到原始表中的列。 我想调整的程序部分是下面的循环。

如果当我离开行来激活CurFile工作簿,它工作正常。 但这意味着我的屏幕在两本工作簿之间来回闪烁。 一旦我开始进入数百或数千行的数据,这将是可笑的慢。

当我注释掉该行时,FindCID的值不会改变,并且似乎只是继续重新填充同一行,即使r的值正在更新。 如果经过几次循环后,我重新join激活行,它会继续正确填写下面的几行结果。

我怎样才能简化呢? 我最初是使用ThisWorkbook引用,但即使显式定义CurFile(CurFile = ActiveWorkbook.Name),似乎没有回到该工作簿来查找下一个值来search,除非我重新激活工作表。

Do While r <= maxRows With Workbooks(CurFile).Worksheets("Sheet1") Set Rng = .Range(Cells(r, c), Cells(r, c)) End With FindCID = Rng.Offset(0, 6).Value If Trim(FindCID) <> "" Then With Workbooks(FN) ' found earlier by a function .Activate End With With Sheets("Sheet1").Range("D:D") Set FoundCell = .Find(What:=FindCID) If Not FoundCell Is Nothing Then PathLen = FoundCell.Offset(0, 2).Value Workbooks(CurFile).Sheets("Sheet1").Activate 'If I comment out this line it doesn't work Rng.Value = PathLen MsgBox "CID found in " & FoundCell.Address & " Its value is " & PathLen Else MsgBox "Nothing found" End If End With End If On Error Resume Next r = r + 1 Loop 

实际上,在处理对象时,在大多数情况下,不需要激活工作簿\工作表。 这是你的代码,在这方面做了一些修改:

 Application.ScreenUpdating = False '(as suggested by CBRF23) '...... 'begining of your code '...... Do While r <= maxRows With Workbooks(CurFile).Worksheets("Sheet1") Set Rng = .Cells(r, c) '(1) End With FindCID = Rng.Offset(0, 6).Value2 If Trim(FindCID) <> "" Then Set FoundCell = Workbooks(FN).Sheets("Sheet1").Range("D:D").Find(What:=FindCID) If Not FoundCell Is Nothing Then Rng.Value = FoundCell.Offset(0, 2).Value2 End If r = r + 1 Loop '...... 'rest of your code '...... Application.ScreenUpdating = True 

(1)注意Range被定义为它只由一个Cell ; 但如果范围有多个Cell即从Cell(r,c)Cell(r,c+5)则需要使用以下格式:

Set Rng = Range(.Cells(r, c), .Cells(r, c+5))

没有必要添加一个句点. Range之前, RangeRange命令中的Cells定义。 通过使用期限.Cell命令之前它们被称为是的一部分

With Workbooks(CurFile).Worksheets("Sheet1")

但是,如果Range定义为A1:F1那么周期. 必须在Range之前添加,如下所示:

Set Rng = .Range(“A1:F1”)

我删除了MsgBox命令,因为我相信他们只是为了testing目的。 没有真正显示这些消息的数百或数千行数据。 不是吗?