声明客户表名称时,VBA中的对象必需错误

时间:2017-01-12 04:05:03

标签: excel vba excel-vba

您好我有以下代码来移动数据。使用默认工作表名称时,此工作正常。但是,当我为纸张使用不同的名称(而不是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

3 个答案:

答案 0 :(得分:4)

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

现在,如果您将Sheet1工作表标记为“延迟”,则表示您设置了Name,而不是CodeName - 并且它是VBA使用的CodeName创建可在代码中使用的全局标识符。您可以在属性工具窗口(F4)中更改它:

Properties

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

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

Properties

现在,一旦您开始使用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