找到一个单元格,检查其他出现并复制出现中的偏移量。错误 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
也可以被丢弃(这绝不是坏事!)。
总而言之,以上内容解决了我在您的代码中发现的三个问题。
- 更正了 var
searchResult
上的一个拼写错误。它至少在一处被用作 searResult
。
- 现在有一个退出策略,可以在找到所有其他条目后退出
.FindNext
并循环回到原始条目。
- 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
首先我打开了这个问题: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
也可以被丢弃(这绝不是坏事!)。
总而言之,以上内容解决了我在您的代码中发现的三个问题。
- 更正了 var
searchResult
上的一个拼写错误。它至少在一处被用作searResult
。 - 现在有一个退出策略,可以在找到所有其他条目后退出
.FindNext
并循环回到原始条目。 - 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