[[20170222154210]] 『処理が遅い原因について』(はりー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『処理が遅い原因について』(はりー)

VBA初心者になります。

シートをグループ化し、指定の見出し列を削除する
という、VBAを作成したのですが、
処理が完了するまで2分ほどかかってしまいます…

長くても40〜50秒に収まってほしいです。
どこがダメなのか分かりません。

削除よりも非表示の方が処理が早いという事であれば
非表示で対応しようと考え中です。

お力になって頂ける方、
よろしくおねがいします。

===================================================================

Sub ColumnDelete()

 Dim j As Long
 Dim sh As Worksheet

Application.ScreenUpdating = False

For Each sh In Sheets(Array(2, 3))

    sh.Select

    For j = Columns.Count To 1 Step -1

        Select Case Cells(1, j).Value '各列の1行目の値

        Case "ID", "重要度", "カテゴリー", "作成日", "更新日", "要約", "担当", "理由", "バージョン" '残したい値
'何もしない
        Case Else '上記以外

        Cells(1, j).EntireColumn.Delete

        End Select

    Next j

Next sh

Application.ScreenUpdating = True

MsgBox "削除完了"

End Sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 >    For j = Columns.Count To 1 Step -1

 これが問題なのでは?

 Columns.Count って 16,384 列もありますよ?

 へ変更
 ↓
 For j = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1

(半平太) 2017/02/22(水) 16:10


 半平太さんともろカブリですが、メモしましたので。

 いろいろ方法はありますが、対象シートは2シートぽっきりですよね。

 現状の構えのままでも、『元凶』を取り除けば、早くなるのでは。

 なにが『元凶』かというと、For j = Columns.Count To 1 Step -1 です。

 Columns.Countは 16384 !! ですから 16384 x 2 シート 分の判定をして、そのほとんどの
 空白の列を削除していることに気が付いていますか?

 やるなら For j = sh.Cells(Columns.Count, 1).End(xlToLeft).Column To 1 Step -1 とか。

 私ならシート内でループ処理をしないで、必要列を フィルターオプションで取り出します。
 これなら シート毎に 2〜3行のコードで瞬時に処理できますよ。

( β) 2017/02/22(水) 16:16


(半平太)様

変更したところ、1秒もかからないで処理できました!
早速のご回答でとても助かりました!
& 勉強になりました!

ありがとうございましたm(_ _)m
(はりー) 2017/02/22(水) 16:21


( β)様

ご回答感謝いたします!
仰っていた通り、空白の列を削除していることに気が付いていませんでした。
だから2分も処理がかかっていたのですね…大変勉強になりました!

ありがとうございました!!m(_ _)m
(はりー) 2017/02/22(水) 16:26


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.