我在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
答案 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
命令,因为我认为它们仅用于测试目的。 并未真正显示数百或数千行数据的这些消息。不是吗?