按行或列的Excel范围处置

时间:2016-10-06 16:12:32

标签: excel vba excel-vba

Excel Range类似乎有一个未记录的属性,用于确定ItemCellsCount属性的工作方式(以及其他类方法)和属性,最有可能)。

普通Range似乎有" Cell"配置;即访问其属性需要一个Cell索引。

Set x = [A1:H50]

?TypeName(x)
Range

?x.Address
$A$1:$H$50

?x.Count
 400 

?x(20).Address
$D$3

但你也可以获得一个" Column"或" Row" -dispositioned Range,其行为不同。

Set x = [A1:H50].Columns

?TypeName(x)
Range

?x.Address
$A$1:$H$50

?x.Count
 8 

?x(20).Address
$T$1:$T$50

我试图为Range编写一个包装类,它的行为优于多个Area范围的内置类型。我想更好地了解这个范围"配置"作品。是否有内置属性或其他简单的方法来测试"配置"一个Range对象有?是"处置"范围的不可变属性或有没有办法改变它而不使用" Rows"," Columns"或" Cells"特性

2 个答案:

答案 0 :(得分:1)

我没有意识到这种行为甚至存在。我查看了Range Object的属性列表,但是找不到满足包装器需求的任何东西。相反,我写了一个函数,我认为它告诉你" Disposition",我称之为方向。

.carousel-inner > .item {
    -webkit-perspective: initial !important;
    perspective: initial !important;
    -webkit-transition: initial;
    -o-transition: initial;
    transition: initial;
    -webkit-transform: initial !important;
    transform: initial !important; 
}

答案 1 :(得分:1)

实际上MSDN documentation

  

返回 Range 对象,该对象表示指定的列   范围

表示它返回Collection列,以便.Count返回集合元素的数量,即列数

但它也增加了:

  

当应用于多区域选择的Range对象时,这个   property仅从范围的第一个区域返回列。对于   例如,如果Range对象有两个区域 - A1:B2和C3:D4 -   Selection.Columns.Count返回2,而不是4。

虽然立即给出了出路:

  

在可能包含多个区域的范围内使用此属性   选择,测试Areas.Count以确定范围是否包含   不止一个地区。如果是,则遍历范围

中的每个区域

因此需要一些包装器来增强Range对象的默认成员

这将是extension methods的完美空间,遗憾的是在VBA中无法实现

所以下一步应该是定义一个Class

例如,您可以添加一个名为" MyRange"的新类。使用以下代码:

Option Explicit

Dim rng As Range

Public Property Set Range(r As Range)
    Set rng = r
End Property

Public Property Get Range() As Range
    Set Range = rng
End Property


Function ColumnsCount() As Long '<-- your personalized "Columns.Count" function correctly calculates the number of columns of your range
    Dim area As Range

    If rng Is Nothing Then Exit Function
    For Each area In rng.Areas
        ColumnsCount= ColumnsCount+ area.Columns.Count
    Next area
End Function

你的代码会利用那个&#34; MyRange&#34;分类如下

Option Explicit

Sub main()
    Dim rng As Range ' "normal" range type
    Dim myRng As MyRange ' your "personalized" range type

    Set rng = Range("A1:B2, C3:D5") '<-- set a "normal range" object

    Set myRng = New MyRange '<--| set your "personalized range" object
    Set myRng.Range = rng '<-- give it the "normal" range as its "rng" property

    MsgBox rng.Columns.Count '<-- this will return 2
    MsgBox myRng.ColumnsCount '<-- this will return 4
End Sub