find一个单元格,检查其他的出现,并复制出现的偏移量。 错误91,块没有设置

首先我打开这个问题: 检查合并单元格,并比较相邻设置比较单元格值的唯一值 。 同样的情况,第column 6键值和第column 31 column 6值现在要求已经改变。

现在我需要search第column 6每个单元格,并且对于此search的每一次出现,将值(第column 25 )从第一次出现复制到其他单元格。 我的意思是,如果我有五个search“KEY_VALUE”的结果,我需要将与第一个search结果相关联的第column 25的值复制到第column 25中的其他相应单元格中。

问题是,当我运行我的代码时, 运行时错误91:对象variables或块variables未设置,即使我有一个With块。

我正在阅读对象variables或块未设置 -但在我的情况下,我试图分配一个stringvariables与search的结果不是一个范围。 这是我的代码:

 Sub CopyUUID() Dim lRow As Long Dim rng As Range Dim searchResult As Range Dim ws As Worksheet Dim strSearch As String Dim uuid As Variant Set ws = Sheets(ActiveSheet.Name) With ws lRow = .Range("F" & .Rows.count).End(xlUp).row Set rng = .Range(.Cells(3, 6), .Cells(lRow, 6)) For Each cellchecked In rng.Cells If Not IsEmpty(cellchecked.Value) Or Not cellchecked.Value = "" Then 'strSearch = cellchecked.Value Set searchResult = rng.Find(What:=cellchecked.Value, LookIn:=xlValues, _ LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) uuid = searchResult.Offset(0, 25).Value 'Gives error "run time error 91: object variable or with block variable not set" Do Set searchResult = rng.FindNext(After:=searchResult) If Not searchResult Is Nothing Then searResult.Offset(0, 25).Value = uuid Else Exit Do End If Loop Else 'If cell is blank, skips execution as no continue exists in VBA End If Next cellchecked End With ExitProgram: Exit Sub End Sub 

可能是什么问题呢?

你得到的错误(“运行时错误91:对象variables或块variables未设置”),因为代码没有find匹配

因此,总是build议检查是否find了匹配。 你可以在你做下面的改变时检查你看到的是哪个消息框?

 Set searchResult = Rng.Find(What:=cellchecked.Value, LookIn:=xlValues, _ LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) If searchResult Is Nothing Then Msgbox "No Match Found" Else Msgbox "Match Found" uuid = searchResult.Offset(0, 25).Value ' '~~> Rest of the code ' End If 

我会build议看到这个

您只想要遍历一组唯一的值,并且应该执行Range.FindNext方法上的一些退出策略,或者可能会进入一个无限循环。

 Sub CopyUUID() Dim lRow As Long Dim chk As Range, rng As Range Dim rslt As Range, addr As String Dim ws As Worksheet Dim key As Variant, dKEYs As Object Set ws = Sheets(ActiveSheet.Name) Set dKEYs = CreateObject("Scripting.Dictionary") With ws lRow = .Range("F" & .Rows.Count).End(xlUp).Row Set rng = .Range(.Cells(3, 6), .Cells(lRow, 6)) For Each chk In rng.Cells If CBool(Len(chk.Value2)) And Not dKEYs.exists(chk.Value2) Then dKEYs.Add key:=chk.Value2, Item:=chk.Offset(0, 25).Value End If Next chk For Each key In dKEYs Set rslt = rng.Find(What:=key, after:=rng(rng.Cells.Count), LookIn:=xlValues, _ LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False) addr = rslt.Address Do Set rslt = rng.FindNext(after:=rslt) If rslt.Address <> addr Then rslt.Offset(0, 25) = dKEYs.Item(key) Else Exit Do End If Loop Next key End With ExitProgram: Exit Sub End Sub 

字典对象维护列F中每个值的第一次出现的唯一列表以及来自列AE的关联UUID值。 每个将始终被发现至less一次,所以即使On Error Resume Next可以被丢弃(从来不是一件坏事!)。

总结一下,上面介绍了我在代码中发现的三个问题。

  1. 更正var searchResult上的拼写错误。 它至less在一个地方被用作searResult
  2. 现在有一个退出策略,一旦find所有的附加条目,它就会退出.FindNext ,并且它会循环回到原来的位置。
  3. 列F中的每个条目只运行一次,其中列AE中的replace是第一次出现的值。 原始代码将遍历列中的每个条目,以便在duplcaited值上执行Range.Find / Range.FindNext方法 。 这不仅仅是一种低效率的错误,而且如果避免的话仍然是最好的。