我使用以下 VBA 代码 (MS Excel 2010) 选择给定范围内的一系列单元格,复制复制的单元格并将其插入回源范围: 该范围从工作表中的第 2 行开始,一直到第 2200 行,从第 50 列到第 65 列。
设置 rngFEA = shtTarget.range("myrange")
iMaxLines = 20
使用 rngFEA
.Range(单元格(3, 1), 单元格(3 + iMaxLines, .Columns.Count)). 复制
.Range(单元格(3, 1), 单元格(3 + iMaxLines, .Columns.Count)). 插入 Shift:=xlDown
结束于
这样做(不引用单元格(行,列)参数的 rngFEA)效果很好,所选单元格是预期范围的一部分。
我不喜欢对 cells() 参数不使用任何引用,因为不使用引用会使单元格引用工作表并给出错误的结果,所以我宁愿使用 rngFEA.cells():
设置 rngFEA = shtTarget.range("myrange")
iMaxLines = 20
使用 rngFEA
.Range(.Cells(3, 1), .Cells(3 + iMaxLines, .Columns.Count)).复制
.Range(.Cells(3, 1), .Cells(3 + iMaxLines, .Columns.Count)). 插入 Shift:=xlDown
结束于
但结果范围远远超出了 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
返回工作表中范围开始的行号,
range.column
返回范围开始的列。
选择给定范围内的单元格或行
range.row(2)
不返回范围的第二行,而是返回工作表的第二行。
for each myrow in range.rows
索引
myrow.row
返回范围内的行号,但使用它作为选择索引似乎返回工作表内的行,所以我需要添加
range.row + myrow.row
索引到范围内的实际行。
这背后的机制以及上述在范围内选择范围的行为让我感到困惑。 由于使用 VBA 在 Excel 中处理事情的方法有很多,我希望您能给我所描述的行为的一般解释,而不是解决方案(如果不是为了解释原因):)
提前谢谢
伊达里尔
最佳答案
可以确认此行为:
Sub Tester()
Dim rng As Range
Set rng = Range("C3:H28")
'This selects E5:F6 (???)
With rng
.Range(.Cells(1, 1), .Cells(2, 2)).Select
End With
'This selects C3:D4 (expected)
With rng
rng.Parent.Range(.Cells(1, 1), .Cells(2, 2)).Select
End With
End Sub
似乎这可能与同时使用 .Range
和 .Cells
的“双重相对”组合有关
相反,使用rng.Parent.Range
并仅使.Cells
相对于包含范围似乎可以修复它(并且仍然允许完全限定的范围引用)
关于vba - 在一个范围内选择一个范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39036185/