从另一个工作簿上的Cells.Find方法返回行号

时间:2016-03-22 18:53:25

标签: excel vba excel-vba macros

我一直得到运行时错误91:对象变量或未设置块变量。

我需要返回我在另一个工作簿中搜索的字符串的行号,并将其放置在我查找的名称的6列之外。名称在字符串中有轻微变化,这就是为什么我更喜欢使用Cells.Find而不是vlookup。

我尝试设置我在公共范围内搜索的范围无济于事。这两个工作簿都是打开的,但似乎Cells.Find方法只有在我搜索范围的工作簿处于活动状态时才有效。

仅供参考,listrange是活动工作簿上的名称范围。 clientlist是我正在搜索的其他工作簿中的命名范围(打开但未激活),clientlist2是该命名范围的声明版本。

以下是代码段:

Public clientlist2 As Range

Sub sortout()

    Dim wkb As Workbook
    Dim clientwks As Worksheet
    Dim listrange As Range

    Set wkb = Workbooks("workbook.xlsm")
    Set clientwks = wkb.Sheets("Sheet1")
    Set clientlist2 = clientwks.Range("clientlist")
    Set listrange = Range("A6", Range("A6").End(xlDown))

    For Each a In listrange

        a.Offset(0, 6).value = clientlist2.Cells.Find(a).Row

    Next a

End Sub

2 个答案:

答案 0 :(得分:0)

我建议您分两步执行for语句中的操作以避免错误,并使其更容易进行故障排除。

如果我要找一个单元格,然后从中复制一些东西(或某些属性),我首先尝试将其设置为变量,然后在尝试执行任何操作之前检查我从中得到了什么结果更多与它。

在你的情况下;

Dim foundValue As Range
For Each a In listrange
  Set foundValue = clientlist2.Cells.Find(a)
  If Not foundValue Is Nothing Then
    a.Offset(0, 6).Value = foundValue.Row
  End If
Next a

这也使您更容易进行故障排除,因为您可以通过使用以下方法检查不同变量在每个步骤中的值。 Debug.Print或消息框。

另一个好主意是在模块顶部添加Option Explicit。这使您有必要定义(调暗)所有变量,防止代码中间出现意外拼写错误。

答案 1 :(得分:-2)

我认为当工作簿处于非活动状态时会出现问题,因此请在查找方法之前将其激活。

工作簿( “BOOK4.XLS”)。激活