Vba 运行时错误91:对象变量或未设置块
我有一个宏,可以搜索某个日期,并将其从一张工作表复制到另一张工作表中(如果找到该值),并对非空的每一行重复 在我当前的文档中,大约有150行,以下宏运行正常,但随机抛出错误: 运行时错误“91”:未设置对象变量或带块变量 这是宏:Vba 运行时错误91:对象变量或未设置块,vba,excel,Vba,Excel,我有一个宏,可以搜索某个日期,并将其从一张工作表复制到另一张工作表中(如果找到该值),并对非空的每一行重复 在我当前的文档中,大约有150行,以下宏运行正常,但随机抛出错误: 运行时错误“91”:未设置对象变量或带块变量 这是宏: Sub Update() Application.ScreenUpdating = False Application.CutCopyMode = False Application.StatusBar = "Cleaning New Roles..." Shee
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
调试将突出显示单元格。查找
行
我不明白为什么前100行还可以,然后它就断了
任何指导都会非常有用。通常,如果找不到搜索的字符串,就会出现此错误。VBA不会提出“找不到您要查找的内容”,而是向您抛出此错误消息。因此,您需要确保为VBA提供的要查找的所有内容实际上都在那里,或者捕获错误并解决如果不存在该错误该怎么办。如果未找到搜索的字符串,通常会出现此错误。VBA不会提出“找不到您要查找的内容”,而是向您抛出此错误消息。因此,您需要确保为VBA提供的要查找的所有内容实际上都在那里,或者捕获错误并解决如果不在那里该怎么办。如果成功,
Find()
函数将返回一个范围
对象。您假设它总是这样,并将一个Activate()
调用链接到末尾:
Cells.Find(What:=SearchValue, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False).Activate
如果Find()
失败,这将失败。相反,将返回值指定给范围
对象并测试是否成功:
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
Find()
函数如果成功,将返回一个Range
对象。您假设它总是这样,并将一个Activate()
调用链接到末尾:
Cells.Find(What:=SearchValue, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False).Activate
如果Find()
失败,这将失败。相反,将返回值指定给范围
对象并测试是否成功:
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
不要太多
,试试看。选择
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
有关摆脱依靠选择和激活来实现目标的更多方法,请参阅。在没有太多的情况下尝试。选择
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
请参阅,以了解有关如何摆脱依赖选择和激活来实现目标的更多方法。错误上转到错误上的处理程序不应该处理未找到的值吗?错误上转到错误上的处理程序不应该处理未找到的值吗?错误上转到错误上的处理程序不应该处理未找到的值吗由找不到值引起的错误?错误上的是否应转到错误处理程序
不处理由找不到值引起的错误?Jeeped,在查找单元格中添加检查,如Bond的回答所示。如果你这样做,你的答案就更完整了。我没有为此设置一个完整的测试环境,但是抛出到error\u handler:
的错误处理程序应该会处理这个问题,并且更像OP的原始代码。Jeeped,在finding cell中添加checking for nothing,如Bond的答案所示。如果你这样做,你的答案就更完整了。我没有为此设置一个完整的测试环境,但是抛出到error\u handler:
的错误处理程序应该处理这个问题,并且与OP的原始代码更为相似。