こんにちは!チーフアーキテクトの私です。
Excelのマクロ記録や、古いVBAのコードから一歩抜け出して「本格的なVB.NETのアプリ開発に挑戦したい!」という素晴らしい一歩を踏み出したあなたへ。
今回は、実務で絶対に避けて通れない「文字列から数値への変換」についてお話しします。
「数字の入った文字列を計算に使いたいだけなのに、なんだかエラーが出る…」
「`CInt`、`CLng`、`Val`って、どれを使えばいいの?」
そんな疑問を持ったことはありませんか?
ここをクリアするだけで、あなたの書くコードの「堅牢性(エラーに強い度)」は劇的に跳ね上がります。レガシーな変換関数の罠を知り、モダンで安全な`TryParse`をマスターして、ワンランク上のエンジニアになりましょう!
—
1. 3つの変換関数(CInt / CLng / Val)の正体と挙動の罠
VB.NET(および前身のVB6)には、文字列を数値にするための代表的な方法が3つあります。まずはそれぞれの特徴と「危険な香り」を嗅ぎ分けていきましょう。
① `CInt` (Convert to Integer)
- 特徴: 引数を「Integer型(32ビット整数)」に厳格に変換します。
- 最大の罠: 小数点以下は四捨五入されます(※厳密には偶数丸め)。そして、変換元の文字列にアルファベットや記号が混ざっていたり、扱える数値の範囲(約-21億〜+21億)を超えていると、容赦なくアプリがクラッシュ(例外発生)します。
② `CLng` (Convert to Long)
- 特徴: 引数を「Long型(64ビット整数)」に変換します。
- 最大の罠: `CInt`よりも大きな範囲(約-9京〜+9京)を扱えますが、やはり文字列にゴミが入っていたり範囲を超えると容赦なくクラッシュします。
③ `Val` (Value – レガシーな関数)
- 特徴: VB6時代から生き残る、ちょっと特殊な関数です。文字列の左から順に数字として解釈できる部分だけを読み取ります。
- 最大の罠: 「123ABC456」という文字列を渡すと、エラーを出さずに「123」と勝手に解釈して返します。また、全角数字を半角に変換してくれません。意図しないバグの温床になりやすいため、モダンなVB.NET開発では原則として使用禁止(アンチパターン)とされています。
—
2. 【図解風】もしも無効な値をブッ込んだら…?
それぞれの関数に `「あいうえお」` という文字列を渡したときの挙動をイメージしてみましょう。
[ “あいうえお” ]
│
├─► CInt(“あいうえお”) ──► 💥 クラッシュ!(InvalidCastException / OverflowException)
│
├─► CLng(“あいうえお”) ──► 💥 クラッシュ!(同上)
│
└─► Val(“あいうえお”) ──► 0 (エラーを出さずに勝手に 0 を返す。これがタチ悪い!)
初心者のうちは「エラーが出ない `Val` が便利じゃん!」と思いがちですが、開発現場では「エラーを出さずに勝変に間違った値に変えられること」が一番の恐怖です。気づかないうちに計算ミスやデータベースの破損を引き起こすからです。
—
3. モダンの常識!クラッシュを防ぐ『Integer.TryParse』
では、プロの現場ではどうするか?
ここで登場するのが、私たちチーフアーキテクトも愛してやまない`TryParse`(トライ・パース)パターンです。
`TryParse` は、文字通り「数値に変換できるかどうかを、おそるおそる(Try)試してみる」メソッドです。失敗してもアプリはクラッシュせず、代わりに「失敗したよ」という判定(False)を返してくれます。
実用コード例:安全な数値変換
以下のコードを、あなたのプロジェクトのボタンクリックイベントなどに貼り付けて試してみてください。
Imports System
Public Class Form1
Private Sub btnCalculate_Click(sender As Object, e As EventArgs) Handles btnCalculate.Click
‘ ユーザーがテキストボックスに入力した文字列を想定
Dim inputString As String = txtInput.Text
‘ 変換結果を受け取るための変数
Dim resultValue As Integer
‘ 【最重要】Integer.TryParse の使い方
‘ 変換できたら True を返し、resultValue に数値を入れる。失敗なら False を返す。
If Integer.TryParse(inputString, resultValue) Then
‘ — 変換成功した場合の処理 —
‘ ここに来たということは、resultValue は安全な整数です!
Dim finalAnswer As Integer = resultValue 2
MessageBox.Show($”変換成功! 2倍した値は {finalAnswer} です。”, “通知”, MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
‘ — 変換失敗した場合の処理 —
‘ アプリはクラッシュせず、優しくユーザーに再入力を促せます
MessageBox.Show(“有効な整数を入力してください。(例: 100)”, “入力エラー”, MessageBoxButtons.OK, MessageBoxIcon.Warning)
‘ 必要であればフォーカスを戻す
txtInput.Focus()
txtInput.SelectAll()
End If
End Sub
End Class
このコードが美しい理由(エンジニアの視点)
1. 例外(Exception)を発生させない: 例外処理(`Try…Catch`)は処理コストが重いのですが、`TryParse`は戻り値(Boolean)で判定するため、パフォーマンスに優れています。
2. コードの意図が明確: 「試して、成功したら進む」というロジックが直感的で、後からコードを読む他のエンジニア(あるいは未来の自分)にも優しく伝わります。
—
まとめ:ここをクリアすればVB.NETの基本はバッチリ!
今回は、数値変換の歴史と、モダンで安全な `TryParse` の世界へご案内しました。
- `CInt` や `CLng` は、「絶対に正しい数値が入っている」と確信がある場合以外は使わない。
- `Val` はレガシーな遺物なので、封印する。
- 外部からの入力やユーザーが触るテキストボックスには、必ず `Integer.TryParse`(または `Long.TryParse`) を使う。
この3つを徹底するだけで、あなたの書くVB.NETアプリケーションは見違えるほど堅牢でプロフェッショナルなものになります。
ここをクリアすれば、VB.NETの基本はバッチリです!自信を持って、次のステップへ進んでいきましょう。分からないことがあれば、いつでも先輩エンジニアの私に聞いてくださいね。応援しています!
