Vba 找到一个单元格,检查其他眼圈并复制眼圈中的偏移量。错误91,未设置块
首先我打开了这个问题:。相同的场景,第6列的键值和第31列的键值,但现在要求已经改变 现在我需要搜索Vba 找到一个单元格,检查其他眼圈并复制眼圈中的偏移量。错误91,未设置块,vba,excel,cells,Vba,Excel,Cells,首先我打开了这个问题:。相同的场景,第6列的键值和第31列的键值,但现在要求已经改变 现在我需要搜索第6列中的每个单元格,对于每次搜索,将值(第25列)从第一次出现复制到其他单元格。我的意思是,如果我有五个搜索“KEY_VALUE”的结果,我需要将列25中与第一个搜索结果相关联的值复制到列25中相应单元格中的其他结果 问题是,当我运行代码时,我得到运行时错误91:对象变量或with block变量未设置,即使我有with block 我在阅读,但在我的例子中,我试图分配一个字符串变量,搜索结果不
第6列中的每个单元格
,对于每次搜索,将值(第25列
)从第一次出现复制到其他单元格。我的意思是,如果我有五个搜索“KEY_VALUE”的结果,我需要将列25
中与第一个搜索结果相关联的值复制到列25
中相应单元格中的其他结果
问题是,当我运行代码时,我得到运行时错误91:对象变量或with block变量未设置,即使我有with block
我在阅读,但在我的例子中,我试图分配一个字符串变量,搜索结果不是一个范围。这是我的密码:
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
可能是什么问题?您只需要遍历一组唯一的值,并且应该在上执行一些退出策略,否则它可能会进入infinte循环
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
子CopyUUID()
暗淡的光线和长的一样
变暗通道组件范围,rng组件范围
尺寸rslt作为范围,地址作为字符串
将ws设置为工作表
变暗键作为变体,dKEYs作为对象
设置ws=Sheets(ActiveSheet.Name)
Set dKEYs=CreateObject(“Scripting.Dictionary”)
与ws
lRow=.Range(“F”和.Rows.Count).End(xlUp).Row
设置rng=.Range(.Cells(3,6),.Cells(lRow,6))
对于rng.单元格中的每个chk
如果存在CBool(Len(chk.Value2))而不存在dKEYs(chk.Value2),则
dKEYs.Add键:=chk.Value2,项:=chk.Offset(0,25).Value
如果结束
下一个chk
对于dKEYs中的每个键
设置rslt=rng.Find(What:=key,after:=rng(rng.Cells.Count),LookIn:=xlValues_
LookAt:=xlother,SearchDirection:=xlNext,MatchCase:=False,SearchFormat:=False)
地址=rslt.地址
做
设置rslt=rng.FindNext(后面:=rslt)
如果rslt.地址addr,则
rslt.偏移量(0,25)=dKEYs.项目(关键)
其他的
退出Do
如果结束
环
下一键
以
出口程序:
出口接头
端接头
dictionary对象维护F列中每个值的第一次出现以及AE列中关联的UUID值的唯一列表。每一个都将至少被找到一次,因此即使是在错误恢复下一次时,也可以被丢弃(从来都不是坏事!)
总之,上面讨论了我在代码中发现的三个问题
searchResult
上的拼写错误。它至少在一个位置用作searResult
.FindNext
由于代码未找到匹配项,因此将出现该错误(“运行时错误91:未设置对象变量或with block变量”) 因此,始终建议检查是否找到匹配项。当您进行以下更改时,是否可以检查您看到的消息框
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
我建议在
.FindNext
上查看我找不到退出策略。通常情况下,会检查原始地址是否已满。在AE列中设置新值后,您还可以继续查找重复项。这是打字错误还是代码中的错误?@Jeeped这是一个打字错误,我完成了该部分,但没有测试它,因为它以前崩溃过,但它不必找到匹配项,即使匹配项本身也是如此?uuid=searchResult.Offset(0,25).Value
是给出错误的行…wadr,如果它必须找到匹配项,但没有找到匹配项,那么除了确定存在问题之外,错误控制不是一种理想的方法。True,但我需要检查用户是否确实获得了Msgbox“未找到匹配项”
在我研究其他方面之前。我有一种感觉,OP可能在实际代码中的那一行中拼错了单词searchResult
。。。让我们看看OP有什么要说的。我不在办公室,但我明天会检查这个,现在我会比以前更冷静地检查这个解决方案,我认为它可能更有效,但要测试你的解决方案和@Siddharth Rout one的。但是我只有一个问题…在Do…循环中如果rslt.addr那么rslt.Offset(0,25)=dKEYs.Item(key)
做什么?AsdKEYs.Item(key)
是字典中已保存的实际搜索频率的关联值,对吗?所以它不需要寻找它,只需要获取并设置它?我尝试运行您的代码,但在这一行中得到与以前相同的错误91:如果rslt.addr,那么
尝试注释循环,但现在我在Find方法上得到一个类型不匹配错误