※当サイトの一部記事には広告を含みます。
うさねこ気まぐれPG開発室

Excel VBA 複数「列」を高速削除「Range・Union」使用で高速化する

複数「列」を削除高速化

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

条件に合う列を高速に削除したい場合にデータ量が大量にあると非常に削除が(かなり)遅い場合があります。
その場合は「Range」に削除データを貯めておいて一括して削除すると高速化できます。

①元データ

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

2行目に0のデータがある列を削除する。

ヘッダ1234567891011
条件21015005010
データデータデータデータデータデータデータデータデータデータデータデータ

②処理後データ

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

2行目の0のデータを列削除した結果。

ヘッダ1245810
条件211551
データデータデータデータデータデータデータ

処理速度の違い

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

今回は以下のデータ件数で約10倍の速度差になりました。
列データ500件
行データ100件
削除対象100件

サンプル①0.5273
サンプル②0.0625

サンプル①

Dim ObjThisSh  As Object
Dim LngColMax As Long
Set ObjThisSh = ThisWorkbook.Sheets("Sheet1")

With ObjThisSh

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

    For LngIndex = 2 To LngColMax
        If .Cells(2, LngIndex).Value = 0 Then
            '列を削除
            .Columns(LngIndex).Delete
        End If
    Next LngIndex

End With

サンプル② 高速化

Dim ObjThisSh  As Object
Dim LngColMax As Long
Dim LngIndex As Long
Dim RngDelete As Range
Set ObjThisSh = ThisWorkbook.Sheets("Sheet1")

With ObjThisSh

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

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

    If Not RngDelete Is Nothing Then
        'RngDelete.EntireColumn.Select 'テスト用 削除予定列を表示させる
        '列を一括削除
        RngDelete.EntireColumn.Delete
    End If

End With

サンプル③ さらに高速化したコード(配列判定方式)

改善ポイント

  • VarValues = Range(...).Value で行2を一気に配列化。
    .Cells() を何度も参照しないので 劇的に高速化
  • 判定は配列内で完結するため、Excelとのやり取り(COM呼び出し)が最小限。
  • 最後にまとめて Delete 実行。
Dim ObjThisSh  As Object
Dim LngColMax  As Long
Dim LngIndex   As Long
Dim RngDelete  As Range
Dim VarValues  As Variant

Set ObjThisSh = ThisWorkbook.Sheets("Sheet1")

With ObjThisSh
    ' 行2を配列に読み込み
    LngColMax = .Cells(2, .Columns.Count).End(xlToLeft).Column
    VarValues = .Range(.Cells(2, 2), .Cells(2, LngColMax)).Value

    ' 配列で判定(For文はセルにアクセスしないので速い)
    For LngIndex = 1 To UBound(VarValues, 2)
        If VarValues(1, LngIndex) = 0 Then
            If RngDelete Is Nothing Then
                Set RngDelete = .Cells(2, LngIndex + 1)
            Else
                Set RngDelete = Union(RngDelete, .Cells(2, LngIndex + 1))
            End If
        End If
    Next LngIndex

    ' 一括削除
    If Not RngDelete Is Nothing Then
        RngDelete.EntireColumn.Delete
    End If
End With

免責事項

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


広告
PR
【業界新バージョン】eue スチームアイロン【3段階スチーム量調節&LEDディスプレイ】アイロン 衣類スチーマー シワ伸ばし 折畳み式 10秒立ち上がり 150℃高温 除菌 脱臭 ハンドル180°回転 携帯アイロン 軽量 小型 ハンディ 家庭 出張(ホワイト)
【業界新バージョン】eue スチームアイロン【3段階スチーム量調節&LEDディスプレイ】アイロン 衣類スチーマー シワ伸ばし 折畳み式 10秒立ち上がり 150℃高温 除菌 脱臭 ハンドル180°回転 携帯アイロン 軽量 小型 ハンディ 家庭 出張(ホワイト)
💨【1秒でシワ消去・3WAYアイロン】約10秒で素早い立ち上がり、3倍パワフルスチームを瞬間的に噴射し、衣類繊維の奥まで浸透させ、きれいにシワ伸ばしながら型崩れを直してくれます。お出かけ寸前でもストレスなく衣類ケアを済ませます。eueアイロンは衣類スチーマーとして服をハンガーにかけたままシワ取りができて、アイロン台(スチームでプレス&ドライでプレス)を使用ことも可能、一台三役を果たすスチームアイロンです。
💨【3段階スチーム・多様生地対応】スチームアイロンは3段階スチーム量調節を搭載し、衣類のシワの状態や生地に合わせて3段階スチーム量が選べます。枕や布団、ソファー、カーテン、おもちゃ、各生地な衣類(綿・麻・絹・化学繊維など)や日常的に肌に触れる様々な布製品に嬉しい効果があります。さらに、NTC低水検知機能により、水量が不足すると欠水提示ランプが点灯します。
💨【大容量水タンク・便利デザイン】150mlの大容量タンクを搭載しており、頻繁な水補充の手間から解放され、一回の給水で約18分の連続使用を可能です。360°どこまで傾けても安定した連続スチーム、水漏れの心配なく簡単にしわを取ります。両方の先端が細くデザインで、服の襟や折り目をしっかりと押しつけることができ、ボタン周りのシワなど細かい箇所にアイロンがけするときに便利です。
💨【折畳み式・除菌脱臭】ハンドルは180°回転で折畳み式なので、小型で収納しやすく旅行や出張先にも持ち運べます。150℃高温スチームは強力な除臭と殺菌機能で敏感肌にも優しいケアを実現します。衣類に付いている生乾き臭や汗臭、タバコ臭、飲食臭、ペット臭、菌、花粉、汚れ、ダニが増える梅雨時期には特に重宝します。お客様や御家族の健康的な生活を送りたいと考えている人にとって最適な選択です!
💨【1年品質保証・パッケージ内容】1年保証期間内にアイロンの使用に問題がございましたら、確認後迅速に対応させていただきます。新品の交換、返金、使用指導などのサービスをご用意しております。アイロン スチーム本体×1、防熱スタンド×1、計量カップ×1、取扱説明書×1。⚠️ご注意:すべての商品は工場出荷前に注水検査を行っていますので、タンクに水が残っている場合がございますが、中古品などではございませんのでご安心下さい。
Amazonで見る