Cells.Find()引发"运行时错误91:对象变量或未设置块"

时间:2015-03-17 14:40:57

标签: excel vba excel-vba

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

我有一张单独的表单,其中包含所有现有设备和旁边的相应操作系统。我们称之为" list"。

现在我想要其他工作表(例如&#34; WS1&#34;)检查&#34;列表&#34;,找到合适的设备,并将正确的操作系统复制到WS1工作表中。< / p>

手动方式是:

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

到目前为止我所做的事情

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

我的问题: &#34;运行时错误91:对象变量或未设置块变量&#34; 它标志着cells.find-method。

有人可以告诉我我做错了什么吗?^^ 提前谢谢!

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

5 个答案:

答案 0 :(得分:2)

如果找不到您要查找的字符串,则会收到该错误。如果找不到任何内容,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

答案 1 :(得分:1)

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

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

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

编辑: VLOOKUP功能仅在操作系统位于第二列时才有效。切换列或在末尾使用辅助列来包含操作系统。

答案 2 :(得分:0)

在具有设备名称(WS1)的表格中放置公式:

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

其中:
List!$A$2:$B$10是您在列表中具有Devices + OS的范围 '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

答案 3 :(得分:0)

因此,我使用了伪解决方案,在代码中添加了If x is no块,以跳过错误的代码。我能够处理大约80%的数据,这对我很有利。我仍然不明白为什么Find不会返回任何内容。

另一个有趣的,也许是相关的问题发生在另一台运行相同宏的计算机上-在我几次遇到此问题后,我的计算机给了我一个蓝屏,显示“线程被卡在驱动程序中”消息。它们可以关联吗? Excel处理要快很多,并且在线程处理中混在一起?

可是食物,我不知道为什么这个发现不能每次都起作用。

答案 4 :(得分:0)

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