VBA - 使用Find()获取列#,获取错误91 - object var。或者使用块var。没有设置

时间:2015-03-20 17:10:21

标签: vba excel-vba excel

我有一个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'抛出错误,但是嘿 - 它有效!)

3 个答案:

答案 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 MethodFind 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))

CODE function with MID

如果您收到的内容不是上面显示的结果,那么您在单元格值中就会出现流氓字符。

最简单的一次性解决方案是重新键入值。如果这是重复导入,则需要采用其他方法进行补偿。最好的方法是在源处调整导入,但这并不总是可行的。工作表函数CLEAN在删除流氓字符方面做得很合理,但它并不是最好的。有时需要编写自定义例程来解决特定情况。