伊田生活ブログのロゴ
HOME  >  勉強
カテゴリー : 勉強 - プログラミング
•VBA •Excel •小数点以下 •事務作業効率化



公開日:

右から3番目の文字が小数点かどうか判定する【VBA】


img_4

「ある文字列の、右から3番目の文字が小数点かどうか」を判定する、VBAのコードを考えます。


たとえば、「11.00」という数字は、小数点以下は2桁です。「11.0」は、小数点以下は1桁です。

Excelでデータを処理するとき、小数点以下の桁数をそろえたい場合が想定されます。

今回おこないたいのは、「小数点以下が2桁かどうか判定する」ことです。つまり、「1.23」という数字であれば、右(または文字の末尾)から3文字の「.23」の部分をチェックします。そのような判定を行うVBAのコードを考えます。


B2セルに、"11.00" という文字列が入っているとします。(数値ではなく文字列にするには、「'11.00」というふうに、先頭にアポストロフィ(')を付けます。)

B2セルに11.00という文字が入っている。

[ 画像1. 11.00 ]

 

B2セルに"11.00" という文字列が入っていることを確認するVBAのコードを以下に示します。

'Option VBASupport 1

Sub a()

    buf = Range("B2")
    MsgBox buf

End Sub

このコードを実行すると、以下のように、「11.00」と表示されます。

image 2

[ 画像2. 11.00と表示された ]

 


"11.00" という文字列の右から3番目の文字を、VBAで取得することを考えます。

「右からn番目の1文字を取得する」という機能の関数が標準で用意されていれば、それを利用しますが、私が探した限りでは、そのような関数はありませんでした。そこで、Right()Left() を利用して、「右から3番目の文字を取得する」ことを行います。具体的には、以下の流れとなります。

  1. Right で、一番右から3文字を取得する。
  2. Left で、その3文字の一番左の1文字を、取得する。

"11.00" の、右から3文字を取得するコードを、以下に示します。

Sub test1()

    buf = Range("B2")
    right3 = Right(buf, 3)
    MsgBox right3

End Sub

このコードを実行すると、「.00」と表示されます。

「.00」という文字列の左から1文字を取得するコードを、以下に示します。

Sub test2()

    buf = Range("B2")
    right3 = Right(buf, 3)
    left1 = Left(right3, 1)
    MsgBox left1

End Sub

このコードを実行すると、「.」と表示されます。

上記のコードを応用して、「右から3番目が小数点でない場合にエラーメッセージを表示する」ことを考えます。以下に、コードを示します。

Sub test3()

    buf = Range("B2")
    right3 = Right(buf, 3)
    left1 = Left(right3, 1)
    
    If left1 <> "." Then
        MsgBox "右から3番目が小数点ではありません。"
    End If

End Sub

ここで、B2セルの文字列を、たとえば「11.0」に変更し、コードを実行すると、下図のように「右から3番目が小数点ではありません。」というメッセージが表示されます。

image 3

[ 画像3. エラーメッセージ ]

 


「右から3番目が小数点なら True を、そうでないなら False を返す」という関数のコードを以下に示します。

[サンプルコード]
'Option VBASupport 1

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」と表示されます。

image 4

[ 画像4. True ]

 

B2セルが「11.0」の場合は、「False」と表示されます。


「右から3番目の文字が小数点かどうか」を判定するために、Right() と Left() を利用して、「右から3文字目を取得する」というコードを書きました。

#サンプルコードには、以下のような課題があります。

  • 「11..0」のような、小数点が2つ以上の数字の文字列に True を返してしまう。
  • 「a.aa」のような、数字以外の文字列にTrueを返してしまう。
改善策

上述の課題に対処するための方法として、以下のようなものがあげられます。

  • 文字列の中の小数点の個数を数えて、1個以外の場合は False を返すようにする。
  • 文字列の長さをチェックし、3文字未満の場合は False を返すようにする。
  • IsNumeric などを利用し、データの型をチェックする。