VBA Val関数徹底攻略!「1,980円」を計算可能な数値に変換する現場の技
「せっかく入力したデータなのに、計算しようとするとエラーになる...」
そんな経験、ありませんか?特に、手入力の現場データでは「1,980円」や「50個」のように、数値の後に単位が付いていたり、大きな数値にはカンマが入っていたりすることがよくありますよね。
VBAでこれらのデータを数値として扱おうとすると、思い通りの結果が得られず、集計や分析作業がストップしてしまうことがあります。今回は、VBAの基本関数であるVal関数を使いこなし、この現場の悩みをスマートに解決する方法を、具体的なコードを交えて解説します。
コピペで即解決!単位付き・カンマ付き数値を数値に変換するコード
まずは、問題となる例と、それを解決するためのVBAコードをご覧ください。
Function ConvertToNumeric(ByVal inputText As String) As Double
Dim cleanedText As String
' 1. カンマを除去
cleanedText = Replace(inputText, ",", "")
' 2. 単位記号(例: 円, 個, kgなど)を除去
' ここでは一般的な記号をいくつか例示します。必要に応じて追加・変更してください。
cleanedText = Replace(cleanedText, "円", "")
cleanedText = Replace(cleanedText, "個", "")
cleanedText = Replace(cleanedText, "kg", "")
cleanedText = Replace(cleanedText, "m", "")
cleanedText = Replace(cleanedText, "g", "")
cleanedText = Replace(cleanedText, "㎡", "") ' 平方メートル
' その他、全角スペースや半角スペースも除去することが効果的な場合があります
cleanedText = Replace(cleanedText, " ", "") ' 全角スペース
cleanedText = Trim(cleanedText) ' 半角スペース(前後の余分なスペース)
' 3. Val関数で数値に変換
' Val関数は数値と認識できる部分までを変換します。
' 事前にカンマと単位を除去することで、正確な変換が可能になります。
ConvertToNumeric = Val(cleanedText)
End Function
Sub ExampleUsage()
Dim priceWithUnit As String
Dim numericPrice As Double
' 現場でよくある入力例
priceWithUnit = "1,980円"
' *** ここが落とし穴!Val関数だけではうまくいかない! ***
' Val("1,980円") は "1" になってしまう!
Debug.Print "------------------------------------"
Debug.Print "入力値: """ & priceWithUnit & """"
Debug.Print "Val関数直接の結果: " & Val(priceWithUnit) ' 結果は "1"
' 上記で作成した関数を使って変換
numericPrice = ConvertToNumeric(priceWithUnit)
Debug.Print "ConvertToNumeric関数での変換結果: " & numericPrice ' 結果は "1980"
Debug.Print "------------------------------------"
' 別の例 (カンマと単位が混在)
Dim largeAmount As String
largeAmount = "1,234,567kg"
Debug.Print "入力値: """ & largeAmount & """"
Debug.Print "Val関数直接の結果: " & Val(largeAmount) ' 結果は "1"
Debug.Print "ConvertToNumeric関数での変換結果: " & ConvertToNumeric(largeAmount) ' 結果は "1234567"
Debug.Print "------------------------------------"
' 別の例 (単位のみ)
Dim itemQuantity As String
itemQuantity = "100個"
Debug.Print "入力値: """ & itemQuantity & """"
Debug.Print "Val関数直接の結果: " & Val(itemQuantity) ' 結果は "100" (この場合はValだけでも問題ないように見える)
Debug.Print "ConvertToNumeric関数での変換結果: " & ConvertToNumeric(itemQuantity) ' 結果は "100"
Debug.Print "------------------------------------"
End Sub
Val関数の落とし穴と回避策を徹底解説!
上記のコードでなぜうまくいくのか、そしてVal関数を使う上での最大の注意点について詳しく見ていきましょう。
【重要】Val関数の最大の落とし穴!カンマがある場所で変換が止まる!
Val関数は、文字列の先頭から見て、数値と認識できる文字がある限り数値に変換を続けますが、数値ではない文字(スペース、カンマ「,」、アルファベット、記号など)に遭遇した時点で、それ以降の変換を停止してしまいます。
例えば、Val("1,980円") の場合、最初の「1」は数値なので変換されますが、次の「,」(カンマ)が非数値であるため、そこで変換を停止し、結果として「1」という値が返されてしまいます。「1980」にはなりません!これが現場でよく発生するVBA Val関数の落とし穴です。
この落とし穴を回避するためのポイントは、Val関数を呼び出す前に、文字列を徹底的にクリーンアップすることです。
- カンマの除去:
Replace(inputText, ",", "")を使うことで、「1,980」のような文字列からカンマを全て取り除き、「1980」という純粋な数値文字列にします。 - 単位記号の除去: 同様に、
Replace関数を使って「円」「個」「kg」などの単位記号を空文字列に置き換えることで、数値以外の文字を取り除きます。 - 不要なスペースの除去: 全角スペース(「 」)や半角スペース(`Trim`関数)も、`Val`関数が途中で変換を停止する原因となるため、事前に除去しておくのが賢明です。
このように、Val関数に渡す文字列を「数値のみ」の状態にしておくことで、意図通りの正確な数値変換が可能になります。
まとめ:現場のデータ処理を効率化しよう!
VBAのVal関数は非常に便利ですが、その特性(非数値文字での変換停止)を理解していなければ、予期せぬ結果を招くことがあります。
しかし、今回ご紹介したように、Replace関数で事前にカンマや単位記号をクリーンアップするひと手間を加えるだけで、「1,980円」のような現場の生データも正確な数値として扱えるようになります。
このテクニックをあなたのVBAコードに組み込めば、手入力データに悩まされることなく、スムーズな計算処理やデータ分析が可能になり、現場の作業効率が格段にアップするはずです。ぜひあなたの職場で活用してみてください!