こんにちは! 現場でバリバリとコードを書いていると、画面から入力された「文字列」を「数値」に変換するシーンに出くわすことが本当によくあります。
「テキストボックスに入力された金額を足し算したい」
「設定ファイルのテキストを読み込んで数値として扱いたい」
そんなとき、あなたは何を使っていますか? `CInt`? `Val`? それとも……?
実は、ここを適当に済ませていると、ユーザーがちょっと変な文字(全角スペースや「100円」といった単位など)を入力した瞬間に、アプリケーションが容赦なくクラッシュ(異常終了)してしまいます。
今回は、Excel VBAや古いVB6のノリから抜け出して、VB.NETのモダンで安全な数値変換をマスターしましょう!ここをクリアすれば、あなたの書くコードの「頑健性(タフさ)」は一気にプロの領域に達しますよ。
—
1. 昔からのクセに要注意! `CInt`・`CLng` と `Val` の決定的な違い
まずは、VBの歴史の中でよく使われてきた3つの変換方法のおさらいです。それぞれの「性格」を正しく把握しておきましょう。
① `CInt` / `CLng` (型変換関数)
- 性格: 厳格・お堅い優等生
- 挙動: 渡された文字列が「完全に正しい数値」であれば、綺麗に数値(Integer型 / Long型)に変換してくれます。
- 弱点: 文字列に「スペース」が混ざっていたり、「123A」のように文字が入っていたり、そもそも空っぽ(`””`, `Nothing`)だったりすると、容赦なく例外(エラー)を発生させてアプリを落とします。
② `Val` 関数 (レガシーな互換関数)
- 性格: 気さくだけど、ちょっとお調子者(VB6時代の名残)
- 挙動: 文字列の左端から見ていき、数値と解釈できる部分だけを無理やり数値にして返します。
- 弱点: 「123円」なら `123` を返してくれますが、「¥123」だと `0` を返します(左端の「¥」を数字と認めないため)。 また、全角数字を一切理解できません。現代のWebアプリケーションやデスクトップアプリで使うには、あまりにも空気が読めない子です。
—
2. 実例で見る!ヤバい挙動のオンパレード
百聞は一見にしかず。それぞれの関数が、不正な入力に対してどう反応するのか、コードで確認してみましょう。
Module NumberConversionDemo
Sub Main()
‘ テストする様々な入力パターン
Dim normalStr As String = “12345”
Dim spaceStr As String = ” 123 ”
Dim unitStr As String = “100円”
Dim zenkakuStr As String = “123”
Dim emptyStr As String = “”
Console.WriteLine(“=== CIntの挙動 ===”)
‘ Console.WriteLine(CInt(normalStr)) -> 12345 (成功)
‘ Console.WriteLine(CInt(spaceStr)) -> 123 (前後のスペースはトリムしてくれる)
‘ Console.WriteLine(CInt(unitStr)) -> 💥例外発生! (InvalidCastException)
‘ Console.WriteLine(CInt(zenkakuStr)) -> 123 (全角は半角に解釈してくれる場合もあるが…)
‘ Console.WriteLine(CInt(emptyStr)) -> 💥例外発生! (InvalidCastException)
Console.WriteLine(“=== Valの挙動 ===”)
Console.WriteLine(Val(normalStr)) ‘ 出力: 12345
Console.WriteLine(Val(spaceStr)) ‘ 出力: 123
Console.WriteLine(Val(unitStr)) ‘ 出力: 100 (“円”の前でストップする)
Console.WriteLine(Val(zenkakuStr)) ‘ 出力: 0 (全角は無視されてしまう!)
Console.WriteLine(Val(emptyStr)) ‘ 出力: 0 (安全だが、未入力と0の区別がつかない)
End Sub
End Module
どうでしょうか? `CInt` は少しでも不備があると即座にエラーで止まり、`Val` はエラーは出ないものの、全角文字を無視して `0` を返したりするため、「本当はエラーにすべき不正な入力」を見過ごしてしまうリスクがあります。
—
3. これが正解!モダンな `.TryParse` メソッドの圧倒的パワー
「じゃあ、エラーを出さずに、かつ安全に、正しく数値かどうか判定して変換するにはどうすればいいの?」
そこで登場するのが、.NETの誇る最強の安全装置 `Integer.TryParse`(または `Long.TryParse`)です!
TryParseの哲学:「失敗は例外ではなく、ただの結果(Boolean)」
TryParseは、「変換できるかどうか試して(Try)、結果をBoolean(True/False)で教えるよ」という非常に理にかなった設計になっています。エラーを「例外(Exception)」としてキャッチするのではなく、戻り値の真偽値でコントロールするため、パフォーマンス的にも非常に優れており、何より安全です。
実際のコードを見てみましょう。
Module SafeConversion
Sub Main()
‘ ユーザーからの入力を想定した文字列
Dim userInput As String = “12345”
‘ 変換後の数値を格納する変数を用意しておく
Dim resultValue As Integer
‘ TryParseに挑戦させる
‘ 第一引数: 変換したい文字列
‘ 第二引数: 成功した場合に数値が格納される変数 (ByRef)
If Integer.TryParse(userInput, resultValue) = True Then
‘ 変換成功!
Console.WriteLine(“変換成功しました! 数値は ” & resultValue & ” です。”)
‘ ここで安全にビジネスロジックを続けられる
Dim finalCalc As Integer = resultValue 2
Console.WriteLine(“2倍した値: ” & finalCalc)
Else
‘ 変換失敗!(文字混じり、空白、未入力など)
Console.WriteLine(“【警告】有効な数値ではありません。正しい値を入力してください。”)
End If
End Sub
End Module
💡 さらにスマートに書くTips (VB.NETの機能)
VB.NETでは、変数の宣言を `If` の中や事前に分けるパターンなどがありますが、上記のように「事前に変数を用意して `TryParse` に渡す」スタイルが最も直感的で安全です。
※最新の.NET環境であれば、宣言と同時に渡すことも可能です。
—
4. 現場で使える!入力チェックのイディオム
実際の業務アプリケーション(Windows Forms や WPF、あるいはコンソールツールなど)では、以下のような関数パターンを作っておくと非常に重宝します。
Public Class FormHelper
‘ 画面のテキストボックス等の入力を安全に整数に変換するラッパー関数
Public Shared Function GetValidatedInteger(inputString As String) As Integer
Dim parsedValue As Integer
‘ Integer.TryParse で安全にチェック
If Integer.TryParse(inputString, parsedValue) Then
Return parsedValue
Else
‘ 失敗した場合はデフォルト値(0など)を返すか、業務に応じたハンドリングを行う
Return 0
End If
End Function
End Class
—
まとめ:これだけは覚えよう!
1. `CInt` / `CLng` は「完全無欠なデータ」にしか使わない。(予期せぬ入力でアプリが落ちる原因になります)
2. `Val` はレガシーな互換性のためにある。 今時の新規開発では、全角を無視したり変な挙動をするので極力使わない。
3. 迷ったら `Integer.TryParse` を使う。 「安全に判定し、失敗してもアプリを落とさない」ことが、信頼されるアプリケーションを作る第一歩です。
ここをクリアすれば、もうユーザーの変な入力に怯える必要はなくなります。
明日からのコーディングで、ぜひ `TryParse` を積極的に取り入れてみてくださいね。あなたのVB.NETライフがより堅牢で楽しいものになることを応援しています!
