本ページには広告が含まれています。

Excel VBA Val関数 文字列の数字を数値に変換する

Excel VBA Val関数 文字列の数字を数値に変換する

Excel VBAの「Val関数」について解説します。

スポンサーリンク

Val関数とは

Excel VBA の Val関数とは、引数の文字列から、数値として認識できるデータを返す関数です。

Val関数(Visual Basic for Applications リファレンス)

構文(引数と戻り値)

Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。

構文

Val(string)

引数と戻り値

Val 関数の引数と戻り値は次のとおりです。

引数(string)【必須】任意の文字列式を指定します。
戻り値文字列内の数値と認識できる部分を数値データで返します。
※ 戻り値の詳細は次項の解説を参照願います。

解説

Val 関数は、次のように動作します。

  • 引数の文字列を先頭から評価します。
  • 空白、タブ、および改行文字は無視されます。
  • 先頭が変換できない文字のときは 0 を返します。
  • 先頭の正記号 ( + ) は無視され、負記号 (  ) は認識されます。
  • 先頭以外の正負記号 ( + )(  ) は認識されません。
  • 全角文字の数字は文字列として認識され、数値とは認識されません。
  • 数値認識のあと、数値と認識できない文字の出現で読み取りを中止します。
  • ピリオド ( . ) のみを有効な小数点として認識します。
  • 金額の記号 ( \ )( $ ) や「コンマ ( , )」などは数値の一部とは認識されません。
  • &O (8進数) と &H (16進数) の値を認識して 10進数 に変換します。
  • データ型サフィックス文字 ( ! )( @ )( # )( $ )( % )( & )( ^ ) も認識されませんが、変換前に非推奨のデータ型サフィックスを認識し、型の不一致エラーが発生する可能性があります。
    たとえば、Val(“50%”) は 50 に変換されますが、Val(“50.5%”) の%記号は整数型(Integer)の宣言と見なされるため、(50.5)が小数なので 実行時エラー’13’ を発生させます。同じ整数型の ( % )( & )( ^ ) でも同様にエラーとなります。

サフィックス型文字の一覧がこちらです。

サフィックス型文字型名データ型
%Integer整数型
&Long長整数型
^LongLong超長整数型
@Currency通貨型
!Single単精度浮動小数点型
#Double倍精度浮動小数点型
$String文字列型

使用例

次の例は、様々な引数の文字列をVal関数で数値に変換して表示します。

Sub Val_test()
Dim str As String

Debug.Print "空白,タブ,改行は無視される"
  str = "  12" & vbCrLf & "3 45 6" '123456
Debug.Print "Val(" & str & ")="; Val(str)
Debug.Print
Debug.Print "先頭が数値認識できない場合0を返す"
  str = "金額は123,456円です"     '0
Debug.Print "Val(" & str & ")="; Val(str)
Debug.Print
Debug.Print "先頭の(+)は無視(-)は認識されます"
  str = "+123456"                '123456
Debug.Print "Val(" & str & ")="; Val(str)
Debug.Print
Debug.Print "先頭以外の(+)(-)は認識されません"
  str = "-123+456"               '-123
Debug.Print "Val(" & str & ")="; Val(str)
Debug.Print
Debug.Print "全角文字の数字は認識されません"
  str = "123456"            '0
Debug.Print "Val(" & str & ")="; Val(str)
Debug.Print
Debug.Print "ピリオド(.)は小数点として認識します"
  str = "123456.789"             '123456.789
Debug.Print "Val(" & str & ")="; Val(str)
Debug.Print
Debug.Print "(\)($)コンマ(,)は認識されません"
  str = "123,456"                '123
Debug.Print "Val(" & str & ")="; Val(str)
  str = "\123,456"               '0
Debug.Print "Val(" & str & ")="; Val(str)
  str = "$123,456"               '0
Debug.Print "Val(" & str & ")="; Val(str)
Debug.Print
Debug.Print "&O(8進数)と&H(16進数)を認識して変換します"
  str = "&010"                   '8
Debug.Print "Val(" & str & ")="; Val(str)
  str = "&HFFF"                  '4059
Debug.Print "Val(" & str & ")="; Val(str)
Debug.Print
Debug.Print "小数に整数宣言の(%)(&)(^)は実行時エラー"
  str = "50%"                    '50
Debug.Print "Val(" & str & ")="; Val(str)
  str = "50.2%"                  '型が一致しません
Debug.Print "Val(" & str & ")="; Val(str)

End Sub

結果の Debug.Print で元の文字列を一緒に表示するようにしています。

実行結果は次のとおりです。46行目で「実行時エラー」が発生し中断されます。

Val関数テストコードの実行時にエラーでストップしている画像

解説のとおり、非推奨のデータ型サフィックスを認識し「実行時エラー’13’」が発生しました。

おわりに

Excel VBA「Val関数」で文字列から数値部分だけを抜き出して変換する方法を解説しました。

Val関数の特性は、の文字列を左から見ていって数値に変換できるところまでを変換してくれるというものです。ただし、除去される文字部分に数値が存在していても無視されてしまします。文字列途中に存在する数値は抽出できないのも特徴のひとつです。

残念ながら、文字列内の数値をすべて抽出する関数はありません。実現したい場合は、文字列を左から1文字ずつチェックして数値だけを取り出す。または、数値以外をReplace関数で削除するなどのようにする必要があります。

今度、時間ができたら「文字列内の数値をすべて抽出する関数」を別途掲載するようにしたいと思います。

解説は以上です。少しでもみなさまのお役に立てたなら幸いです(^^;

関数一覧はこちらです。

スポンサーリンク

VBAサンプルファイルはダウンロードできます

このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。

ダウンロードページへトップリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!