您好我有以下代码来移动数据。使用默认工作表名称时,此工作正常。但是,当我为纸张使用不同的名称(而不是sheet1,sheet2)时,我得到了#34;对象需要"错误。
这里"延迟"是sheet1和" TP"是sheet2。
有人可以指导我如何修复它吗?
Sub sbMoveData()
Dim lRow As Integer, i As Integer, j As Integer
'Find last roe in Sheet1
lRow = Latency.Cells.SpecialCells(xlLastCell).Row
j = 1
For i = 1 To lRow
If UCase(Latency.Range("E" & i)) = "COMPATIBLE" And UCase(Latency.Range("O" & i)) = "Pass" Then
Sheets("Latency").Range("M" & i).Copy Destination:=Sheets("TP").Range("A" & j)
j = j + 1
End If
Next
End Sub
答案 0 :(得分:4)
执行Sheet1.Range
时,您将引用VBA自动为您声明的全局范围Worksheet
对象。默认情况下,“免费”对象指向ThisWorkbook.Worksheets("Sheet1")
,使用它而不是从Worksheets
集合中获取完全相同的对象引用是一个非常好的主意。
现在,如果您将Sheet1
工作表标记为“延迟”,则表示您设置了Name
,而不是CodeName
- 并且它是VBA使用的CodeName
创建可在代码中使用的全局标识符。您可以在属性工具窗口(F4)中更改它:
请注意(Name)
(第一个)属性仍然显示“Sheet1”?将其更改为Latency
,现在此代码变为有效:
lRow = Latency.Cells.SpecialCells(xlLastCell).Row
现在,一旦您开始使用Latency
全局标识符,在任何地方使用它 - 不要开始从ActiveWorkbook.Worksheets
或{开始提取完全相同的工作表参考{1}}收藏!
而不是:
ActiveWorkbook.Sheets
你这样做:
Sheets("Latency").Range("M" & i).Copy
对另一张纸也这样做。请注意Latency.Range("M" & i).Copy
集合可以包含图表,而不仅仅是工作表 - 当您 从集合中获取工作表对象引用时(例如,从您在运行时创建的工作表),应该使用Sheets
集合来执行此操作。
您也应该正确查看indenting(免责声明:此链接指向我的宠物项目网站)您的代码。
答案 1 :(得分:1)
你在行
做了Worksheets("Latency").Range("M" & i).Copy Destination:=Worksheets("TP").Range("A" & j)
但之前,您使用Latency
就好像它是一个对象,而它只是一个名称。要按名称获取工作表对象,请始终使用sheets("name")
或Worksheets("name")
Sub sbMoveData()
Dim lRow As Integer, i As Integer, j As Integer
'Find last roe in Sheet1
With Worksheets("Latency")
lRow = .Cells.SpecialCells(xlLastCell).Row
j = 1
For i = 1 To lRow
If UCase(.Range("E" & i)) = "COMPATIBLE" And UCase(.Range("O" & i)) = "Pass" Then
.Range("M" & i).Copy Destination:=Worksheets("TP").Range("A" & j)
j = j + 1
End If
Next
End With
End Sub
答案 2 :(得分:0)
试试这个:
If UCase(Latency.Range("E" & i)) = "COMPATIBLE" And UCase(Latency.Range("O" & i)) = "Pass" Then
Worksheets("Latency").Range("M" & i).Copy Destination:=Worksheets("TP").Range("A" & j)
j = j + 1
End If