1. 導入:なぜVal関数が必要なのか
実務でExcel VBAを扱っていると、外部システムから出力されたCSVファイルや、ユーザーが入力したセルから値を取得する場面が多々あります。その際、数値のはずが「100円」や「No.123」といった文字列として扱われてしまい、計算しようとすると「型不一致」エラーが発生して困った経験はありませんか?
このような「文字列の中に混ざった数値を抽出して計算に使いたい」という課題を解決するのが、VBAのVal関数です。文字列の先頭から数値とみなせる部分だけを素早く抜き出せるため、データクレンジングの現場で非常に重宝します。
2. 基礎知識:Val関数とは
Val関数は、引数に指定した文字列の先頭から順に読み込み、数値として認識できる文字が現れた時点で抽出を開始し、数値として認識できなくなった文字が出現した時点で抽出を停止する関数です。
重要なポイント:
・数値として認識されるのは、半角数字、小数点(.)、および16進数(&H)や8進数(&O)の接頭辞のみです。
・カンマ(,)や円記号(¥)は数値の一部とはみなされず、そこで抽出がストップします。
・全角数字は「数値」として認識されません。ここが初心者の方が最も間違いやすいポイントです。
3. 実装・解決策
実務での活用シーンとしては、例えば「金額」セルに「¥1,000」と入力されている場合、そのままでは計算できません。Val関数を使うことで、この文字列から「1000」という数値のみを取り出し、別のセルで計算に利用することが可能になります。
注意点として、Val関数は「先頭文字」から評価します。そのため、もし文字列の先頭が「A123」のように数値以外から始まる場合、戻り値は「0」になります。データの形式がバラバラな場合は、事前にMid関数やReplace関数で調整が必要なケースもあることを覚えておきましょう。
4. サンプルプログラム
以下のコードは、様々な形式の文字列からVal関数がどのように値を抽出するかを確認するためのものです。VBE(Visual Basic Editor)に貼り付けて実行してみてください。
Sub ValFunctionCheck()
‘ テスト用の文字列配列を定義
Dim testData(4) As String
Dim i As Long
testData(0) = “12345円” ‘ 数値で始まる場合
testData(1) = “¥5,000” ‘ 通貨記号で始まる場合
testData(2) = “No.999” ‘ 数値以外で始まる場合
testData(3) = “3.14159abc” ‘ 小数点を含む場合
testData(4) = “100万円” ‘ 全角数字の場合(注意!)
‘ 結果を出力
For i = LBound(testData) To UBound(testData)
Debug.Print “元データ: ” & testData(i) & _
” -> Val関数の結果: ” & Val(testData(i))
Next i
‘ イミディエイトウィンドウに結果が表示されます
MsgBox “イミディエイトウィンドウで結果を確認してください。”
End Sub
5. 応用・注意点
・全角数字の罠:
サンプルコードのtestData(4)のように、「100」をVal関数にかけても結果は「0」になります。現場のデータが全角で入力されている場合は、事前に StrConv関数 を使って半角に変換してからVal関数を適用する工夫が必要です。
(例:Val(StrConv(myStr, vbNarrow)))
・カンマの取り扱い:
「12,000」という文字列にVal関数を使うと、「12」までしか取得されません。これはカンマが数値の区切りとして認識され、抽出が中断されるためです。カンマが含まれる場合は、先に Replace(myStr, “,”, “”) でカンマを削除してから処理するようにしましょう。
これらを組み合わせることで、より堅牢なデータ処理マクロが作成できるようになります。ぜひ日々の業務で活用してみてください。
