※当サイトの一部記事には広告を含みます。
うさねこ気まぐれ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

免責事項

本記事のサンプルプログラムは、学習・参考用として掲載しているもので、動作や結果を保証するものではありません。 利用する場合は、ご自身の環境に合わせて確認しながらお使いください。万が一トラブルや損害が発生した場合でも、当サイトでは責任を負いかねます。



広告
桃太郎電鉄2 ~あなたの町も きっとある~ 東日本編+西日本編
桃太郎電鉄2 ~あなたの町も きっとある~ 東日本編+西日本編
初回ご発注分にDLCコードチラシ封入:オリジナル列車 「東日本グルメ号」、オリジナル列車 「西日本グルメ号」

※本文中に記載の会社名・製品名・サービス名・ゲームタイトル名等は、各社の商標または登録商標であり、権利は各社に帰属します。

※サンプルはテストを行っていますが、すべての環境での動作を保証するものではありません。ご利用は自己責任でお願いいたします。

※本記事の仕様・価格・対応状況等は執筆時点で確認できた情報をもとに掲載しています。最新の情報はメーカー公式サイトをご確認ください。

※当サイトでは一部の記事において、アイキャッチ画像にAI生成を使用しています。