为什么 Range 有效,但 Cells 无效?

问题描述 投票:0回答:1

我试图通过将值从一个范围分配到另一个范围来将一些数据从一个工作簿移动到另一个工作簿。当我使用正常的 Range 语法指定目标范围 (Range("A1:B2")) 时,我的代码有效,但如果我尝试使用 Range, Cells 语法 (Range(Cells(1,1),Cells(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”:应用程序定义或对象定义的错误。

有谁知道为什么使用 cells 对象会给我带来问题,或者是否还有其他我不知道的问题?

vba range cells
1个回答
47
投票

问题是

Cells
是不合格的,这意味着这些单元格所引用的工作表根据您的代码所在的位置而有所不同。任何时候你调用
Range
Cells
Rows
UsedRange
或任何返回 Range 对象的东西,并且你没有指定它在哪个工作表上,工作表将根据以下内容分配:

  • 在工作表的类模块中:无论什么是活动的,该工作表
  • 在任何其他模块中:ActiveSheet

您限定了

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
© www.soinside.com 2019 - 2024. All rights reserved.