我非常需要将范围从一张纸复制到另一张纸,并且可以做不同的事情,但是我想了解为什么此代码不起作用。拜托,你能解释一下吗?
Sub cioy()
Dim wb As Workbook
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Set wb = ActiveWorkbook
Set sh1 = wb.Sheets("sh1")
Set sh2 = wb.Sheets("sh2")
sh2.Cells.ClearContents
sh1.Range(Cells(1, 1), Cells(12, 8)).Copy Destination:=sh2.Range(Cells(1, 1))
End Sub
答案 0 :(得分:1)
使用父工作表名称限定范围,并且不需要结尾处的范围包装单元格
Public Sub cioy()
Dim wb As Workbook
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Set wb = ActiveWorkbook
Set sh1 = wb.Worksheets("sh1")
Set sh2 = wb.Worksheets("sh2")
sh2.Cells.ClearContents
With sh1
.Range(.Cells(1, 1), .Cells(12, 8)).Copy Destination:=sh2.Cells(1, 1)
End With
End Sub
答案 1 :(得分:1)
这是因为{{1}对象的Range()
属性将接受两个Worksheet
参数(所需范围的开始和结束范围引用),而您只给出一个({{1 }}。
因此您将进行编码:
Range
或:
Range(Cells(1, 1)
以上内容应可修复错误
另外,请注意,如果没有显式的sh1.Range(Cells(1, 1), Cells(12, 8)).Copy Destination:=sh2.Cells(1, 1)
引用,则sh1.Range(Cells(1, 1), Cells(12, 8)).Copy Destination:=sh2.Range("A1")
对象会隐式地将其视为Sheet
,因此您的代码将与以下内容相同:
Range
如果ActiveSheet
不是当前的 Active sh1.Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(12, 8)).Copy Destination:=sh2.Cells(1, 1)
,则可能不是您所需要的。
因此,您应该更正确地写:
sh1
或:
sheet
您会注意到您可以省略外部工作表引用,因为使用合格的sh1.Range(sh1.Cells(1, 1), sh1.Cells(12, 8)).Copy Destination:=sh2.Cells(1, 1)
引用作为Range(sh1.Cells(1, 1), sh1.Cells(12, 8)).Copy Destination:=sh2.Cells(1, 1)
属性的参数会导致返回的Range
引用与外部工作表引用相同两个参数一个
最后,您可以通过使用Range
的Range属性表示法和简单的代码来避免所有这些负担:
Range
或:
Range(string address, string address)