文字列の抽出と計算 3.VBA:文字数の規則性 ⑦
はじめに
前回は「繰り返し処理」の際、マクロを行数の増減に追従させることで、より「強い」マクロにしてみました。
今回も、前回の内容をさらに改良してみましょう。
今回のテーマ
前回と同じテーマです。
一つのセルに、3桁の数字が3つあります。これらは、半角スペースで区切られています。この数字について、真ん中のグループの和を求めてみましょう。
結果だけ取得する
今までは、まず中央のグループを隣のセルに書き出し、さらに合計を表示する方式でした。しかしもし途中経過が不要であれば、わざわざ書き出す必要はありません。
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
各値を書き出さなくなった分だけ処理速度は向上し、保存する際の容量も少なくて済みます。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
こんな感じのイメージです。
そして最後に、配列の中身を足し算します。記述は「Sum(配列)」と非常に単純なため、他の人が見ても分かり易いと思います。
おわりに
今回の方法に対する評価(私見)は、以下の通りです。
メリット :
- 途中経過を書き出さない分だけ、処理が速くなった。
デメリット:
- 途中経過が書き出されていないため、結果の根拠が分からない。
配列を用いた処理は、セルに都度書き出す方式と比べ非常に高速です。100行程度の処理でも、それを実感することがあります。
(おわり)