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)后,“撤消”不起作用且不可用。没有解决办法,你没有理解我。我也知道宏不能被还原。我是说工作表中的任何其他更改都不会恢复。希望你能理解。