ポイント
- フィルタ結果が飛び地(歯抜け、複数のセル領域)となり、その可視部分を Range として取得した場合、複雑な結果が得られる。
- 飛び地可視部分を取得したコードは
Range.SpecialCells(xlCellTypeVisible)
- 飛び地のセルを Range に含めた場合、それぞれのセル範囲の Range が作られる。
- 飛び地は Areas プロパティの中に含まれるようになる。
- Range のプロパティメンバとして Areas があり、Areas のプロパティメンバとして飛び地の Range が含まれる。
- Areas 内の Range のインデックスは 1 から始まる。
- 飛び地の Range の数は Areas.Count で取得できる。
- 飛び地の Range は Range.Areas(n) で取得できる。
- Union 関数を使用して複数の Range を統合した変数は、フィルタ結果が飛び地の可視部分の Range を取得した時の構造と同じ。
以上のことに気がついたわけですけれども、それを学習できたコードを残しておきますの♪
エクセルワークシート
「Sheet1」の次のデータを扱いました。1行目もエクセルシートに記載しております。
No | 都道府県 |
---|---|
1 | 北海道 |
2 | 青森県 |
3 | 岩手県 |
4 | 秋田県 |
5 | 岩手県 |
6 | 秋田県 |
7 | 秋田県 |
8 | 青森県 |
9 | 岩手県 |
10 | 秋田県 |
VBA コード
- 飛び地ができるようにフィルタを掛けて、
- 可視部分を Range として取得し、
- その Range の構造や Range からの情報取り出し方法
を見ていきますの!
Option Explicit Sub test() ' 次の結果となるようにフィルタ ' No 都道府県 ' 2 青森県 ' 3 岩手県 ' 5 岩手県 ' 8 青森県 ' 9 岩手県 Range("A1").Select Selection.AutoFilter Range("A1:B11").AutoFilter _ Field:=2, _ Criterial1:="=青森県", _ Criterial2:="=岩手県", _ Operator:=xlOr ' 飛び地となった複数のセル範囲の可視部分を取得 Dim objTarget As Range Set objTarget = Range("A1:B11").SpecialCells(xlCellTypeVisible) ' Range についての情報 Debug.Print "Range.Areas.Count : " & objTarget.Areas.Count Debug.Print "Range.Count : " & objTarget.Count Debug.Print "Range.Rows.Count : " & objTarget.Rows.Count Debug.Print "Range.Columns.Count : " & objTarget.Columns.Count ' 単純に For Each で回すと、複数の選択範囲のセルをすべて ' (Range.Areas 内のセルすべて)含めてループする。 Dim i As Long i = 0 Dim v As Variant For Each v In objTarget i = i + 1 Next v Debug.Print "For Each で Range を回したときのセル数 : " & i ' 複数の選択範囲をすべて含めた状態で、行単位でデータを取得するには、 ' Areas 数で回し、その中の行数で回す。 Dim j As Long Dim k As Long Dim objArea As Range For j = 1 To objTarget.Areas.Count Set objArea = objTarget.Areas(j) Debug.Print "Range.Areas(" & j & ").Rows.Count : " & objArea.Rows.Count Debug.Print "Range.Areas(" & j & ").Columns.Count : " & objArea.Columns.Count For k = 1 To objArea.Rows.Count Debug.Print objArea(k, 1) & " : " & objArea(k, 2) Next k Next j ' 後処理 Selection.AutoFilter End Sub
結果のイミディエイトウィンドウ
次のように、なりました♪
Range.Areas.Count : 3 Range.Count : 10 Range.Rows : 2 Range.Columns.Count : 2 For Each で Range を回したときのセル数 : 10 Range.Areas(1).Rows.Count : 2 Range.Areas(1).Columns.Count : 2 2 : 青森県 3 : 岩手県 Range.Areas(2).Rows.Count : 1 Range.Areas(2).Columns.Count : 2 5 : 岩手県 Range.Areas(3).Rows.Count : 2 Range.Areas(3).Columns.Count : 2 8 : 青森県 9 : 岩手県
おわりに
次のページが参考になりました!ありがとう存じます!
VBA の参考ウェブサイトは、作りが古いものが多いですの♪そんな昔から、使われてきた言語なのだと、しみじみいたしました♪
以上です。