Excel 嵌套IF语句后,循环不再工作

Excel 嵌套IF语句后,循环不再工作,excel,vba,Excel,Vba,我对vba编码非常陌生,因为我昨天刚开始学习它,我有一个问题,我在这里做错了什么 我试图编写一个代码,在某个范围内查找某个单词,检查相邻单元格上的值,在另一个范围内查找这些值,如果找不到,则执行一些操作,然后返回第一个范围以查找下一个匹配项 在插入第二个查找之前,我成功地使循环工作,但一旦添加它,它就会中断循环?它给出了“运行时错误91:对象变量或未设置块变量” 我已尝试将变量的数据类型从Range更改为String,并从String更改为Range 我已经尝试了Set variable=,只是

我对vba编码非常陌生,因为我昨天刚开始学习它,我有一个问题,我在这里做错了什么

我试图编写一个代码,在某个范围内查找某个单词,检查相邻单元格上的值,在另一个范围内查找这些值,如果找不到,则执行一些操作,然后返回第一个范围以查找下一个匹配项

在插入第二个查找之前,我成功地使循环工作,但一旦添加它,它就会中断循环?它给出了“运行时错误91:对象变量或未设置块变量”

我已尝试将变量的数据类型从
Range
更改为
String
,并从
String
更改为
Range

我已经尝试了
Set variable=
,只是
variable=
用于变量

在第二个
.Find()
变量到达循环之前,我已经释放了它

我移动了这么多线

再说一次,我对这一点很陌生,如果有人能帮我一把,我将非常感激

所讨论的行是
循环While cred.Address firstcred
,它在第一个子例程中工作正常,但在第二个子例程中返回错误

sub subname1()

Dim credeb As Range
Dim cred As Range
Dim firstcred As String
Dim nome1 As Range
Dim data1 As Range

Set credeb = Range("credeb")   
Set cred = credeb.find("crédito")

If cred Is Nothing Then
    GoTo Final

Else
    firstcred = cred.Address

    Do
        cred.Activate

        Set nome1 = cred.Offset(0, -2) 
        Set data1 = cred.Offset(0, -1) 

        nome1.Interior.Color = vbYellow
        data1.Interior.Color = vbYellow

        Set cred = credeb.FindNext(cred)

    Loop While cred.Address <> firstcred

End If

Final:
End Sub

______________________

Sub subname2()

Dim credeb As Range
Dim cred As Range
Dim firstcred As String
Dim nome1 As Range
Dim data1 As Range
Dim nome2 As Range
Dim nome11 As Range

Set credeb = Range("credeb")   'nome da tabela credito ou debito
Set cred = credeb.find("crédito")
Set nome2 = Range("nome2")     'nome da tabela de nomes do credito

If cred Is Nothing Then
    GoTo Final

Else
    firstcred = cred.Address

    Do
        cred.Activate

        Set nome1 = cred.Offset(0, -2)  
        Set data1 = cred.Offset(0, -1)   
        Set nome11 = nome2.find(nome1)


        If nome11 Is Nothing Then
            nome1.Interior.Color = vbYellow
            data1.Interior.Color = vbYellow

            Set nome1 = Nothing
            Set data1 = Nothing
            Set nome11 = Nothing

        End If

        Set cred = credeb.FindNext(cred)

    Loop While cred.Address <> firstcred

End If
Final:
End Sub
sub子名称1()
暗credeb As系列
暗淡的信用范围
像线一样模糊
变暗1 As范围
Dim data1 As范围
设置credeb=范围(“credeb”)
Set cred=credeb.find(“crédito”)
如果信誉不算什么的话
转到决赛
其他的
firstcred=信用证地址
做
信用激活
设置nome1=信用偏移(0,-2)
设置数据1=信用偏移量(0,-1)
nome1.Interior.Color=vbYellow
data1.Interior.Color=vbYellow
Set cred=credeb.FindNext(cred)
循环同时创建。地址firstcred
如果结束
最终:
端接头
______________________
子名称2()
暗credeb As系列
暗淡的信用范围
像线一样模糊
变暗1 As范围
Dim data1 As范围
Dim nome2 As范围
尺寸11 As范围
设置credeb=范围(“credeb”)“nome da tabela credito ou debito”
Set cred=credeb.find(“crédito”)
设置nome2=范围(“nome2”)“nome da tabela de nomes do credito
如果信誉不算什么的话
转到决赛
其他的
firstcred=信用证地址
做
信用激活
设置nome1=信用偏移(0,-2)
设置数据1=信用偏移量(0,-1)
设置nome11=nome2.find(nome1)
如果11不算什么,那么
nome1.Interior.Color=vbYellow
data1.Interior.Color=vbYellow
设置为1=无
设置数据1=无
设置为11=无
如果结束
Set cred=credeb.FindNext(cred)
循环同时创建。地址firstcred
如果结束
最终:
端接头

上述代码返回运行时错误“91”:未设置对象变量或With block变量。如何修复此代码以使其正常运行?

在循环中运行Find会使主代码难以维护,如果需要在多个位置执行此操作,则最好的方法是将其分解为单独的函数

你可以这样做:

sub subname1()

    Dim hits as Collection, hit 

    Set hits = FindAll(Range("credeb"), "crédito")

    if hits.Count > 0 then
        for each hit in hits
            hit.Offset(0, -2).Resize(1,2).Interior.Color = vbYellow
        next hit
    end if

End Sub
用于查找所有匹配项的函数:

'return all cells in "rng" which match "val", as a Collection
'  (edit the Find method parameters as needed)
Public Function FindAll(rng As Range, val As String) As Collection

    Dim rv As New Collection, f As Range
    Dim addr As String

    'best to be explicit about exactly what you want Find to do...
    Set f = rng.Find(what:=val, after:=rng.Cells(rng.Cells.Count), _
        LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, _
        SearchDirection:=xlNext, MatchCase:=False)
    If Not f Is Nothing Then addr = f.Address()

    Do Until f Is Nothing
        rv.Add f
        Set f = rng.FindNext(after:=f)
        If f.Address() = addr Then Exit Do
    Loop

    Set FindAll = rv
End Function

Find
对象是全局对象,存储最后使用的参数。在停止宏并在工作表上按Ctrl+F组合键后,可以观察它们。因此,内部的
nome2.find(nome1)
覆盖了“what”参数,因此
credeb.FindNext(cred)
将查找下一个
nome1
,而不是下一个
“crédito”
。可能的重复,因为@GSerg提出了确切的问题,而不是使用
FindNext(cred)
,相反,对该行使用
Set cred=credeb.Find(“crédito”,cred)
。此外,@GSerg指出的解决方案也适用于此。@GSerg-似乎我在重复我自己;-)