選択した範囲の内、非表示の列を含まない範囲の値を配列に格納したい ①

f:id:Infoment:20190723225942p:plain

今日の出来事。
このような表があって、データ部分を配列化することになった。
f:id:Infoment:20190723225340p:plain

Sub Test()
    Dim arr() As Variant
        arr() = Selection
End Sub

普段だったら、滞りなく次の段階に進む。
しかし今回、あるはずのない値が目に留まった。
f:id:Infoment:20190723223140p:plain

150?そんな数字、あったっけ?
調べてみて、直ぐに原因が分かった。C列が非表示となって隠れていたのだ。
f:id:Infoment:20190723223316p:plain

ぬぬぬ、おのれ、どうしてくれよう。とりあえず安易に、表示されている範囲だけを指定してみた。

Sub Test()
    Dim arr() As Variant
        arr() = Selection.SpecialCells(xlCellTypeVisible).Value
End Sub

結果は、失敗。非表示の溝を乗り越えることが出来ず、B列までの値しかとれていない。
f:id:Infoment:20190723223805p:plain

色々やってみたが、時間切れ。
今回は取り敢えず、↓ の方法で対処することにした。
選択範囲のセルの値を一つずつ配列に格納する際、当該列が非表示か否か、確認する。非表示の場合は、格納しない。何とも地道な作業となってしまった。

Sub Test()
    Dim TargetRange As Range
    Set TargetRange = Selection
    Dim tempArr() As Variant
        tempArr() = Selection
    Dim r As Long
    Dim c As Long
    Dim i As Long: i = 0
    Dim arr() As Variant
    ReDim arr(1 To TargetRange.Rows.Count, 1 To TargetRange.Columns.Count)
        For c = 1 To Selection.Columns.Count
            If TargetRange.Columns(c).Hidden = False Then
                i = i + 1
                For r = 1 To Selection.Rows.Count
                    arr(r, i) = tempArr(r, c)
                Next
            End If
        Next
    ReDim Preserve arr(1 To TargetRange.Rows.Count, 1 To i)
End Sub

f:id:Infoment:20190723225233p:plain

一撃で解決する方法は無いものか、引き続き探してみます。

参考まで。