Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
excel范围似乎保留了有关创建原因的信息_Excel_Vba - Fatal编程技术网

excel范围似乎保留了有关创建原因的信息

excel范围似乎保留了有关创建原因的信息,excel,vba,Excel,Vba,看看这个例子:我已经创建了一个“常规”范围,并从中 两个范围:一个通过调用“columns”属性,另一个通过调用“rows”属性。 现在,虽然它们似乎也是规则范围,并且它们引用相同的工作表区域,但默认方法的行为不同 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:

看看这个例子:我已经创建了一个“常规”范围,并从中 两个范围:一个通过调用“columns”属性,另一个通过调用“rows”属性。 现在,虽然它们似乎也是规则范围,并且它们引用相同的工作表区域,但默认方法的行为不同

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
输出 问题 因此,并不是同一数据上的所有范围都“被创建为相等”,我能找到的关于我在这里看到的行为的最好描述是“一个范围保留了关于其创建原因的信息”,并且根据这些信息的不同行为

因此,如果它是为处理列而创建的,它将保留一种“基于列”的标志,如果它是为处理行而创建的,则相反

问题是:
这条信息可以访问吗?是否存在其他类型的“变化”范围或其他对象,这些范围或对象应在其起源地查看,以了解其行为方式?

您正在创建一个对象,其中包含一系列由列对象或行对象分割的范围,它们的行为方式不同,因为您使用不同的方法定义了它们

如果您执行了
rcells=r.cells
并运行相同的进程,我相信它会输出
$A$1:$A$1第三点。或者可能只是$A$1,这会很有趣

创建的对象包含由列对象或行对象分割的一系列范围,它们的行为不同,因为您使用不同的方法定义了它们

如果您执行了
rcells=r.cells
并运行相同的进程,我相信它会输出
$A$1:$A$1第三点。或者可能只是$A$1,这会很有趣

我不知道有什么方法可以确切地区分不同创建的范围,但另一方面,我认为也没有必要

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

  • -包含当前范围内划分为单行的所有单元格
  • -包含当前范围内划分为单列的所有单元格
  • 单元格
    -包含当前范围内的所有单元格,一个接一个地划分为单个单元格(如果迭代,则得到第一行的单元格,逐列,然后第二行的单元格相同,依此类推)
  • EntireRow
    -包含工作表中按行划分的所有单元格,但仅包含当前范围所覆盖的行:设想当前范围扩展到所有列
  • entireclumn
    -包含工作表中被列分割的所有单元格,但仅包含当前范围所覆盖的列:设想当前范围扩展到所有行
因此,根据属性的不同,返回值会将单元格以不同的方式“切片”为部分,然后可以通过索引进行迭代或寻址。但是所有属性仍然返回相同的单元格,只是顺序不同(除了整个*属性也返回各自行/列中的所有其他单元格)

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

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

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

我不知道有什么方法可以确切地区分不同创建的范围,但另一方面,我认为也没有必要

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

  • -包含当前范围内划分为单行的所有单元格
  • -包含当前范围内划分为单列的所有单元格
  • 单元格
    -包含当前范围内的所有单元格,一个接一个地划分为单个单元格(如果迭代,则得到第一行的单元格,逐列,然后第二行的单元格相同,依此类推)
  • EntireRow
    -包含工作表中按行划分的所有单元格,但仅包含当前范围所覆盖的行:设想当前范围扩展到所有列
  • entireclumn
    -包含工作表中被列分割的所有单元格,但仅包含当前范围所覆盖的列:设想当前范围扩展到所有行
因此,根据属性的不同,返回值会将单元格以不同的方式“切片”为部分,然后可以通过索引进行迭代或寻址。但是所有属性仍然返回相同的单元格,只是顺序不同(除了整个*属性也返回各自行/列中的所有其他单元格)

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

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

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

@AgostinoX:这能回答你的问题吗