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

时间:2015-09-25 18:36:05

标签: excel vba excel-vba

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

如果我离开该行以激活CurFile工作簿,它可以正常工作。但这意味着我的屏幕在两个工作簿之间来回闪烁。一旦我开始涉及数百或数千行数据,它将会非常缓慢。

当我注释掉那一行时,FindCID的值不会改变,它似乎只是继续重新填充同一行,即使r的值正在更新。如果在几次循环之后我将激活线添加回来,它会恢复正确填充几行的结果。

我该如何简化这个?我最初使用的是ThisWorkbook引用,但即使明确定义了CurFile(CurFile = ActiveWorkbook.Name),它似乎也不会回到该工作簿来查找要搜索的下一个值,除非我重新激活工作表。 / p>

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

1 个答案:

答案 0 :(得分:1)

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

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定义了范围,因此无需在Cells之前添加句点Range。通过在.命令之前使用句点Cell,它们被称为

的一部分

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

但是,如果Range定义为A1:F1,则必须在.之前添加句点Range,如下所示:

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

我删除了MsgBox命令,因为我认为它们仅用于测试目的。 并未真正显示数百或数千行数据的这些消息。不是吗?