オートフィルター、Rangeオブジェクト、2次元配列

※題名は、PINK FLOYDのオマージュです。

オートフィルターをかけたRangeオブジェクトを2次元配列にぶち込む

セル範囲の値を2次元配列にぶち込むお馴染みの方法。

ClearContentsメソッドでは非表示行が無視されたが、この場合はどうなるのか。

やってみた

f:id:akashi_keirin:20180227223129j:plain

この状態で、次のコードを実行。

リスト1 標準モジュール
Public Sub testArray()
  Dim Sh As Worksheet
  Set Sh = ThisWorkbook.Worksheets("Sheet3")
  Dim a As Variant
  a = Sh.Range("D1").CurrentRegion.Value    '……(*)'
  Dim maxRow As Integer
  Dim maxColumn As Integer
  maxRow = UBound(a, 1)
  maxColumn = UBound(a, 2)
  Dim i As Integer
  Dim j As Integer
  Dim str As String
  For i = 1 To maxRow
    str = ""
    For j = 1 To maxColumn
      If j = 1 Then
        str = a(i, j)
      Else
        str = str & " | " & a(i, j)
      End If
    Next
    Debug.Print str
  Next
End Sub

D1セルを含むアクティブセル領域の値を2次元配列 a にぶち込んで、Forループで値を取り出しながらイミディエイトに表示する、というアホみたいなコード。

f:id:akashi_keirin:20180227223135j:plain

当然こうなる。

一部非表示にしてやってみる

f:id:akashi_keirin:20180227223142j:plain

例によって「武松」と「楊志」を非表示にした。

この状態でリスト1を実行。

f:id:akashi_keirin:20180227223153j:plain

まったく同じ結果になった。

ちなみに、リスト1の(*)のところを

a = Selection.Value

としても結果は同じだった。

おわりに

「だから何?」とか言われても、知りません。

@akashi_keirin on Twitter