新創刊!
▼[無料]メルマガの登録
「エクセルVBA技術通信」
マガジンID:0000252815
Powered by

|
|
|
■高速化ランキング【第5位】
では、さっそく今回は高速化ランキングの続き、第5位の発表です。
--------------------------------------------------------------------
【今日のテーマ】 時間の掛かる不要行の削除を高速化する簡単テクニック
--------------------------------------------------------------------
エクセルでデータの加工や集計などをやっていると、どうしても不要な行と
いうものがあいだ間に出てきます。
私が依頼をうけて診断したVBAシステムの中でも、
「このマクロ処理、妙に時間かかってるなぁ〜」
と思ったら、データ処理をしながらそういった要らない行を見つける度に行
削除しにいっていた。といった例は実に多いです。
不要なデータをその行ごと削除するというのは、結構時間が掛かってしまう
処理の一つです。
そこで、簡単なプログラム例を挙げますと、
下記のサンプル1では、仮にA列にデータが無かったら不要なデータという
ことで判断してそのデータ行を行削除する。といった簡単な処理プログラム
の例です。(B列には必ずデータが入っているものとします。)
サンプル1
―――――――――――――――――――――――――+
Application.ScreenUpdating = False
i = 1
Do While Range("B" & i).Value <> ""
a = Trim(ActiveCell.Value)
If Range("A" & i).Value = "" Then
Rows(i).Delete Shift:=xlUp
Else
i = i + 1
End If
Loop
―――――――――――――――――――――――――+
今回のベンチマークでは、2万行のデータのうち8千行が不要データであると
いうテストデータを用いて実測を行なってみました。
サンプル1の測定結果は、34秒でした。
(テスト時間節約のため、ご覧の様に1行目に画面更新の非表示を入れた上
での結果です。)
このサンプルの様に、その他のことは一切していなくても行削除だけで30秒
以上も掛かるという結果になります。
通常は、このループ処理の中で他に色々なデータ加工処理が加わることが多
いと思いますが、私の経験では、たかだか1万行程度の処理で10分以上反応
なく待たされるプログラムというのを何本も見てきました。
で、これを高速化するために、下記のサンプル2のような方法を用います。
サンプル2
―――――――――――――――――――――――――+
n = Cells(Rows.Count, "A").End(xlUp).Row
Cells.Select
Selection.AutoFilter
Selection.AutoFilter Field:=1, Criteria1:="<>"
Rows("1:" & n).Select
Selection.Copy
Sheets.Add
Rows("1:1").Select
ActiveSheet.Paste
Range("A1").Select
Application.CutCopyMode = False
―――――――――――――――――――――――――+
サンプル2の結果では、1.3秒です。
30秒以上掛かっていた処理がわずか1秒少々に短縮できたことになります。
このサンプル2では、処理時間の掛かる行削除は行なわずにエクセルのオー
トフィルタ機能を使って必要行のみ(この場合は「空白以外のセル」のみ)
を抽出した上で、それを新しい別のシートにコピーするといった方法を用い
ています。
この方法なら、不要な行を一瞬で排除した形の同じデータシートを簡単かつ
一瞬で作る事ができます。
ちなみにこれは、データの並び替え機能を使っても似たようなことはできる
と思いますが、並び替えを使った場合、場合によってはデータの順番が変わ
ってしまう危険性もありますので、オートフィルタを使った方が安全です。
(同時にデータソートもしたいという場合には逆に好都合ですが。。。)
今回はこれで終了です。
----------【サンプルテストの実行環境】----------
PCスペック:Pentium4 1.8GHz
OS :Windows XP
Excel :Microsoft Excel2003 or 2002
----------------- r(-●_●-) -----------------
|
▼エクセルVBA技術通信(メルマガ)の登録/解除はこちら((無料))
「エクセルVBA技術通信」 (まぐまぐマガジンID:0000252815)
|
|
|