【VBA講座】プログラムの実行速度が27倍早くなる配列の知識解説


VBA
投稿日:
【VBA講座】プログラムの実行速度が27倍早くなる配列の知識解説
Tag: VBA

今回はVBAの高速化という点で重要な『配列』について解説していきます。

ここでは、細かい配列の話は抜きにして「こうやったら使える!」という実践的な話をしていきますね。

今回行う内容

今回VBAで実行するのは、商品価格がA列にあって、

  • 商品価格10%で消費税を計算
  • 商品価格と消費税を足した合計を出す

この2つをやっていきたいと思います。

Excelは、こんな感じですね。

※画像クリックで拡大

手動であれば、A列に対して0.1をかけて消費税を計算。

計算した消費税と商品価格を足して合計を出すという形ですね。

これをVBAで組んでいきたいと思います。

配列を使わないプログラム

比較のために、まずは配列を使わないプログラムになります。

コード: vba
Sub calcTaxAndSum()
    Dim i As Long
    Dim itemPrice As Long
    Dim tax As Long
    Dim totalPrice As Long

    Range("B2", "C100001") = ""
    For i = 2 To 100001
        itemPrice = Cells(i, 1)
        tax = itemPrice * 0.1
        totalPrice = itemPrice + tax

        Cells(i, 2) = tax
        Cells(i, 3) = totalPrice
    Next i
End Sub

for文で2行目から100001行目まで繰り返して、都度セルに値を入力しています。

10万行の処理になっているので、これを実行すると

15~20秒

という時間が実行にかかります。

配列を使って高速化

というので、これでは遅すぎるので配列を使って高速化していきたいと思います。

コードはこちらです。

コード: vba
Sub calcTaxAndSumUseArray()

    Dim i As Long
    Dim itemPrice As Long
    Dim tax As Long
    Dim totalPrice As Long
    Dim inputArray As Variant
    Dim arrayRow As Long

    arrayRow = 1
    Range("B2", "C100001") = ""

    inputArray = Range("B2", "C100001")

    For i = 2 To 100001
        itemPrice = Cells(i, 1)
        tax = itemPrice * 0.1
        totalPrice = itemPrice + tax

        inputArray(arrayRow, 1) = tax
        inputArray(arrayRow, 2) = totalPrice
    arrayRow = arrayRow + 1
    Next i

    Range("B2", "C100001") = inputArray
End Sub

配列を使わない時には、for文で繰り返した処理の中にCellsを使ってセルに値を入力していました。

その部分を今回は配列値を入力して、最後に一度だけセルに値を入力という処理にしています。

実際これだけで10万行の処理は

0.52秒

という感じで30倍近い速度が出せるようになっています。

配列の使い方

使い方としては、

  • Variant型で変数を宣言(vとする)
  • 最終的に入力したいセルに入って値を消す
  • そのセルを宣言した変数に入れる
  • 二次元配列になっているので【v(1,1)=値】の様に値を入れる
  • 最後まで値を入れ終わったら入力したいセルの範囲に配列を入力する

具体的にコードで書いていくと

コード: vba-array
Sub arrayTest()
    Dim v As Variant

    Range("A1", "B100") = ""
    v = Range("A1", "B100")

    ' for文などの繰り返し処理で値を入力することが多い。
    v(1, 1) = 100
    v(1, 2) = 200
    v(2, 1) = 300
    v(2, 3) = 400

    ' 配列に入れた値をセルに入力
    Range("A1", "B100") = v
End Sub

こういった感じですね。

ちなみにv(1, 1)の部分を変数にして、繰り返し処理の中で使うのがかなり多いです。

ということで、簡単にですがVBAで配列を使って高速化する方法について解説しました。

最初のうちは慣れないと配列は難しいのですが、今回のように

セルの範囲を指定してを配列にする

この形でやるとかなり理解しやすいかと思います。

もしこれで配列が分かるようになってきたら、一次元配列なんかも使っていくとプログラミングの幅が広がります。

ただこの方法だけでも、かなり処理速度が速くなるので試してみてくださいね。

質問はこちら
もし今回のことやプログラミングについて分からないことがあれば、回答していくので、気軽に以下から聞いてくださいね。
> 質問募集中です!

※頂いた質問は動画コンテンツとして回答していく予定です。



All Categories

Advertisement