【发布时间】:2017-05-31 10:19:38
【问题描述】:
我正在使用以下 VBA 代码 (MS Excel 2010) 选择给定范围内的一系列单元格,将复制的单元格复制并插入回源范围: 范围从工作表的第 2 行开始,一直到第 2200 行,从第 50 列到第 65 列。
Set rngFEA = shtTarget.range("myrange")
iMaxLines = 20
With rngFEA
.Range(Cells(3, 1), Cells(3 + iMaxLines, .Columns.Count)).Copy
.Range(Cells(3, 1), Cells(3 + iMaxLines, .Columns.Count)).Insert Shift:=xlDown
End With
这样做(对于 Cells(Row,Column) 参数没有引用 rngFEA)工作正常,所选单元格是预期的范围的一部分。
我不喜欢对 cells() 参数使用无引用,因为不使用引用会使单元格引用工作表并给出错误结果,所以我宁愿使用 rngFEA.cells():
Set rngFEA = shtTarget.range("myrange")
iMaxLines = 20
With rngFEA
.Range(.Cells(3, 1), .Cells(3 + iMaxLines, .Columns.Count)).Copy
.Range(.Cells(3, 1), .Cells(3 + iMaxLines, .Columns.Count)).Insert Shift:=xlDown
End With
但结果范围正好位于 rngFEA 范围之外,位于左侧和下方的某个位置。 我什至找不到使用的索引和结果偏移量之间的关系。
我相信 range.insert 也可以表述为
rngFEA.cells(3,1).insert shift:=xldown
但这不是我现在关心的问题。
我很清楚是否引用的区别,但我不明白为什么不使用对范围的引用会给出正确的结果,而使用引用却不会。
我期待
rngFEA.range(rngFEA.cells(1,1), rngFEA.cells(10,10))
返回给定范围的最顶部、最左侧单元格的范围,直到同一范围内的右侧和向下第十个单元格。 在示例代码中,我选择给定范围内第 3 行中最左边的单元格,直到第 23 个单元格和范围的右端。 (实际选择的行是工作簿中的第 3 行,因此是范围中的第 2 行) 我查看了 Microsoft 的信息和几个论坛,但找不到充分描述这种效果的解释。
我知道
range.row
返回 WORKSHEET 中范围开始的行号,
range.column
返回范围开始的列。
在给定范围内选择一个单元格或一行
range.row(2)
不返回范围的第二行,而是返回工作表的第二行。一个
for each myrow in range.rows
索引
myrow.row
返回范围内的行号,但将其用作选择索引似乎返回工作表内的行,所以我需要添加
range.row + myrow.row
索引到范围内的实际行。
这背后的机制以及上述在范围内选择范围的行为让我感到困惑。 由于使用 VBA 在 Excel 中处理事情的方法有很多,我希望你能给我一个所描述行为的一般解释,而不是一个解决方案(如果不是为了解释原因):)
提前谢谢
伊达利尔
【问题讨论】: