我有一个简单的例程,可以将数据从用户输入表(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
答案 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
个代码行执行此操作。