excel范围似乎保留了它被创build的原因的信息

看看这个例子:我创build了一个“常规”范围,并从中创build了两个范围:一个通过调用“columns”属性,另一个通过调用“rows”属性。 现在,尽pipe它们看起来也是常规范围,并且它们指向相同的工作表区域,但默认方法的行为不同。

Public Sub RangeTest01() Dim r As Range ' i get a 'regular' range on the active sheet of 3 columns and 3 rows Set r = ActiveSheet.Range("A1:C3") Dim rr As Range Set rr = r.Rows Debug.Print "rr: range generated by the call 'Rows' on the original range" Debug.Print "1. what kind of object is it? " & TypeName(rr) Debug.Print "2. what are the sheet cell it refers to? " & rr.Address Debug.Print "3. what does the default method call produce?" & rr(1).Address Dim rc As Range Set rc = r.Columns Debug.Print "rc: range generated by the call 'Columns' on the original range" Debug.Print "1. what kind of object is it? " & TypeName(rc) Debug.Print "2. what are the sheet cell it refers to? " & rc.Address Debug.Print "3. what does the default method call produce?" & rc(1).Address End Sub 

产量

 rr: range generated by the call 'Rows' on the original range 1. what kind of object is it? Range 2. what are the sheet cell it refers to? $A$1:$C$3 3. what does the default method call produce?$A$1:$C$1 rc: range generated by the call 'Columns' on the original range 1. what kind of object is it? Range 2. what are the sheet cell it refers to? $A$1:$C$3 3. what does the default method call produce?$A$1:$A$3 

问题

因此,不是所有相同数据的范围都是相等的,关于我在这里看到的行为,我可以find的最好的描述是“一个范围保存关于它被创build的原因的信息”,并且行为不同根据这个信息。

所以,如果它已经创build了与列一起工作,它保持了一种“基于列”的标志,如果它已经创build了与行的工作相反的方式。

问题是:是否可以访问这些信息? 是否有其他“改变”types的范围或其他对象,应该看看他们的起源,以了解他们的行为?

您正在创build一个包含一系列由列对象或行对象拆分的范围的对象,它们的行为不同,因为您已经使用不同的方法定义了它们。

如果你做了rcells = r.cells并运行相同的过程,我相信它会在第3点输出$ A $ 1:$ A $ 1。或者也许只是$ A $ 1 – 会很有趣。

我不知道有什么办法可以确切地说出不同的创作范围,但另一方面,我也不认为这是必要的。

由于范围对象是包含其他范围(有序)集合的类集合对象,因此可以通过索引对其进行迭代和处理。 让我们看看下面的范围属性,根据它们应用的范围,返回另一个范围对象本身:

  • Rows – 包含当前范围的所有单元划分为单行
  • Columns – 包含当前范围的单列中的所有单元格
  • Cells – 包含当前范围内的所有单元格,一个接一个地划分为单个单元格(如果迭代它,则会获得第一行的单元格,逐列,然后第二行的单元格等等)
  • EntireRow – 包含工作表中按行划分的所有单元格,但只包含当前范围覆盖的那些行:将当前范围扩展到所有列
  • EntireColumn – 包含工作表中按列分隔的所有单元格,但仅包含当前范围覆盖的那些列:将当前范围扩展到所有行

所以,根据属性的不同,返回值会将单元格“切片”成不同的部分,然后可以通过索引进行迭代或寻址。 但是,所有的属性仍然返回相同的单元格,只是按不同的顺序排列(整个*属性除外,这些属性也会返回其各自行/列中的所有其他单元格)。

现在,如果您必须处理范围对象,但不知道范围是如何创build的,则只需将上述任何属性应用到该对象上,以便以您喜欢的方式返回单元格。 由于所有这些范围属性本身都返回范围,因此可以多次应用它们。
例如,考虑像这样改变你的代码:

 Set rr = r.Rows.Columns ... Set rc = r.Columns.Rows 

输出将是相同的,只是在两个块之间切换。 什么是列之前列成列的列表,反之亦然。