对象变量未设置

时间:2014-12-01 10:35:41

标签: vba excel-vba excel

我有一个简单的例程,可以将数据从用户输入表(Sheet1)复制到受保护的工作表(Sheet2)以进行自动工作。我在调试一行简单的代码时遇到了麻烦,只是希望有人可以帮我清理这个代码:)

Sub CopyData()

Dim LastRowSh1 As Long
Dim LastColSh1 As Long
Dim Sheet1Data() As Variant
Dim LastRowSh2 As Long
Dim LastColSh2 As Long

    With Sheets("Sheet1")

        ' Defines data range in Sheet1.
        LastRowSh1 = .Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
        LastColSh1 = .Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column
        ' Loads the contents of Sheet1 data into array Sheet1Data.
        Sheet1Data = .Range(.Cells(7, 1), .Cells(LastRowSh1, LastColSh1)).Value

    End With

    With Sheets("Sheet2")

        ' Removes any existing filters in Sheet2.
        If .AutoFilterMode = True Then .AutoFilter.ShowAllData

        ' Defines preexisting data range in Sheet2 (if any).
        LastRowSh2 = .Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row

我在上面的这一行得到了运行时错误'91'。不能为我的生活弄清楚为什么因为它与上面的With声明一样正常工作!

        LastColSh2 = .Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column
        ' Clears preexisting data.
        .Range(.Cells(7, 1), .Cells(LastRowSh2, LastColSh2)).ClearContents

        ' Repopulates with the contents of array Sheet1Data.
        .Range(.Cells(7, 2), .Cells(LastRowSh1, LastColSh1 + 1)).Value = Sheet1Data

    End With

End Sub

1 个答案:

答案 0 :(得分:1)

您正在快速调整范围参考。您用于[A1]方法的 After:= 参数的Range.Find不足以显示With Sheets("Sheet2") ... End With的父母身份。 Sheet1是 ActiveSheet ,因此它是[A1]的父级,您无法在Sheet2上搜索 After:= Sheet1!A1 。如果Sheet1 是活动工作表,则.Find中的With Sheets("Sheet1") ... End With会出现同样的问题。

您可以在VBE的立即窗口中使用以下内容来证明这一点。

?[A1].address(0,0,,True)

更改工作簿中的活动工作表并重新运行该命令将更改返回的工作表名称。

只需将单元格引用更改为更合适的内容,例如.Cells(1,1)

LastRowSh2 = .Cells.Find("*", .Cells(1,1), , , xlByRows, xlPrevious).Row

我建议你为Range.Find个代码行执行此操作。