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

免責事項

本記事のサンプルプログラムは動作・結果を保証するものではありません。 利用により発生したいかなるトラブル・損害についても、当方は責任を負いません。



広告
PR
CORSAIR SCIMITAR ELITE WIRELESS SE MMOに最適な多ボタンのワイヤレスゲーミングマウスプログラム可能な16ボタン MARKSMAN S 33KセンサーElgato Virtual Stream Deck ワイヤレス Bluetooth ホワイトCH-9314011-AP
CORSAIR SCIMITAR ELITE WIRELESS SE MMOに最適な多ボタンのワイヤレスゲーミングマウスプログラム可能な16ボタン MARKSMAN S 33KセンサーElgato Virtual Stream Deck ワイヤレス Bluetooth ホワイトCH-9314011-AP
驚異的な正確さの 33k DPI MARKSMAN S:MARKSMAN S 33k DPI 光学式センサーのおかげで、ヘッドショット、マップ全体のスキャン、チームメイトへのピン送信など、すべてが驚くほどの精度で行えます。DPI 検出の改善、IPS トラッキング、そして消費電力が旧バージョンより低くなり、間違いなくアップグレードに値します。
16 個のプログラム可能なボタン:世界中のすべてのパワーを、あなたの指先一つで。16 個のプログラム可能なボタンで、パワー、消耗品、アクション、攻撃ごとにボタンを用意しましょう。
Elgato Stream Deck 統合:Elgato Stream Deck のネイティブ統合により、Stream Deck の機能を Stream Deck アプリから SCIMITAR ELITE WIRELESS SE に直接マッピングすることができるので、 ボタンを押すだけで、最も重要な機能が使えます。
Elgato Virtual Stream Deck 統合:このマウスは、Elgato の Virtual Stream Deck 統合を利用して、16 個のボタンにこれまで以上の機能を持たせることもできます。自分の Virtual Stream Deck にボタンをマッピングして、生産性、ゲーミング、ストリーミングなどのプロファイルを構築できます。
高速低遅延ワイヤレスで自由に:コードが不要になり、ラグもなくなります。SLIPSTREAM WIRELESS は、1,000Hz ポーリングで PC または Mac で低遅延の接続を実現します。代わりに Bluetooth に接続したり、USB に接続してプレイしながら充電することもできます。
Amazonで見る