Cells.Find() 引发"Runtime Error 91: Object Variable or With Block Not Set"



我想要什么:我有很多不同设备的床单。让我们将其中一张称为"WS1"。

我有一张单独的表格,上面有所有现有的设备和相应的操作系统。这个我们称之为"列表"。

现在,我希望其他工作表(例如"WS1")检查"列表",找到正确的设备,并将正确的操作系统复制到WS1工作表中。

手动方式为:

  • 选择WS1的单元格"C3"并复制它
  • 打开"列表"-工作表并找到复制的条目
  • 选择找到的条目左侧的单元格并复制
  • 再次打开WS1,选择活动单元格旁边的左侧单元格,然后粘贴新剪贴板(其中包含操作系统)
  • 选择活动单元格右侧下方的下一个单元格
  • 循环,直到WS1中的每个设备都充满了操作系统

到目前为止我得到了什么:

Dim DataObj As New MSForms.DataObject
Dim strCliBoa As String
'strCliBoa = DataObj.GetText
DataObj.GetFromClipboard
Range("C3").Select
Selection.Copy
strCliBoa = DataObj.GetText
Sheets("list").Select
Range("A1").Select
Cells.Find(What:=strCliBoa, After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=True, SearchFormat:=False).Activate
ActiveCell.Offset(0, -1).Select
Selection.Copy
strCliBoa = DataObj.GetText
Sheets("WS1").Select
ActiveCell.Offset(0, -1).Select
ActiveSheet.Paste
ActiveCell.Offset(1, 1).Select

我的问题:"运行时错误91:未设置对象变量或块变量"它标记细胞。find方法。

有人能告诉我我做错了什么吗^^提前感谢!

(哦,差点忘了:我在Win7上使用ms-excel2010)

如果找不到要查找的字符串,就会出现错误。如果未找到,find函数将返回"Nothing"

    Dim r As Range
    Set r = Cells.find(What:=strCliBoa, After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=True, SearchFormat:=False)
    If r Is Nothing Then
        'handle error
    Else
        'fill in your code
    End If

我将使用VLOOKUP()函数为您提供一个答案。所以Sheet1包含几个设备,我需要找到正确的操作系统。Sheet2包含设备和操作系统之间的匹配。

在Sheet1上,在设备旁边的单元格中输入此公式,然后将其下拉(当然可以根据您的特定需要进行编辑)。

=VLOOKUP(A2;Sheet2!$A$1:$B$20;2;0)

编辑:只有当操作系统位于第二列时,VLOOKUP函数才会工作。在列之间切换,或者在末尾使用辅助列来包含操作系统。

在有设备名称(WS1)的表格中,输入公式:

=INDEX(List!$A$2:$B$10;MATCH('WS1'!C3;List!$B$2:$B$10;0);1)

其中:
List!$A$2:$B$10是列表中包含设备+操作系统的范围
'WS1'!C3是您要在列表中搜索的设备(在您的情况下为"WS1")
List!$B$2:$B$10是图纸列表中列出设备的列。

编辑1-VBA代码

如果你想使用VBA,那么使用这个:

Sub FindDevicePasteOS()
'Find corresponding OS for the device
Dim intRow As Integer
Dim wsht As Worksheet
For Each wsht In Worksheets
    If wsht.Name <> "List" Then 'add more sheets you want to exclude using OR (e.g. ... Or wsht.Name <> "Cover Sheet" Then)
        For intRow = 3 To wsht.Cells(Rows.Count, 3).End(xlUp).Row 'presuming there is nothing else in the column C below the devices
            If Not Worksheets("List").Cells.Find(what:=wsht.Cells(intRow, 3)) Is Nothing Then
                wsht.Cells(intRow, 2) = Worksheets("List").Cells.Find(what:=wsht.Cells(intRow, 3)).Offset(0, -1)
            End If
        Next intRow
    End If
Next wsht
End Sub

所以我使用了一个psuedo解决方案,在该解决方案中,我向代码中添加了If x is nothing块,以跳过错误的部分。我能够处理大约80%的数据,这对我来说很好。我仍然不明白为什么Find会一无所获。

另一个有趣的、可能相关的问题发生在另一台运行相同宏的计算机上——在我遇到这个问题几次后,我的计算机给了我一个蓝色屏幕,上面有一条"线程卡在驱动程序中"的消息。它们可能有关联吗?Excel处理要多到快,并且在线程处理中会有混淆?

不过,我不知道为什么这一发现不会每次都奏效。

在Sobigen的帖子中,我不得不将部分LookAt:=xlPart切换到LookAt:=xlWhole以使其工作,因为If r Is Nothing Then在发现部分匹配时抛出了一个错误。除此之外,代码工作得很好,谢谢!

相关内容

最新更新