文字列の抽出と計算 3.VBA:半角スペースの利用 ⑤

はじめに

前回は途中に空白行があっても、対応できるようにしました。

infoment.hatenablog.com

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

今回のテーマ

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


文字列の分割と文字種の判別

空白で区切られているけれど、数字ではないものが含まれている場合はどうでしょうか。これも前回同様、On Error Resume Next で無視すれば良いでしょうか。

↓前回のコード↓

Sub myCalc()

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

' 最終行番号の取得
    iMax = Cells(Rows.Count, 1).End(xlUp).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
        
        ' エラーがあっても無視して処理を続ける
            On Error Resume Next
            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

何でもかんでも「無視する」というのは、少し乱暴な気もします。では、↓のようなケースでは、どのような対処が良いでしょうか。

f:id:Infoment:20180626215345p:plain

勿論、エラーが起きた場合の対処を考えるのは大事なことです。しかし、起こりうるエラーを想定し、最初から準備しておくこともまた、とても大事なことです。
そこで今回は、以下のように修正してみましょう。

Sub myCalc()

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

' 最終行番号の取得
    iMax = Cells(Rows.Count, 1).End(xlUp).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
        ' エラーがあっても、処理を続ける
            On Error Resume Next
            splitResult(i, j) = Split(Cells(i, 1))(j - 1)
        Next j
        If IsNumeric(splitResult(i, 2)) = True Then
            Cells(iMax + 1, 2) = Cells(iMax + 1, 2) + splitResult(i, 2)
        End If
    Next
    
End Sub

修正したのは、この個所です。

        If IsNumeric(splitResult(i, 2)) = True Then
            Cells(iMax + 1, 2) = Cells(iMax + 1, 2) + splitResult(i, 2)
        End If

今回は新しく、2つの内容が登場しました。
一つ目は、IsNumeric です。IsNumeric(値)のように使用します。値が数字であれば True(=真) が、、数字以外であれば False(=偽) が返ってきます。このような感じです。

  1. IsNumeric(1) ⇒ True (※「1」は数字なので、True)
  2. IsNumeric(a) ⇒ False  (※「a」は文字なので、False)

splitResult に格納された値が数値(つまり足し算できる)か否かの判断に使用します。

もう一つは、If です。ワークシート関数でも頻繁に使用されるため、馴染み深い方も多いと思います。

If 条件 Then
 処理 1
Else
 処理 2
End If

のように使用します。条件に一致する場合「処理 1 」を行い、それ以外(Else)の場合、「処理 2 」を行います。

今回は、「もし数字なら足し算しなさい」という条件で処理しています。繰り返しになりますが、エラーを無視するというのは、エラーの原因を確認しない、やや乱暴な処理です。もし事前に確認できるのであれば、この手法をお勧めします。

おわりに

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

メリット :

  • 途中に数値以外の文字があっても、事前に数値か否かを判別できるため、エラーが起きにくい。

デメリット:

  • 想定外のエラーが発生した場合、処理が止まってしまう。

空白行ではないか?足し算に使用できる情報か?などなど、事前に、可能な限り「起こりうる例外」を洗い出す必要があります(マクロに限らず、多くの事柄に当てはまると思います)。

(おわり)