文字列の抽出と計算 3.VBA:半角スペースの利用 ⑤
今回のテーマ
前回と同じテーマです。
一つのセルに、3桁の数字が3つあります。これらは、半角スペースで区切られています。この数字について、真ん中のグループの和を求めてみましょう。
文字列の分割と文字種の判別
空白で区切られているけれど、数字ではないものが含まれている場合はどうでしょうか。これも前回同様、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
何でもかんでも「無視する」というのは、少し乱暴な気もします。では、↓のようなケースでは、どのような対処が良いでしょうか。
勿論、エラーが起きた場合の対処を考えるのは大事なことです。しかし、起こりうるエラーを想定し、最初から準備しておくこともまた、とても大事なことです。
そこで今回は、以下のように修正してみましょう。
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(=偽) が返ってきます。このような感じです。
- IsNumeric(1) ⇒ True (※「1」は数字なので、True)
- IsNumeric(a) ⇒ False (※「a」は文字なので、False)
splitResult に格納された値が数値(つまり足し算できる)か否かの判断に使用します。
もう一つは、If です。ワークシート関数でも頻繁に使用されるため、馴染み深い方も多いと思います。
If 条件 Then
処理 1
Else
処理 2
End If
のように使用します。条件に一致する場合「処理 1 」を行い、それ以外(Else)の場合、「処理 2 」を行います。
今回は、「もし数字なら足し算しなさい」という条件で処理しています。繰り返しになりますが、エラーを無視するというのは、エラーの原因を確認しない、やや乱暴な処理です。もし事前に確認できるのであれば、この手法をお勧めします。
おわりに
今回の方法に対する評価(私見)は、以下の通りです。
メリット :
- 途中に数値以外の文字があっても、事前に数値か否かを判別できるため、エラーが起きにくい。
デメリット:
- 想定外のエラーが発生した場合、処理が止まってしまう。
空白行ではないか?足し算に使用できる情報か?などなど、事前に、可能な限り「起こりうる例外」を洗い出す必要があります(マクロに限らず、多くの事柄に当てはまると思います)。
(おわり)