我正在尝试通过将值从一个范围分配到另一个范围来将一些数据从一个工作簿移动到另一个工作簿。当我使用普通的Range语法指定目标范围(Range(“A1:B2”))时,我的代码可以工作,但如果我尝试使用Range,Cells语法(范围(单元格(1,1),单元格(2) ,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':应用定义或对象定义的错误。
有谁知道为什么使用细胞对象会导致我出现问题,或者是否有其他问题我不知道?
答案 0 :(得分:28)
问题是Cells
是不合格的,这意味着这些单元格所引用的表单根据代码的位置而有所不同。只要您拨打Range
或Cells
或Rows
或UsedRange
或任何返回Range对象的内容,并且您未指定其所在的工作表,就会分配工作表根据:
您符合Range
引用的限定条件,但Cells
引用不合格,可能指向Activesheet。这就像写作
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
但是你引用了两个不同的表,所以你最好使用短表变量,如:
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