我想要什么:我有很多不同设备的床单。让我们将其中一张称为"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
在发现部分匹配时抛出了一个错误。除此之外,代码工作得很好,谢谢!