Vba 为什么范围有效,但细胞无效?

Vba 为什么范围有效,但细胞无效?,vba,range,cells,Vba,Range,Cells,我试图通过将值从一个范围分配到另一个范围,将一些数据从一个工作簿移动到另一个工作簿。当我使用普通范围语法来指定目标范围(范围(“A1:B2”)时,我的代码可以工作,但是如果我尝试使用范围,单元格语法(范围(单元格(1,1),单元格(2,2)),我的代码就不能工作 我激活目标工作簿(ActiveWorkbook),并在源工作簿(ThisWorkbook)中运行代码 此代码适用于: ActiveWorkbook.Worksheets(1).Range("A1:B2").Value _ = ThisW

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


有人知道为什么使用cells对象会给我带来问题,或者如果我不知道还有其他问题吗?

问题是
单元格
不合格,这意味着这些单元格引用的工作表根据代码所在的位置而不同。任何时候调用
Range
单元格
UsedRange
或任何返回范围对象的对象,并且未指定其所在的工作表时,工作表将根据以下内容分配:

  • 在工作表的类模块中:该工作表与活动的内容无关
  • 在任何其他模块中:ActiveSheet
您限定了
范围
引用,但是
单元格
引用是不限定的,并且可能指向活动表。就像写作一样

ThisWorkbook.Worksheets(1).Range(ActiveSheet.Cells(1, 1), ActiveSheetCells(2, 2)).Value
这当然没有任何意义,除非这个工作簿。工作表(1)恰好处于活动状态。我经常喜欢使用With block,以确保所有内容都是完全合格的

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
但实际上,如果要硬编码
单元格
参数,可以像

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

无需限定指令中的范围
shDest.range(shDest.Cells(1,1),shDest.Cells(2,2)).Value=\shSource.range(shSource.Cells(1,1),shSource.Cells(2,2)).Value
这也是正确的
range(shDest.Cells(1,1),shDest.Cells(2,2)).Value=\urange(shSource.Cells(1,1),shSource.Cells(2,2)).Value
@BruceWayne,到目前为止我找到的Excel文档对此并不清楚。(我发现,在工作表模块中,必须在范围前加前缀,但在任何其他类型的模块中都不需要。这是明确正确的还是只是偶然的,我不知道……我的猜测(这只是猜测)这是明确正确的。由于Range可以接受多种参数类型-一个字符串,计算为一个Range,一个单元格对象,两个单元格对象-因此在幕后会有一些东西来计算您发送的是哪种类型的参数。如果您发送一个完全限定的单元格对象,我敢打赌它会跳过大部分计算/转换代码,这是通过代码的最直接的路径。就像它不会将其转换为字符串,然后再转换回单元格一样。因此,就我的钱而言,如果单元格符合条件,您可以忽略范围中的引用。而且我仍然可能会键入它,因为我是一个习惯生物。保留范围不符合条件确实有效,但也会稍微限制它呃。