我有一个VBA脚本,其中我尝试使用find()在单独的工作表(同一工作簿)上获取列的列号。
所以,从“工作表1”我运行这个宏,找到“工作表2”中第1行中包含“Ins Val”一词的列。奇怪的是,在宏的早期,我使用相同的公式获取没有问题的列号。但是,下面的代码抛出“运行时错误91,对象变量或未设置块”但我无法理解为什么。
dim useDataWS as Worksheet, typeValColumn as Integer, theType as String, mainWS as Worksheet
Set mainWS = worksheets("Sheet 1")
Set useDataWS = worksheets("Sheet 2")
theType = mainWS.Cells(49,5).Value
'' the below line gives the error
typeValColumn = useDataWS.rows(1).Find(what:=theType, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False).Column
但是,在那个宏的早期,我做同样的事情 - 没有错误:?
With useDataWS
noOneCol = .Rows(1).Find(what:=theType, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False).Column
End With
注意:即使我将第一部分更改为使用“with”,也会出现相同的错误。
有什么想法吗? (注意:这是一个更强大的脚本,但我试图得到适用的部分。如果还有其他可能导致这种情况,让我知道我正在做的其他类型的东西可能会搞砸了这个,我会发布更多代码)。
编辑:感谢@BranislavKollár - 使用“xlFormulas”而非“xlValues”搜索解决了这个问题。 (虽然我仍然不知道为什么Excel会使用'values'抛出错误,但是嘿 - 它有效!)
答案 0 :(得分:2)
原因,为什么以下行
typeValColumn = useDataWS.rows(1).Find(what:=theType, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False).Column
发出错误是因为找到了Find()
方法Nothing
,并且将.column
应用于Nothing
会导致错误。
解决方案可以将LookIn:=xlValues
替换为LookIn:=xlFormulas
。
我想提供更多关于它为何起作用的信息,但我不知道。我发现的一件事是LookIn:=xlFormulas
甚至会发现隐藏的单元格,我猜它有更普遍的用法。
MSDN Range.Find Method或Find Method in Excel VBA或.Find and .FindNext in Excel VBA
答案 1 :(得分:1)
有时最好还原到本机工作表函数。尽管.Find
更适合工作表范围的搜索,但.CountIf
和.Match
都可以轻松找到单个行或列中的值。我通常使用.CountIf
来查看是否存在值以及.Match
来检索列索引号。
with useDataWS
if cbool(application.countif(.rows(1), theType)) then
typeValColumn = application.match(theType, .rows(1), 0)
else
debug.print "not found in row 1"
end if
end if
您还可以使用If IsError(app.Match(...))
检查值的存在,但我更喜欢双功能方法。如果您可以编写一个不返回MATCH
的{{1}}工作表函数,那么上面的代码将找到 theType 。
答案 2 :(得分:0)
这不是一个快速诊断工具的答案。您发誓, Ins Val 位于 Sheet 2 的第1行。将此公式放在包含 Ins Val 的
之下的单元格中。=CODE(MID(H$1, ROW(1:1), 1))
为实际包含 Ins Val 的单元格调整H $ 1,并填充至少9行。
Excel 2013附录:
Excel 2013引入了可能更适合此目的的UNICODE
函数。
=UNICODE(MID(H$1, ROW(1:1), 1))
如果您收到的内容不是上面显示的结果,那么您在单元格值中就会出现流氓字符。
最简单的一次性解决方案是重新键入值。如果这是重复导入,则需要采用其他方法进行补偿。最好的方法是在源处调整导入,但这并不总是可行的。工作表函数CLEAN
在删除流氓字符方面做得很合理,但它并不是最好的。有时需要编写自定义例程来解决特定情况。