【问题标题】:selecting a range within a range在一个范围内选择一个范围
【发布时间】: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 中处理事情的方法有很多,我希望你能给我一个所描述行为的一般解释,而不是一个解决方案(如果不是为了解释原因):)

提前谢谢

伊达利尔

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    可以确认此行为:

    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 相对于包含范围似乎可以解决它(并且仍然允许完全限定的范围引用)

    【讨论】:

    • 嗨,蒂姆,感谢您的意见。我将使用您的解决方案 :) 我仍然想知道,为什么 excel 会那样做。可能是行为是正确的,但我没有看到其背后的系统。
    【解决方案2】:

    在 VB.Net 的某个范围内获取 Excel 范围时,我遇到了相同的行为。 Tim's answer 解决了奇怪的行为。起初我认为这与 With 的使用有关,但我想这与 Tim 建议的点符号的双重相对引用有关。

    Public Sub SomeMergingFunction(ByRef inputRange As Excel.Range)
        With inputRange
            Debug.Print(.Address) ' $A$4:$A$130 correct
            Debug.Print(.Cells(1, 1).Address) ' $A$4 correct
            Debug.Print(.Range(.Cells(1, 1), .Cells(1, 1)).Address) ' $A$7 wrong
            Debug.Print(.Parent.Range(.Cells(1, 1), .Cells(1, 1)).Address) ' $A$4 correct
        End With
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多