文字列の抽出と計算 3.VBA:文字数の規則性 ⑦

はじめに

前回は「繰り返し処理」の際、マクロを行数の増減に追従させることで、より「強い」マクロにしてみました。

infoment.hatenablog.com

今回も、前回の内容をさらに改良してみましょう。

今回のテーマ

前回と同じテーマです。
一つのセルに、3桁の数字が3つあります。これらは、半角スペースで区切られています。この数字について、真ん中のグループの和を求めてみましょう。
f:id:Infoment:20180619063141p:plain


結果だけ取得する

今までは、まず中央のグループを隣のセルに書き出し、さらに合計を表示する方式でした。しかしもし途中経過が不要であれば、わざわざ書き出す必要はありません。
 

Sub myCalc()

    Dim i As Long
    Dim iMax As Long

    iMax = Cells(2, 1).End(xlDown).Row - 1

    For i = 2 To iMax
        Cells(5, 2).Value = Cells(5, 2).Value + _
                                     Mid(Cells(i, 1).Value, 5, 3)
    Next
    
End Sub

 
f:id:Infoment:20180624114555p:plain

各値を書き出さなくなった分だけ処理速度は向上し、保存する際の容量も少なくて済みます。3行程度の場合、なかなか実感することはできませんが。

配列に格納する

一つずつの結果を書き出す必要はないが、後で使うかもしれない。そんな時は一旦、配列に格納しておくという方法があります。配列とは、データを入れておく箱のようなものです。箱の一つ一つに番号が振られていて、箱の名前と番号を指定することで、目的のデータを出し入れします。
まず、コードを次のように修正してみましょう。

Sub myCalc()

    Dim i As Long
    Dim iMax As Long
    Dim seq() As Long

    iMax = Cells(2, 1).End(xlDown).Row - 1
    ReDim seq(2 To iMax)

    For i = 2 To iMax
        seq(i) = Mid(Cells(i, 1).Value, 5, 3)
    Next
    
    Cells(iMax + 1, 2).Value = WorksheetFunction.Sum(seq)
    
End Sub

今回、新たな変数 seq() を設けました。本ブログでは配列の意味で使うことにしますが、基本的に命名は作成者の自由です。
seq() の () は、この変数が配列であることを示しています。() の中に何もないのは、未だ箱の数が決まっていないからです。箱の数は、行の最大値(iMax)が分かって初めて決めることができます。
参考までに、最初から箱の数が決まっている場合、

Dim seq(3) as Long

のように、箱の数込みで宣言することも可能です。
 

 iMax = Cells(2, 1).End(xlDown).Row - 1

これで最大処理行番号が確定しましたので、箱の大きさを配列に教えてあげましょう。
 

 ReDim seq(2 To iMax)

Re は、繰り返しを表す英単語に付くことが多いですね。ReDim は、変数の再宣言ということになります。これで、
 seq(2), seq(3), ・・・, seq(iMax-1), seq(iMax)
といった具合で、2~iMax 番目までの箱が準備されました。
※この時点で、箱の中身は未だ空っぽです。
※指定しなければ、一番最初の箱は「0番」になります。

次に、For ~ Next ループの繰り返し処理を用いて、各箱(配列)に値を入れていきます。

    For i = 2 To iMax
        seq(i) = Mid(Cells(i, 1).Value, 5, 3)
    Next

こんな感じのイメージです。

f:id:Infoment:20180624143436g:plain

そして最後に、配列の中身を足し算します。記述は「Sum(配列)」と非常に単純なため、他の人が見ても分かり易いと思います。

おわりに

今回の方法に対する評価(私見)は、以下の通りです。

メリット :

  • 途中経過を書き出さない分だけ、処理が速くなった。

デメリット:

  • 途中経過が書き出されていないため、結果の根拠が分からない。

配列を用いた処理は、セルに都度書き出す方式と比べ非常に高速です。100行程度の処理でも、それを実感することがあります。

(おわり)