首页 > 解决方案 > .Range().Find() 在使用字符串对象时抛出“需要对象”错误

问题描述

这是我第一次编写 VBScript 代码。我正在尝试遍历一列以搜索给定的字符串并返回地址。变量 'i' 和 'j' 是循环的一部分,可以正常工作,因此我将其省略。

toSearch = objToExcel.ActiveSheet.PivotTables("MyPivot").RowFields(i).PivotItems(j).Name
If toSearch <> "(blank)" Then
        Set foundRow = objToExcel.ActiveSheet.Range("A2:A20").Find(toSearch)
        MsgBox foundRow.Row
End If

我收到一条错误objToExcel.ActiveSheet.Range("A2:A20").Find(toSearch)说明'Object Required: objToExcel.ActiveSheet.Range(...).Find(...)'

当我用toSearch硬编码字符串替换字符串对象时Find("Alex"),循环工作正常,我得到字符串的行号。此外,在循环中,toSearch对象能够正确地从列中获取所有字符串。当我在 中使用相同的对象时Find(),出现错误。

关于我哪里出错的任何想法?

标签: excelvbscript

解决方案


仍然想知道为什么您的解决方法有效...

请检查您声明 foundRow 是像Dim ... as Long, Dim ... as Range, Dim ... as Variant(不推荐)还是只是Dim ...(从不推荐)。在最后两种情况下,Excel 会为您做出决定,并且该决定可能会在之前的某些代码行中起作用,但不是在这里。

Range并且Long会起作用,但有一些区别:

Dim foundRow as Range
...
Set foundRow = objToExcel.ActiveSheet.Range("A2:A20").Find(toSearch)
If Not foundRow Is Nothing Then
    MsgBox foundRow.Row
Endif

或者

Dim foundRow as Long
...
foundRow = objToExcel.ActiveSheet.Range("A2:A20").Find(toSearch).Row
MsgBox foundRow

第一个解决方案更好,因为您还可以处理未找到的问题。
如果由于某种原因找不到它(Range.Find 甚至在隐藏或分组的单元格中都找不到),则第二个解决方案中的直接分配会引发错误。


推荐阅读