数値比較がうまくいかない場合

VBAプログラミング

プログラムの中で、よくIf文を使って、数値を比較して、その結果によって処理を変えるようなことがあるけど、文字列として比較してしまうと、正しい結果が出ないことがあるよ。

例えば、下のように実験してみると、数値で100は20より大きいは正しく判定されるけど、文字列(ダブルクォーテーションで囲ってあると文字列)で100と20を比較すると、100は20より大きいはずなのに、正しく判定してくれない。

特にセルの値を比較するときに、気づかないうちに文字列として値を拾ってしまうことがあるので、要注意!

Excelでよくあるのが、数値のところに形式を文字列として入力してあったり、どこかからコピペしてあったりして、下記みたいになってる場合。この場合はプログラムで読み込むと文字列になってるよ。

Clng関数で文字列を数値に変換。

そういう場合は、CLngという関数で、文字列を整数(小数点以下を含まない)に変換してから比較しよう。

さっきの例で、文字列を比較していたところに、下のようにCLngで囲って、比較してみよう。そうすると、数値として認識してくれるから、正しく数値比較が行われるよ。

もし小数点を含む数値を比較するときは、CLngではなくて、CDblで囲ってね。

CLngだと小数点以下は切り捨てられてしまうから、例えば1.01と1.02を比較した場合、例えば下記みたいにやると、正しく判定してくれないから気を付けて!

数値変換するときの注意点

CLng関数やそのほかの数値に変換する関数は、数以外の文字、記号、空白などを変換しようとするとエラーになるよ。

CLng関数で変換を掛ける値が必ず数になっているのならいいけど、もしそれ以外が含まれる可能性がある場合は、まずはそれが数なのかチェックを行って、数だった場合はClng関数で数値へ変換するようにしよう。

数値チェックを行う変数はisnumeric関数だよ。数値だったらTrueを返すよ。

下記のようにチェックを入れて、Trueだったら数値変換するようにしよう。

Sub ConvertNumber()

    Dim RowCount As Integer
    
    '2行目から4行目までループ
    For RowCount = 2 To 4
    
        '1列目と2列目が数値かどうかチェック
        If IsNumeric(Cells(RowCount, 1)) = True And _
           IsNumeric(Cells(RowCount, 2)) = True Then
            
            '数値で比較
            If CLng(Cells(RowCount, 1)) > CLng(Cells(RowCount, 2)) Then
                MsgBox (RowCount & "行目は1列目のほうが大きい数値です。")
            End If
        
        End If
    
    Next

End Sub

もしよくわからないようだったら、下記のお問い合わせフォームに質問してね。

ご質問・ご相談はこちらから

コメント

タイトルとURLをコピーしました