文字列の抽出と計算 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
    Cells(iMax + 1, 2).Value = 0

    For i = 2 To iMax
        Cells(iMax + 1, 2).Value = Cells(iMax + 1, 2).Value + _
                              Split(Cells(i, 1), " ")(1)
    Next
    
End Sub

しかし前回とは逆に、分割した全てを残しておきたい場合もあります。そのようなときは、今回のケースであれば、データを二次配列に格納すると良いでしょう。
※配列を3つ用意しても構いません。

Sub myCalc()

    Dim i As Long
    Dim iMax As Long
    Dim splitResult() As Variant

    iMax = Cells(2, 1).End(xlDown).Row - 1
    Cells(iMax + 1, 2) = 0
    
    ReDim splitResult(2 To iMax, 1 To 3)

    For i = 2 To iMax
        splitResult(i, 1) = Split(Cells(i, 1))(0)
        splitResult(i, 2) = Split(Cells(i, 1))(1)
        splitResult(i, 3) = Split(Cells(i, 1))(2)
        Cells(iMax + 1, 2) = Cells(iMax + 1, 2) + splitResult(i, 2)
    Next
    
End Sub

今回の配列と前回の配列、それぞれアパートに例えると、こんな感じです。

前回までの(一次)配列 :1階建ての平屋で、部屋数が3つ
今回から登場した二次配列:3階建てで、各階に3部屋(3×3=9部屋)

最初の配列は、「部屋数」の情報一つだけだったので一次配列。
今回の配列は、「部屋数」と「階数」で二つ情報が必要なので二次配列。
では三次の配列は、例えば
「第5棟の4階の3号室」
みたいな感じでしょうか。必要に応じてさらに増やすことも可能ですが、もともとシートの構造が(行,列)の二次構造なので、配列も一次または二次までが使い易いと思います(私見)。
なお、各配列に格納したデータをどう使用するかは、その時々の状況次第です。

また、For ~ Next ループ(繰り返し処理)の中身を、さらにFor ~ Next ループにすることも可能です。

Sub myCalc()

    Dim i As Long
    Dim j As Long
    Dim iMax As Long
    Dim splitResult() As Variant

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

' 二次配列を再宣言
    ReDim splitResult(2 To iMax, 1 To 3)

    For i = 2 To iMax
        For j = 1 To 3
            splitResult(i, j) = Split(Cells(i, 1))(j - 1)
        Next j
        Cells(iMax + 1, 2) = Cells(iMax + 1, 2) + splitResult(i, 2)
    Next
    
End Sub

この手法は、「入れ子」または「ネスト」と呼ばれ、一般的に用いられています。
参考までに、上記では列番号を変化させるために、新たな変数 j を設けています。Split 関数の末尾にある()で j - 1 としたのは、
 SplitResult ⇒ 1,2,3
 Splitの結果 ⇒ 0,1,2
のように一つずれているためです。このようなずれを嫌う場合、変数宣言の際に揃えておくこともできます。ただし、セルに「0列目」は存在しないため、エラーにならないよう注意が必要です。

おわりに

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

メリット :

  • 情報を全て配列に格納しているので、「最初のグループも使用したい」などの変更に対応しやすくなる。

デメリット:

  • 使わないものまで格納している。ただしこれを無駄と感じるか否かは、状況と受け手による。

最近は使用/不使用に関係なく、まず全ての情報を取り込んでしまう手法を、個人的に好んで用いています。ただし、時代と共に知識と好みは変化するので、それは「今だけ」かもしれません。

(おわり)