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

はじめに

前回は Range の代わりに Cells でセルを指定する方法を紹介しました。

infoment.hatenablog.com

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

今回のテーマ

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


繰り返し処理

今までの例では、セルを一つずつ処理する方法を用いていました。
 

Sub myCalc()

    Cells(2, 2).Value = Mid(Cells(2, 1).Value, 5, 3)
    Cells(3, 2).Value = Mid(Cells(3, 1).Value, 5, 3)
    Cells(4, 2).Value = Mid(Cells(4, 1).Value, 5, 3)
    
    Cells(5, 2).Value = Cells(2, 2).Value + Cells(3, 2).Value + Cells(4, 2).Value

End Sub

 
データが3行の場合は、同じような数式を3回書いても、大した手間ではありません。
しかしこれが100行、1000行もある場合はどうでしょうか。

  • コード作成に時間がかかる。
  • 書き間違いが生じる。
  • 何か修正があった場合、行数分の修正作業が必要になる。

などの理由から、マクロで処理するメリットは皆無と言ってよいでしょう。

そこで、このような場合の有効な処理の一つである、繰り返し処理を用いてみます。
繰り返し処理とは、以下の条件のもと、同じことを繰り返す処理を言います。

  • 決められた回数に達するまで
  • 決められた条件を満たすまで
  • 決められた条件を満たさなくなるまで

決められた回数に達する前に、決められた条件を満たした場合、その時点で繰り返しを
終えることも可能です。

VBAに限ったことではありませんが、条件分岐と繰り返しの二つを覚えれば、様ざまな
処理を行えるようになります。

それではまず、繰り返し処理を用いたコードを見てみましょう。
 

Sub myCalc()

    Dim i As Long

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

 
Dim i As Long とは、以下の内容を意味しています。

  1. これから、「i」という名前の変数を使用します(と宣言しています)。
  2. i という変数の「型」は、「長整数型」です(「あ」などの文字や日付などは入りません)。

変数とは、様々な数値や文字などを一時的に入れるための箱、のようなものです。
ある規則に従って値が変化する場合、変数で表すと大変便利なので、これを利用する場合が
非常に多いです。中学の数学で習った「一次関数」の式

 y = ax + b

などと同じですね。

For と Next の間にあるのが、繰り返し処理される内容です。i = 2 To 4 と書かれている
ので、i は 2 から 4 まで 1つずつ増えていきます。具体的には、以下の処理を行います。

Cells(2, 2).Value = Mid(Cells(2, 1).Value, 5, 3)
Cells(5, 2).Value = Cells(5, 2).Value + Cells(2, 2).Value
Cells(3, 2).Value = Mid(Cells(3, 1).Value, 5, 3)
Cells(5, 2).Value = Cells(5, 2).Value + Cells(3, 2).Value
Cells(4, 2).Value = Mid(Cells(4, 1).Value, 5, 3)
Cells(5, 2).Value = Cells(5, 2).Value + Cells(4, 2).Value

2 から 4 まで変化する部分以外は、全て同じです。同じことを何度も書くのは大変
なので、変わるところ(=行番号)だけ変数にして、変わる範囲(2~4)を指定
したわけです。
 
f:id:Infoment:20180623210528p:plain

おわりに

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

メリット :

  • 処理行数に関係なく、ほぼ同じコードで処理できるようになった。

デメリット:

  • 開始行や終了行が変わってしまうと、正しく処理できない。

処理行数が3行でも100万行でも、マクロの行数は同じです。これは、大きな改善と
言えます。

(おわり)