Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 找到一个单元格,检查其他眼圈并复制眼圈中的偏移量。错误91,未设置块_Vba_Excel_Cells - Fatal编程技术网

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

Vba 找到一个单元格,检查其他眼圈并复制眼圈中的偏移量。错误91,未设置块,vba,excel,cells,Vba,Excel,Cells,首先我打开了这个问题:。相同的场景,第6列的键值和第31列的键值,但现在要求已经改变 现在我需要搜索第6列中的每个单元格,对于每次搜索,将值(第25列)从第一次出现复制到其他单元格。我的意思是,如果我有五个搜索“KEY_VALUE”的结果,我需要将列25中与第一个搜索结果相关联的值复制到列25中相应单元格中的其他结果 问题是,当我运行代码时,我得到运行时错误91:对象变量或with block变量未设置,即使我有with block 我在阅读,但在我的例子中,我试图分配一个字符串变量,搜索结果不

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

现在我需要搜索
第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值的唯一列表。每一个都将至少被找到一次,因此即使是在错误恢复下一次时,也可以被丢弃(从来都不是坏事!)

总之,上面讨论了我在代码中发现的三个问题

  • 更正var
    searchResult
    上的拼写错误。它至少在一个位置用作
    searResult
  • 现在有一个退出策略,一旦找到所有附加条目并循环回原始条目,就可以退出
    .FindNext
  • F列中的每个条目只运行一次,AE列中的替换为第一次出现的值。原始代码将在列中的每个条目中运行,因此它将对重复设置的值执行/运算。与其说这是一个错误,不如说这是一个效率低下的问题,但最好还是避免

  • 由于代码未找到匹配项,因此将出现该错误(“运行时错误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)
    做什么?As
    dKEYs.Item(key)
    是字典中已保存的实际搜索频率的关联值,对吗?所以它不需要寻找它,只需要获取并设置它?我尝试运行您的代码,但在这一行中得到与以前相同的错误91:
    如果rslt.addr,那么
    尝试注释循环,但现在我在Find方法上得到一个类型不匹配错误