我有一个宏,可以搜索并将一个日期中的某些日期复制回另一个,如果找到该值,则重复每个不为空的行。
在我当前的文档中,大约150行,以下宏运行正常,但随机抛出错误:
运行时错误'91':对象变量或未设置块变量
这是宏:
Sub Update()
Application.ScreenUpdating = False
Application.CutCopyMode = False
Application.StatusBar = "Cleaning New Roles..."
Sheets("new").Select
Range("A2").Select
Do Until IsEmpty(ActiveCell)
Dim SearchValue As String
SearchValue = ActiveCell.Value
Sheets("Old").Select
On Error GoTo Error_handler
Cells.Find(What:=SearchValue, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False).Activate
Range("R" & Selection.Row & ":T" & Selection.Row).Select
Selection.Copy
ActiveCell.Offset(0, -1).Select
Sheets("new").Select
Range("R" & Selection.Row).Select
Selection.PasteSpecial Paste:=xlPasteValues
Error_handler:
Sheets("new").Select
Range("A" & Selection.Row).Select
ActiveCell.Offset(1, 0).Select
Loop
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub
调试突出显示Cells.Find
行。
我看不出为什么前100行是好的然后它就会中断。
任何指导都会非常有用。
答案 0 :(得分:3)
尝试不用.Select
。
Sub Update()
Dim SearchValue As String, rFnd As Range, o As Long
Application.ScreenUpdating = False
Application.CutCopyMode = False
Application.StatusBar = "Cleaning New Roles..."
With Sheets("new")
o = 0
Do Until IsEmpty(Range("A2").Offset(o, 0))
SearchValue = vbNullString
SearchValue = .Range("A2").Offset(o, 0).Value
With Sheets("Old")
On Error GoTo Error_handler
Set rFnd = .Cells.Find(What:=SearchValue, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False)
Sheets("new").Range("R2").Offset(o, 0).Resize(1, 3) = _
.Range("R" & rFnd.Row).Resize(1, 3).Value
End With
Error_handler:
o = o + 1
Loop
End With
Application.ScreenUpdating = True
Application.StatusBar = vbNullString
End Sub
有关远离依赖选择和激活以实现目标的更多方法,请参阅How to avoid using Select in Excel VBA macros。
答案 1 :(得分:1)
Find()
函数返回Range
对象,如果成功。您假设它始终是,并且您将Activate()
电话链接到最后:
Cells.Find(What:=SearchValue, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False).Activate
如果Find()
失败,则会失败。相反,将返回值分配给Range
对象并测试是否成功:
Dim r As Range
Set r = Cells.Find(What:=SearchValue, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False)
If Not r Is Nothing Then
' Find successful
End If
答案 2 :(得分:0)
如果找不到搜索到的字符串,通常会出现此错误。 VBA没有提出"无法找到你想要的东西"但是会向您抛出此错误消息。所以你需要确保你要为VBA寻找的所有东西都在那里,或者抓住错误并解决如果不是这样做的事情。