右から3番目の文字が小数点かどうか判定する【VBA】
「ある文字列の、右から3番目の文字が小数点かどうか」を判定する、VBAのコードを考えます。
• やりたいこと
たとえば、「11.00」という数字は、小数点以下は2桁です。「11.0」は、小数点以下は1桁です。
Excelでデータを処理するとき、小数点以下の桁数をそろえたい場合が想定されます。
今回おこないたいのは、「小数点以下が2桁かどうか判定する」ことです。つまり、「1.23」という数字であれば、右(または文字の末尾)から3文字の「.23」の部分をチェックします。そのような判定を行うVBAのコードを考えます。
• 前準備
B2セルに、"11.00" という文字列が入っているとします。(数値ではなく文字列にするには、「'11.00」というふうに、先頭にアポストロフィ(')を付けます。)
B2セルに"11.00" という文字列が入っていることを確認するVBAのコードを以下に示します。
Sub a()
buf = Range("B2")
MsgBox buf
End Sub
このコードを実行すると、以下のように、「11.00」と表示されます。
• 右から3番目の文字を取得する
"11.00" という文字列の右から3番目の文字を、VBAで取得することを考えます。
「右からn番目の1文字を取得する」という機能の関数が標準で用意されていれば、それを利用しますが、私が探した限りでは、そのような関数はありませんでした。そこで、Right()
と Left()
を利用して、「右から3番目の文字を取得する」ことを行います。具体的には、以下の流れとなります。
- Right で、一番右から3文字を取得する。
- Left で、その3文字の一番左の1文字を、取得する。
Rightで右から3文字を取得
"11.00" の、右から3文字を取得するコードを、以下に示します。
buf = Range("B2")
right3 = Right(buf, 3)
MsgBox right3
End Sub
このコードを実行すると、「.00」と表示されます。
Leftで左から1文字を取得
「.00」という文字列の左から1文字を取得するコードを、以下に示します。
buf = Range("B2")
right3 = Right(buf, 3)
left1 = Left(right3, 1)
MsgBox left1
End Sub
このコードを実行すると、「.」と表示されます。
上記のコードを応用して、「右から3番目が小数点でない場合にエラーメッセージを表示する」ことを考えます。以下に、コードを示します。
buf = Range("B2")
right3 = Right(buf, 3)
left1 = Left(right3, 1)
If left1 <> "." Then
 MsgBox "右から3番目が小数点ではありません。"
End If
End Sub
ここで、B2セルの文字列を、たとえば「11.0」に変更し、コードを実行すると、下図のように「右から3番目が小数点ではありません。」というメッセージが表示されます。
• 関数化する
「右から3番目が小数点なら True を、そうでないなら False を返す」という関数のコードを以下に示します。
[サンプルコード]Sub aa()
buf = Range("B2")
result = checkDecimalPoint(buf)
MsgBox result
End Sub
Function checkDecimalPoint(ByVal buf As String) As Boolean
right3 = Right(buf, 3)
left1 = Left(right3, 1)
result = False
If left1 = "." Then
 result = True
End If
checkDecimalPoint = result
End Function
B2セルが "11.00" のとき、Sub aa()
を実行すると、下図のように「True」と表示されます。
B2セルが「11.0」の場合は、「False」と表示されます。
• まとめ
「右から3番目の文字が小数点かどうか」を判定するために、Right() と Left() を利用して、「右から3文字目を取得する」というコードを書きました。
課題
#サンプルコードには、以下のような課題があります。
- 「11..0」のような、小数点が2つ以上の数字の文字列に True を返してしまう。
- 「a.aa」のような、数字以外の文字列にTrueを返してしまう。
上述の課題に対処するための方法として、以下のようなものがあげられます。
- 文字列の中の小数点の個数を数えて、1個以外の場合は False を返すようにする。
- 文字列の長さをチェックし、3文字未満の場合は False を返すようにする。
IsNumeric
などを利用し、データの型をチェックする。