文字列の抽出と計算 3.VBA:半角スペースの利用 ③
今回のテーマ
前回と同じテーマです。
一つのセルに、3桁の数字が3つあります。これらは、半角スペースで区切られています。この数字について、真ん中のグループの和を求めてみましょう。
文字列の分割と繰り返し処理の入れ子
前回は文字列を半角スペースで分割し、必要な個所だけを使用しました。
↓前回のコード↓
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列目」は存在しないため、エラーにならないよう注意が必要です。
おわりに
今回の方法に対する評価(私見)は、以下の通りです。
メリット :
- 情報を全て配列に格納しているので、「最初のグループも使用したい」などの変更に対応しやすくなる。
デメリット:
- 使わないものまで格納している。ただしこれを無駄と感じるか否かは、状況と受け手による。
最近は使用/不使用に関係なく、まず全ての情報を取り込んでしまう手法を、個人的に好んで用いています。ただし、時代と共に知識と好みは変化するので、それは「今だけ」かもしれません。
(おわり)