Excel VBA使用.Cells定义.Range

Excel VBA使用.Cells定义.Range,excel,vba,range,cells,Excel,Vba,Range,Cells,我在工作表中选择/复制某些范围时遇到问题。我已经尽可能缩小了范围 这很好: dataSheet.Cells(dRow, dataSheet.Range("IO_MODULES").Column).Select 这并不是: dataSheet.Range(Cells(dRow, dataSheet.Range("IO_MODULES").Column), Cells(dRow, dataSheet.Range("IO_MODULES").Column)).Select 这就是我想做的: dat

我在工作表中选择/复制某些范围时遇到问题。我已经尽可能缩小了范围

这很好:

dataSheet.Cells(dRow, dataSheet.Range("IO_MODULES").Column).Select
这并不是:

dataSheet.Range(Cells(dRow, dataSheet.Range("IO_MODULES").Column), Cells(dRow, dataSheet.Range("IO_MODULES").Column)).Select
这就是我想做的:

dataSheet.Range(Cells(dRow, dataSheet.Range("IO_MODULES").Column), Cells(dRow, dataSheet.Range("MODULE_END").Column)).Copy Destination:= _
dataSheet.Range(Cells(dataSheet.Range("MODULE_1").Row + i - 1, dataSheet.Range("D_COUNT").Column + 1), Cells(dataSheet.Range("MODULE_1").Row + i - 1, dataSheet.Range("DATA_COL_END").Column))
我似乎误解了Worksheet.Cells和Worksheet.Range之间的关系。我需要做的是能够根据我命名的单元格行数和列数选择一个单元格区域。

未测试尝试从一个区域复制到另一个区域:

'...
Dim Source As Range, Dest As Range

With dataSheet
    Set Source = .Range(.Cells(dRow, .Range("IO_MODULES").Column), _
        .Cells(dRow, .Range("MODULE_END").Column))
    Set Dest = .Range(.Cells(.Range("MODULE_1").Row + i - 1, .Range("D_COUNT").Column + 1), _
        .Cells(.Range("MODULE_1").Row + i - 1, .Range("DATA_COL_END").Column))
    Source.Copy Dest
End With
With…End With允许您在单个对象(在本例中为数据表)上多次操作,而无需每次显式调用它。您编写的每一行代码都必须进行维护和潜在的调试,因此当您可以在不损失可读性的情况下更加简洁时,您应该这样做。有关…的更多信息,请在此处以语句结尾: 通过命名范围,可以使用超级友好的Range.Copy方法,如下所示:。这使您能够绕过.Select或.Activate,根据我的经验,这是运行时错误的主要来源。 未测试尝试从一个范围复制到另一个范围:

'...
Dim Source As Range, Dest As Range

With dataSheet
    Set Source = .Range(.Cells(dRow, .Range("IO_MODULES").Column), _
        .Cells(dRow, .Range("MODULE_END").Column))
    Set Dest = .Range(.Cells(.Range("MODULE_1").Row + i - 1, .Range("D_COUNT").Column + 1), _
        .Cells(.Range("MODULE_1").Row + i - 1, .Range("DATA_COL_END").Column))
    Source.Copy Dest
End With
With…End With允许您在单个对象(在本例中为数据表)上多次操作,而无需每次显式调用它。您编写的每一行代码都必须进行维护和潜在的调试,因此当您可以在不损失可读性的情况下更加简洁时,您应该这样做。有关…的更多信息,请在此处以语句结尾: 通过命名范围,可以使用超级友好的Range.Copy方法,如下所示:。这使您能够绕过.Select或.Activate,根据我的经验,这是运行时错误的主要来源。
总的来说,您将希望尝试并避免使用.Select-这里有一个很好的说明:Cells是一个非限定范围对象,因此它总是隐式定义为ActiveSheet.Cells。因此,您在dataSheet.RangeCells中得到一个错误。。。除非数据表是活动表。哇,真不敢相信我忽略了这一点。不知道我是怎么想的,就像我用的细胞一样。总而言之,感谢您,您将要尝试并避免使用.Select-这里有一篇关于这一点的好文章:Cells是一个非限定范围对象,因此它总是隐式定义为ActiveSheet.Cells。因此,您在dataSheet.RangeCells中得到一个错误。。。除非数据表是活动表。哇,真不敢相信我忽略了这一点。不知道我是怎么想的,就像我用的细胞一样。谢谢你做了这项工作,非常感谢。为什么我们需要范围变量?Dan你的答案当然有效,但如果你能解释为什么有效,那将是一个更好的答案…命名范围将允许你使用范围。复制,这里概述:和。。。包装好的+感谢@DavidZemens的解释,而不仅仅是回答问题的人,非常感谢。为什么我们需要范围变量?Dan你的答案当然有效,但如果你能解释为什么有效,那将是一个更好的答案…命名范围将允许你使用范围。复制,这里概述:和。。。包装好的+感谢@DavidZemens提出解释,而不仅仅是答案