找到一个单元格,检查其他出现并复制出现中的偏移量。错误 91,未设置块

Find one cell, check other ocurrences and copy offset in ocurrences. Error 91, block not set

首先我打开了这个问题:。相同的场景,column 6 处的键值和 column 31 处的值,但现在要求已更改。

现在我需要搜索 column 6 中的每个单元格,对于每次出现的搜索,将值 (column 25) 从第一个出现的位置复制到其他单元格。我的意思是,如果我有五个搜索结果 "KEY_VALUE",我需要将 column 25 中与第一个搜索结果关联的值复制到 column 25 中相应单元格中的其他结果.

问题是,当我 运行 我的代码时,我得到 运行 时间错误 91:对象变量或块变量未设置 即使我这样做了有一个 With 块。

我正在阅读 Object variable or with block not set - 但在我的例子中,我试图分配一个字符串变量,搜索结果不是一个范围。这是我的代码:

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

可能是什么问题?

您只想遍历一组唯一的值,应该实施 Range.FindNext method 上的一些退出策略,否则它可能会进入无限循环。

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 值。每一个都会至少被发现一次,所以即使 On Error Resume Next 也可以被丢弃(这绝不是坏事!)。

总而言之,以上内容解决了我在您的代码中发现的三个问题。

  1. 更正了 var searchResult 上的一个拼写错误。它至少在一处被用作 searResult
  2. 现在有一个退出策略,可以在找到所有其他条目后退出 .FindNext 并循环回到原始条目。
  3. F 列中的每个条目仅 运行 到一次,AE 列中的替换值是第一次出现时的值。原始代码将 运行 遍历列中的每个条目,因此它对重复值执行 Range.Find / Range.FindNext method。这与其说是错误,不如说是效率低下,但如果避免的话仍然是最好的。

您收到该错误 ("run time error 91: object variable or with block variable not set"),因为代码没有找到匹配项

因此,始终建议检查是否已找到匹配项。请检查您在进行以下更改时看到的是哪个消息框?

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

我建议看一下 This