Excel 在vba中查找对象范围的方法失败

Excel 在vba中查找对象范围的方法失败,excel,vba,if-statement,Excel,Vba,If Statement,我已经写了一个代码,找到所有的染料字和总和所有染料字的价值 这是密码 Dim name As String name = "dye" Dim findDyeRange As Range Set findDyeRange = Range("Q10:S61") Set firstDyeWord = findDyeRange.Find(name) If firstDyeWord Is Nothing Then msgbox "nothin

我已经写了一个代码,找到所有的染料字和总和所有染料字的价值

这是密码

Dim name As String
name = "dye"

Dim findDyeRange As Range
Set findDyeRange = Range("Q10:S61")

Set firstDyeWord = findDyeRange.Find(name)

If firstDyeWord Is Nothing Then
    msgbox "nothing found"
Else
    firstDyeValue = firstDyeWord.Offset(0, 1).Value
    Set secondDyeWord = findDyeRange.FindNext(firstDyeWord)
    
    If secondDyeWord.Address = firstDyeWord.Address Then
        MsgBox firstDyeValue
        Exit Sub
    Else
        secondDyeValue = secondDyeWord.Offset(0, 1).Value
        Set thirdDyeWord = findDyeRange.FindNext(secondDyeWord)
        
        If thirdDyeWord.Address = firstDyeWord.Address Then
            MsgBox firstDyeValue + secondDyeValue
            Exit Sub
        Else
            thirdDyeValue = thirdDyeWord.Offset(0, 1).Value
            Set fourthDyeWord = findDyeRange.FindNext(thirdDyeWord)
            
            If fourthDyeWord.Address = firstDyeWord.Address Then
                MsgBox firstDyeValue + secondDyeValue + thirdDyeValue
                Exit Sub
            Else
                fourthDyeValue = fourthDyeWord.Offset(0, 1).Value
                Set fifthDyeWord = findDyeRange.FindNext(fourthDyeWord)
                
                If fifthDyeWord.Address = firstDyeWord.Address Then
                    MsgBox firstDyeValue + secondDyeValue + thirdDyeValue + fourthDyeValue
                    Exit Sub
                Else
                    fifthDyeValue = fifthDyeWord.Offset(0, 1).Value
                    Set sixthDyeWord = findDyeRange.FindNext(fifthDyeWord)
                    
                    If sixthDyeWord.Address = firstDyeWord.Address Then
                        MsgBox firstDyeValue + secondDyeValue + thirdDyeValue + fourthDyeValue + fifthDyeValue
                        Exit Sub
                    Else
                        sixthDyeValue = sixthDyeWord.Offset(0, 1).Value
                        MsgBox firstDyeValue + secondDyeValue + thirdDyeValue + fourthDyeValue + fifthDyeValue + sixthDyeValue
                    End If
                End If
            End If
        End If
    End If
End If
代码运行良好。但是当我删除msgbox并设置代码时,它就会抛出一个错误

我要这个密码

If firstDyeWord Is Nothing Then
        Range("A9").value = 7
但它抛出错误“在vba中查找对象范围的方法失败”


救命啊

根据的文档,在使用
Find()
时,您必须至少指定参数
LookIn
LookAt
SearchOrder
MatchByte
,否则它将使用VBA或用户界面上次使用的参数。
由于您无法知道用户最后在用户界面中使用了什么,您的搜索可能会随机工作并随机产生错误的结果。因此,始终指定所有这4个参数以使其可靠

此外,您必须指定您的范围所在的工作簿/工作表。否则,Excel可能会猜测错误的工作表

确保正确声明所有变量。我建议始终激活
选项显式
:在VBA编辑器中,转到工具›选项›


公共子示例()
将ws设置为工作表
设置ws=ThisWorkbook.Worksheets(“Sheet1”)'设置工作簿和工作表!
将名称设置为字符串
name=“染料”
Dim FindYerange作为范围
Set findDyeRange=ws.Range(“Q10:S61”)“指定范围在哪个表中显示
暗淡的第一个字作为范围
设置firstDyeWord=findDyeRange.Find(What:=name,LookIn:=xlFormulas,LookAt:=xlWhole,SearchOrder:=xlByRows,MatchByte=False)
如果第一个字什么都不是
“没有找到染料
ws.Range(“A9”).Value=7'指定范围在哪张图纸中
其他的
“如果发现了染料,你可以做点别的
如果结束
端接头
//编辑(见评论)

如果在类似
工作表\u Change
的事件中使用此选项,则需要在写入单元格之前关闭事件。否则,这将触发另一个事件,这将触发另一个事件…而您将陷入一个无休止的事件循环中,这无法工作:

Private子工作表\u更改(ByVal目标作为范围)
将ws设置为工作表
设置ws=ThisWorkbook.Worksheets(“Sheet1”)'设置工作簿和工作表!
将名称设置为字符串
name=“染料”
Dim FindYerange作为范围
Set findDyeRange=ws.Range(“Q10:S61”)“指定范围在哪个表中显示
暗淡的第一个字作为范围
设置firstDyeWord=findDyeRange.Find(What:=name,LookIn:=xlFormulas,LookAt:=xlWhole,SearchOrder:=xlByRows,MatchByte=False)
如果第一个字什么都不是
“没有找到染料
在任何错误重新激活事件的情况下,在出现错误时转到“重新激活\u事件”
Application.EnableEvents=False'禁用事件或.Value=7将触发另一个更改事件。
ws.Range(“A9”).Value=7'指定范围在哪张图纸中
Application.EnableEvents=True“确保从不禁用事件,否则在重新启动Excel之前,它们将一直处于禁用状态。
其他的
“如果发现了染料,你可以做点别的
如果结束
出口接头
重新激活\u事件:
Application.EnableEvents=True
如果Err.Number为0,则Err.Raise Err.Number、Err.Source、Err.Description、Err.HelpFile、Err.HelpContext'在出现错误时显示错误消息。
端接头

没有任何帮助,兄弟。突然我发现,如果我从开发人员工具中创建一个按钮,并将此代码指定为宏,那么此代码可以完美地运行。但是当我在工作表中指定这个时,它就会抛出那个错误。希望这将帮助您找到解决方案。@Mehedi您没有告诉我您正在使用事件。当使用事件时,代码当然需要不同。检查我的编辑。这很好,但这里有一个问题,它禁用了我的撤消方法。我无法撤消工作表上的任何内容。请看。宏不能用撤销方法还原。这是不可能的。宏更改单元格值(此代码
ws.Range(“A9”).Value=7)后,“撤消”不起作用且不可用。没有解决办法,你没有理解我。我也知道宏不能被还原。我是说工作表中的任何其他更改都不会恢复。希望你能理解。