[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『処理が遅い原因について』(はりー)
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.