2016-10-06 8 views
2

ItemCells、およびCount性質がどのように動作するかを決定エクセルRangeクラス(だけでなく、他のクラスのメソッドとプロパティ、最も可能性が高い)のために文書化されていない属性があるようです。Excelの範囲の処分は

普通Rangeは "セル"の処理をしているようです。すなわちそれらの特性にアクセスすることは、セルインデックスをとる。

Set x = [A1:H50] 

?TypeName(x) 
Range 

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

?x.Count 
400 

?x(20).Address 
$D$3 

しかし、あなたはまた異なった動作をRangeを-dispositioned「列」または「行」を、取得することができます。

Set x = [A1:H50].Columns 

?TypeName(x) 
Range 

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

?x.Count 
8 

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

私は、マルチArea範囲のためのビルトインタイプよりも優れて動作しますRangeのラッパークラスを記述しようとしています。私はこの範囲 "処分"がどのように機能するかをよりよく理解したいと思っています。組み込みのプロパティがありますか、それとも他の方法で簡単にオブジェクトの "処理"をテストできますか? 「配置」は範囲の不変なプロパティですか、「行」、「列」または「セル」プロパティを使用して新しい範囲を取得せずに変更する方法がありますか?

答えて

1

私はこの現象が存在していたことに気づいていませんでした。私はRangeオブジェクトのプロパティリストを調べましたが、あなたのラッパーに対するこの必要性に対処するものは何も見つかりませんでした。代わりに、私はあなたに「ディスポジション」と言う機能を書いた、私はそれをオリエンテーションと呼んだ。

Function getOrientation(ByVal Rng As Range) As String 
    'If only one row, it's a column orientation 
    If Rng.Rows.Count = 1 Then 
     getOrientation = "Column" 
     Exit Function 
    End If 

    'If only one column, it's a row orientation 
    If Rng.Columns.Count = 1 Then 
     getOrientation = "Row" 
     Exit Function 
    End If 

    'If the cell count matches the expected cell count, it's Both 
    If Rng.Count = Rng.Columns.Count * Rng.Rows.Count Then 
     getOrientation = "Both" 
    ElseIf Rng.Count = Rng.Columns.Count Then 
     getOrientation = "Column" 
    Else 
     getOrientation = "Row" 
    End If 
End Function 

Sub Test() 
    'Testing 
    Debug.Print getOrientation(Range("A1:B100").Columns) 
    Debug.Print getOrientation(Range("A1:B100").Rows) 
    Debug.Print getOrientation(Range("A1:B100")) 
    Debug.Print getOrientation(Range("A1:A100")) 
    Debug.Print getOrientation(Range("A1:C1")) 
End Sub 
+0

を次のように "MyRange" クラスのことを悪用 'レンジ( "A1:B2、C3:D5")のような範囲'。このような範囲を扱うためにコードを拡張することもできますが、@ Tmdeanが探している "本当の"方法は、新しいクラスのクラスだと思います。 – user3598756

+0

すべてのラッパーを配置する必要があります。オリエンテーション。下のクラスのインジケータはどこにありますか?例えば。列数ではなく、[A1:A100] .Rowsのように範囲が定義されている場合、Rng.Countは行数を返します。 –

+0

RangeオブジェクトのAreasプロパティを直接ループして適切にループする必要はないので、インジケータプロパティはありません。 ColumnsCountプロパティは単なる例でした。同様のRowsCountを簡単に追加することで、行の数を正しくカウントすることができます。 – user3598756

1

は実際にMSDN documentation

が、それは列のCollectionを返す意味指定 範囲

の列を表し範囲オブジェクトを返します言うように.Countだろうコレクション要素の数、つまり列数を返します

は、それはまた、追加されます:

複数エリアの選択のRangeオブジェクトに適用

、この プロパティは、範囲の第1の領域のみから列を返します。 例えば、Rangeオブジェクトは、二つの領域がある場合 - A1:B2とC3:D4 - Selection.Columns.Count戻り2、すぐに道を与えている間はない4.

複数の領域が含まれている可能性がある範囲でこのプロパティを使用するには、Areas.Countをテストして範囲に の複数の領域が含まれているかどうかを判断します。それは範囲内の各領域の上、ループがない場合

そこでいくつかラッパーの必要性がRangeオブジェクトのデフォルトメンバーを強化することが

これは残念ながらありませんextension methodsのための完璧な部屋、だろうVBA

で可能なので、次の動きは、次のコードで「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 

、あなたはコードが、これは複数の領域で失敗し

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 
+0

これは、基本的なプロパティ、イテレーター関数を実装したMyRangeクラスを作成するために、それはマルチエリアの範囲と私が望むいくつかの他の機能をサポートしていることを除いて、それは組み込みのレンジタイプのように動作するように "処分"フラグ。 – Tmdean

+0

喜んで助けになるでしょう。実際には、「配置」プロパティは実際のものではないと考えていますが、「エリア」プロパティは、範囲オブジェクトの組み込みプロパティを適切に処理(および拡張)するためのキーです。いずれにしても、あなたは、「処理」があなたのさらなるコーディングのための有用な抽象概念であることが分かります。拡張のために、[Code Rewiew](http://codereview.stackexchange.com)でクラスコードを共有することもできます。最後に、私はあなたの質問に答えているようです(これは、 "Columns"プロパティのより良い理解とそのための "処分"についてのものです)。ありがとうございました。 – user3598756

+0

なぜそれが本当のものではないと思いますか...列と行の戻り値の型は "範囲"です。それはコレクションの型を返しません...それはいくつかのプロパティとメソッドのために少し異なる方法で動作するRangeを返します。 – Tmdean