なぜ配列を使うのか?配列を使うと100倍の速さで終了 105回

なぜ配列を使うのか?配列を使うと100の速さで終了

マクロ講座 動画編 105回
マクロ講座

動画でExcel なぜ配列を使うのか?配列を使うと100の速さで終了

なぜ配列を使うのか?配列を使うと100の速さで終了

動画版「マクロ講座105回」です。
わざわざなぜ配列を使うのか?配列にするメリットは何と思うかもしれません。配列は取得も簡単で、さらに利点として処理が爆速になると言うことです。 その例を今回お見せします。 こちらは私の動画によく登場する名簿形式のデータです。お名前があり住所氏名がありといった形になっています。 このデータから例えば、女性で生年月日が1985年以降の生まれの方を抽出して化粧品のダイレクトメールを送りたいなどと言うケースがあったとします。 その一覧を書き出す速度について調べてみましょう。処理時間を計算計測するためにVBAマクロのタイマー関数を使います。 タイマー関数は0時からの経過時間を平数で返してくれる関数です。処理の経過時間を計測するときに使うと便利です。
(サンプルファイルは、こちらです。 なぜ配列を使うのか?配列を使うと100の速さで終了、サンプル105回

マクロ動画 なぜ配列を使うのか?配列を使うと100の速さで終了

なぜ配列を勉強するのかという疑問

1. わざわざ配列を使わなくても、マクロを使えば十分に高速で処理はできます。
配列を使わない場合と配列を使う場合とどこが違うかといったらそのスピードです。


namae1

2. 1万件2万件あるいはもっともっとデータ量が多いなどというケースでは、処理速度が圧倒的に変わってしまいます。
住所録のような、こういったデータベースがあったとします。このサンプルは2万件です。2万件のリストの中から新商品の案内をお客様に送りたい。


namae2

3. 全部に送ったらダイレクトメールだったら費用がかかりすぎますよね。今回は2万件のデータの中から性別とそれから生年月日などで絞り込みます。


namae3

4. 処理の時間を計測するのでタイマー関数を中で使います。タイマー関数というのは引数はない関数です。 経過した秒数を取得するというもので、午前0時からその時までに経過した秒数を取得する関数です。


namae4

5. そしてこのデータベースを配列に入れてしまうので、配列は2次元配列です。
セル範囲ごっそり配列に入れます。A1セルのカレントリージョンでそっくり範囲を取得できます。


namae5

配列を使った場合の処理時間を計測する

6.変数を決める
スタートタイムとそれからストップタイム、Dim starttime As Single, stoptime As Single
配列として、Dim allmydataArr As Variant
取得した配列として、Dim pickedDataArr(1 To 20000, 1 To 8) As Variant

取得した配列のサイズは、元の配列のデータと同じです。この辺は箱が大きくても足りないよりはマシということでおおらかに考えます。


namae6

7. コードは以下のようになります。

Sub タイム測定Arrayでフィルタ()
    Dim starttime As Single, stoptime As Single
    starttime = Timer
    Dim allmydataArr As Variant
    allmydataArr = Range("A1").CurrentRegion.Value
    
    Dim pickedDataArr(1 To 20000, 1 To 8) As Variant
    Dim Specifieddate As Date: Specifieddate = "1990/1/1"
    Dim i As Long, j As Long
    Dim hitdata As Long: hitdata = 0
    
        For i = LBound(allmydataArr, 1) To UBound(allmydataArr, 1)
             If allmydataArr(i, 4) = "女" And allmydataArr(i, 8) >= Specifieddate Then
             hitdata = hitdata + 1
                For j = 1 To 8
                    pickedDataArr(hitdata, j) = allmydataArr(i, j)
                Next j
            End If
        Next
    Range("M2:T" & hitdata) = pickedDataArr
    stoptime = Timer
    MsgBox hitdata & "件該当ありました。" & vbCrLf & Round(stoptime - starttime, 2)
    
End Sub

8. 抽出に要した時間は0.21秒でした。


namae8

9. では、配列を使わない場合には、処理時間はどのくらいかかるのでしょうか?
次回は配列を使わない場合のコードと、今回のコードの解説をします。