这是我第一次编写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()
中使用同一对象时,出现错误。
关于我要去哪里的任何想法吗?
答案 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 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甚至在隐藏或分组的单元中都找不到),则第二个解决方案中的直接分配会引发错误。