为什么范围工作,但不是单元格?

我试图将一个工作簿中的数据从一个范围分配到另一个范围。 当我使用正常的Range语法来指定目标范围(范围(“A1:B2”))我的代码工作,但如果我尝试使用范围,单元格语法(范围(单元格(1,1),单元格,2)))我的代码不起作用。

我激活目标工作簿(ActiveWorkbook),并在源工作簿(ThisWorkbook)中运行代码。

此代码工作:

ActiveWorkbook.Worksheets(1).Range("A1:B2").Value _ = ThisWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value 

但是这个代码没有:

 ActiveWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value _ = ThisWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value 

我得到的错误是运行时错误“1004”:应用程序定义或对象定义的错误。

有谁知道为什么使用单元格对象造成我的问题,或者如果有一些其他问题,我不知道?

问题是Cells是不合格的,这意味着这些单元格引用的表单根据代码的不同而不同。 每当您调用RangeCellsRowsUsedRange或任何返回Range对象的东西,并且您不指定它打开哪个工作表时,工作表将按照以下方式分配:

  • 在工作表的类模块中:不pipe什么活动
  • 在任何其他模块:ActiveSheet

您限定Range引用,但Cells引用不合格,可能指向活动页面。 这就像写作

 ThisWorkbook.Worksheets(1).Range(ActiveSheet.Cells(1, 1), ActiveSheetCells(2, 2)).Value 

这当然没有任何意义,除非ThisWorkbook.Worksheets(1)碰巧是活跃的。 我经常喜欢使用With块,以确保一切都完全合格。

 With Sheets(1) .Range(.Cells(1,1), .Cells(2,2)).Value = "something" End With 

但是你可以参考两张不同的纸张,所以你最好使用如下的短纸张variables:

 Dim shSource As Worksheet Dim shDest As Worksheet Set shSource = ThisWorkbook.Worksheets(1) Set shDest = Workbooks("myBook").Worksheets(1) shDest.Range(shDest.Cells(1, 1), shDest.Cells(2, 2)).Value = _ shSource.Range(shSource.Cells(1, 1), shSource.Cells(2, 2)).Value 

但是,如果你打算对Cells参数进行硬编码,你可以像清理那样

 shDest.Cells(1, 1).Resize(2, 2).Value = shSource.Cells(1, 1).Resize(2, 2).Value