为什么范围工作,但不是单元格?
我试图将一个工作簿中的数据从一个范围分配到另一个范围。 当我使用正常的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
是不合格的,这意味着这些单元格引用的表单根据代码的不同而不同。 每当您调用Range
或Cells
或Rows
或UsedRange
或任何返回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