首页 > 解决方案 > VBA copy.range 不明白为什么不起作用

问题描述

我有一个简单的需要,将范围从一张纸复制到另一张纸,我可以用不同的方式做,但我想了解为什么这段代码不起作用。请问,你能解释一下吗?

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

在此处输入图像描述

标签: excelvba

解决方案


这是因为object 的Range()属性Worksheet将接受两个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,因此您的代码将与以下内容相同:

sh1.Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(12, 8)).Copy Destination:=sh2.Cells(1, 1)

sh1如果不是当前的Active ,这可能不是您需要的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(string address, string address)最后,您可以通过使用Range 属性的表示法和简单的代码来避免所有这些负担:

sh1.Range("A1:H12").Copy Destination:=sh2.Cells(1, 1)

或者:

sh1.Range("A1:H12").Copy Destination:=sh2.Range("A1")

推荐阅读