エクセルVBAの技術向上マガジン

 
 
新創刊!

▼[無料]メルマガの登録
「エクセルVBA技術通信」
マガジンID:0000252815 
メールアドレス:

Powered by
まぐまぐ



発行者情報

メルマガの登録/解除

エクセルVBA開発事例

テクニカルライター

著者プロフィール

会社概要

TOP



高速化ランキング

エクセルVBAのシステムを高速化させるために効果的な技術・ノウハウのベスト5を発表していきます。

第1位 画面更新の非表示

第2位 CSVのシート取り込み

第3位 大量データのソート

第4位 セル指定の高速化

第5位 不要行の削除



使い易さランキング

エクセルVBAのシステムをより使い易くさせるため技術・ノウハウのベスト5を発表していきます。

・準備中です。



VBA入門講座

初心者向けのエクセルVBAが学べるサイトは、

こちら


 
■高速化ランキング【第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)
メールマガジン登録
メールアドレス:
メールマガジン解除
メールアドレス:


 
サイトのご利用にあたって  |  エクセルVBA事例  |  会社概要  |  個人情報の取扱い  |  お問い合わせ


Copyright © 2007 WAT CO.,LTD.
※弊社の許可無く無断で複製・複写・転載することは固くお断りします。