.Range().Find() 在使用 String 对象时抛出 'Object required' 错误

.Range().Find() throwing 'Object required' error when using String object

这是我第一次编写 VBScript 代码。我正在尝试遍历一列以搜索给定的字符串和 return 地址。 变量 '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(...)'

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

知道我哪里出错了吗?

你不能只遍历范围来找到值吗?喜欢:

For each cell in Range("A2:A20").cells
    if cell.value = toSearch then
        MsgBox cell.Row
        exit for
    end if
next

之前您需要将单元格调暗为范围

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

请检查您是否将 foundRow 声明为 Dim ... as LongDim ... as RangeDim ... as Variant(不推荐)或只是 Dim ...(从不推荐)。在后两种情况下,Excel 为您做出决定,也许该决定之前对某些代码行起作用,但在这里不起作用。

RangeLong都可以,但有一些区别:

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 甚至在隐藏或分组单元格中找不到),第二个解决方案中的直接赋值会引发错误。