ポイント
- フィルタ結果が飛び地(歯抜け、複数のセル領域)となり、その可視部分を 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 の参考ウェブサイトは、作りが古いものが多いですの♪そんな昔から、使われてきた言語なのだと、しみじみいたしました♪
以上です。
