excel - .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()
,出现错误。
关于我哪里出错的任何想法?
解决方案
仍然想知道为什么您的解决方法有效...
请检查您声明 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 甚至在隐藏或分组的单元格中都找不到),则第二个解决方案中的直接分配会引发错误。
推荐阅读
- ios - 不允许代理角色编辑用户
- javascript - 使用 try/catch on 方法
- swift - 安全文本字段加密阿拉伯数字
- sql-server - SSRS 数据集可以有默认值吗?
- java - Codacy 不显示使用 Travis-CI 的覆盖率
- sql - 从另一个表加速 UPDATE
- git - 在另一个分支上工作时,我可以在 master 上创建一个新分支吗?
- laravel - Laravel 中的重复查询 - 调试器
- python - 如何使用 glade 和 pygobject 在视图之间导航?
- reactjs - 来自浏览器的响应与通过 React 应用程序检索到的响应不同