使用String对象时.Range()。Find()抛出``需要对象''错误

时间:2019-01-25 09:33:45

标签: excel vbscript

这是我第一次编写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()中使用同一对象时,出现错误。

关于我要去哪里的任何想法吗?

2 个答案:

答案 0 :(得分:0)

难道您不可以在范围内循环查找值吗?喜欢:

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

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

答案 1 :(得分:0)

仍然想知道为什么您的解决方法可行...

请检查您是否声明了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甚至在隐藏或分组的单元中都找不到),则第二个解决方案中的直接分配会引发错误。