当ページのリンクには一部広告が含まれています。
うさねこ気まぐれPG開発室

Excel VBA 複数「列」を非表示にする

広告

複数「列」を非表示

うさこちゃん
うさこちゃん

サンプルは2パターンあります。
データが少ない場合は1つ目のサンプルで十分ですが、データが大量にあると、処理が遅くなる場合があります。
その場合は、サンプル2の「Range」に非表示データを貯めておき、一括して非表示にして高速化する方法がいいと思います。

①元データ

うさこちゃん
うさこちゃん

合計行(12行目)に0のデータがある列を非表示する。

②処理後データ

うさこちゃん
うさこちゃん

合計行(12行目)の0のデータを非表示した結果。

サンプル①

Dim ObjThisSh As Object
Dim LngColMax As Long
Dim LngHidden As Long
Set ObjThisSh = ThisWorkbook.Sheets("Sheet1")
LngHidden = 12 '合計行

With ObjThisSh

    LngColMax = .Cells(LngHidden, .Columns.Count).End(xlToLeft).Column

    For LngIndex = 2 To LngColMax
        If .Cells(LngHidden, LngIndex).Value = 0 Then
            '列を非表示にする
            .Columns(LngIndex).EntireColumn.Hidden = True
        End If
    Next LngIndex

End With

サンプル② 高速化バージョン

Dim ObjThisSh  As Object
Dim LngColMax As Long
Dim LngIndex As Long
Dim RngHidden As Range
Dim LngHidden As Long
Set ObjThisSh = ThisWorkbook.Sheets("Sheet1")
LngHidden = 12 '合計行

With ObjThisSh

    LngColMax = .Cells(LngHidden, .Columns.Count).End(xlToLeft).Column

    For LngIndex = 2 To LngColMax
        If .Cells(LngHidden, LngIndex).Value = 0 Then
            If RngHidden Is Nothing Then
                Set RngHidden = .Cells(2, LngIndex)
            Else
                Set RngHidden = Union(RngHidden, .Cells(2, LngIndex))
            End If
        End If
    Next LngIndex

    If Not RngHidden Is Nothing Then
        '列を一括非表示
        RngHidden.EntireColumn.Hidden = True
    End If

End With

サンプル③ 高速化バージョン(配列判定+一括非表示)

改善ポイント

  • .Cells() を都度呼ぶのではなく、Range.Value を配列に読み込んでループ処理。
    → ExcelとVBA間のやり取りが激減して高速化。
  • 判定だけ配列で行い、対象列を Union でまとめ、最後に Hidden = True を一括適用
  • これにより列数が数百あっても一瞬で非表示化できます。
Dim ObjThisSh As Object
Dim LngColMax As Long
Dim LngHidden As Long
Dim LngIndex As Long
Dim VarValues As Variant
Dim RngHide As Range

Set ObjThisSh = ThisWorkbook.Sheets("Sheet1")
LngHidden = 12 ' 合計行

With ObjThisSh
    ' 対象行を配列に格納
    LngColMax = .Cells(LngHidden, .Columns.Count).End(xlToLeft).Column
    VarValues = .Range(.Cells(LngHidden, 2), .Cells(LngHidden, LngColMax)).Value

    ' 配列で判定(Excelへのアクセスを減らす)
    For LngIndex = 1 To UBound(VarValues, 2)
        If VarValues(1, LngIndex) = 0 Then
            If RngHide Is Nothing Then
                Set RngHide = .Columns(LngIndex + 1)
            Else
                Set RngHide = Union(RngHide, .Columns(LngIndex + 1))
            End If
        End If
    Next LngIndex

    ' 一括で非表示
    If Not RngHide Is Nothing Then RngHide.Hidden = True
End With

免責事項

本記事のサンプルプログラムは実行を保証するものではなく、利用に伴う結果について一切の責任を負いません。



広告