为什么Range工作,但不是Cell?

use*_*163 13 vba range cells

我试图通过将值从一个范围分配到另一个范围来将一些数据从一个工作簿移动到另一个工作簿.当我使用普通的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
Run Code Online (Sandbox Code Playgroud)

但是这段代码没有:

ActiveWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value _
= ThisWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value
Run Code Online (Sandbox Code Playgroud)

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

有谁知道为什么使用单元格对象导致我的问题,或者是否有其他问题我不知道?

Dic*_*ika 33

问题是Cells不合格,这意味着这些单元格引用的表单根据代码的位置而不同.每当您调用RangeCellsRowsUsedRange任何返回Range对象的内容,并且您没有指定它所在的工作表时,工作表将根据以下内容进行分配:

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

您限定了Range引用,但Cells引用是不合格的,可能指向Activesheet.这就像写作

ThisWorkbook.Worksheets(1).Range(ActiveSheet.Cells(1, 1), ActiveSheetCells(2, 2)).Value
Run Code Online (Sandbox Code Playgroud)

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

With Sheets(1)
    .Range(.Cells(1,1), .Cells(2,2)).Value = "something"
End With
Run Code Online (Sandbox Code Playgroud)

但是你引用了两个不同的表,所以你最好使用短表变量,如:

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
Run Code Online (Sandbox Code Playgroud)

但实际上,如果您要对Cells参数进行硬编码,您可以将其清理干净

shDest.Cells(1, 1).Resize(2, 2).Value = shSource.Cells(1, 1).Resize(2, 2).Value
Run Code Online (Sandbox Code Playgroud)

  • 我的猜测(这只是猜测)是它是明确正确的。由于 Range 可以采用多种参数类型(计算结果为范围的字符串、单个单元格对象、两个单元格对象),因此幕后会进行一些操作来评估您要发送的参数类型。如果您发送完全合格的单元格对象,我敢打赌它会跳过大部分评估/转换代码,并且它是通过代码的最直接路径。就像它不会将其转换为字符串然后再转换回单元格一样。因此,为了我的钱,如果单元格合格,您可以省略范围中的参考。 (2认同)
  • 虽然让 Range 不合格确实有效,但对其进行合格也稍微快一些。 (2认同)