VBA copy.range不明白为什么不起作用

时间:2018-11-18 15:47:39

标签: excel vba

我非常需要将范围从一张纸复制到另一张纸,并且可以做不同的事情,但是我想了解为什么此代码不起作用。拜托,你能解释一下吗?

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

enter image description here

2 个答案:

答案 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)