カテゴリー
Microsoft

【Excel VBA】Range の情報を取得する方法整理!

ポイント

  • フィルタ結果が飛び地(歯抜け、複数のセル領域)となり、その可視部分を 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 コード

  1. 飛び地ができるようにフィルタを掛けて、
  2. 可視部分を Range として取得し、
  3. その 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 の参考ウェブサイトは、作りが古いものが多いですの♪そんな昔から、使われてきた言語なのだと、しみじみいたしました♪

以上です。

コメントを残す