在声明客户工作表名称时,VBA中的对象需要错误

嗨,我有下面的代码来移动数据。 这使用默认的工作表名称时正常工作。 但是,当我使用不同的名称为工作表(而不是sheet1,sheet2),我得到“对象需要”的错误。

这里“延迟”是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 

结束小组

你做的就行了

 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 

当您执行Sheet1.Range ,您引用了VBA自动为您声明的全局作用域Worksheet对象。 该“免费”对象默认指向ThisWorkbook.Worksheets("Sheet1") ,并且使用它而不是从Worksheets集合中获取完全相同的对象引用是一个非常好的主意。

现在,如果您将Sheet1工作表标记为“延迟”,那么您已经设置了它的Name ,但不是它的代码Name ,而且它是VBA用来创build可在代码中使用的全局标识符的代码名称。 您可以在属性工具窗口(F4)中更改:

属性

(Name) (第一)属性仍然说“Sheet1”? 将其更改为Latency ,现在此代码变为有效:

 lRow = Latency.Cells.SpecialCells(xlLastCell).Row 

属性

现在,一旦开始使用Latency全局标识符, 就可以在任何地方使用它 – 不要去从ActiveWorkbook.WorksheetsActiveWorkbook.Sheets集合中获取完全相同的工作表参考!

而不是这个:

 Sheets("Latency").Range("M" & i).Copy 

你做吧:

 Latency.Range("M" & i).Copy 

对另一张纸也一样。 请注意, Sheets集合可以包含图表,而不仅仅是工作表 – 当您从集合(例如,从运行时创build的工作表)中获取工作表对象引用时,应该使用Worksheets集合来完成此操作。

你也应该看看正确的缩进 (声明:这个链接指向我的宠物项目的网站)你的代码。

尝试这个:

 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