【入門編】MaskedTextBoxを使った電話番号・郵便番号の入力制御:カスタム入力マスクとプレースホルダー処理の実務ノウハウ – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

こんにちは!業務自動化やデスクトップアプリ開発の世界へようこそ。
VBAのマクロ記録から一歩踏み出して、Visual Basic (VB.NET)で本格的なWindows Forms(WinForms)アプリを作り始めると、最初にぶつかる大きな壁のひとつが「ユーザーの入力制御」です。

普通の `TextBox` だと、ユーザーが「09012345678」とハイフンなしで書いたり、「090-1234-5678」とハイフン付きで書いたり、最悪の場合は全角文字や五十音を入力してしまうこともありますよね。これらを後から判定・修正するコード(バリデーション)を書くのは本当に大変です。

そこで大活躍するのが`MaskedTextBox`(マスクテキストボックス)です!
これを使えば、入力フォーマットを強制し、迷わせない直感的な画面を作ることができます。

今回は、MaskedTextBoxを使って電話番号や郵便番号をスマートに制御する実務ノウハウを、基礎から裏側の仕組みまで優しく解説します。ここをクリアすれば、VB.NETの入力制御の基本はバッチリですよ!

—

1. MaskedTextBoxとは?普通のTextBoxとの決定的な違い

MaskedTextBoxは、「指定した型(マスク)通りの入力しか受け付けない」という強力な制約を持った入力コントロールです。

【通常の TextBox】
[ 090abc1234 ] ← 数字以外も入れてしまい、後処理が大変!

【MaskedTextBox (電話番号マスク設定済)】
[ 090-____-____ ] ← 指定した桁数の数字しか入らない!

なぜ MaskedTextBox を使うのか?

1. 入力ミスを未然に防げる(数字しか受け付けない、桁数を強制できる)
2. 入力形式が一目でわかる(`___-____` のようなプレースホルダーが表示される)
3. データ加工の手間が減る(ハイフンを除外してDBに保存するなどの処理が自動化できる)

—

2. まずはここから!カスタム入力マスクの基本ルール

MaskedTextBoxの能力を極めるカギは、`Mask` プロパティの書き方にあります。よく使うマスク文字のルールを整理してみましょう。

| マスク文字 | 意味 | 必須 / 任意 |
| :— | :— | :— |
| `0` | 数字(0〜9) | 必須 |
| `9` | 数字またはスペース | 任意 |
| `#` | 数字、スペース、または符号(+ -) | 任意 |
| `L` | 英字(A〜Z, a〜z) | 必須 |
| `?` | 英字(A〜Z, a〜z) | 任意 |
| `A` | 英数字 | 必須 |
| `a` | 英数字 | 任意 |

実務でそのまま使える!定番のマスク設定

① 郵便番号(7桁)

MaskedTextBox1.Mask = “000-0000”

解説: 3桁の数字 + ハイフン + 4桁の数字 を強制します。数字以外はキーを押しても無視されます。

② 携帯電話・固定電話番号(10桁〜11桁)

日本の電話番号は市外局番の桁数が変わるため、少しコツがいります。

‘ 携帯電話(11桁固定:090-0000-0000)
MaskedTextBox1.Mask = “000-0000-0000”

‘ 固定電話・携帯共通(任意桁を考慮する例:00-0000-0000 または 000-000-0000 など)
‘ ※実務ではハイフン位置を考慮して 9(任意)を使うか、入力後に整形するのが定石です
MaskedTextBox1.Mask = “00000000000” ‘ あえてマスク側ではハイフンなしの11桁必須にするパターン

—

3. 【重要】実務で絶対にハマる「TextMaskFormat」の罠

初学者が最もつまずきやすいのが、「入力された値をどうやって取得するか?」という点です。

例えば、郵便番号 `123-4567` と入力されたとき、データベースに保存したい値はどちらでしょうか?

  • パターンA:`123-4567` (ハイフン付き)
  • パターンB:`1234567` (数字のみ)

MaskedTextBoxでは、`TextMaskFormat` プロパティを変えることで、`Text` プロパティから取得できる文字列の形式を自在にコントロールできます。

`TextMaskFormat` の主要な設定値

‘ 1. マスク文字もプレースホルダーもすべて含めて取得(既定値に近い)
MaskedTextBox1.TextMaskFormat = MaskFormat.IncludePromptAndLiterals
‘ 取得結果: “123-4567” または “123-____”

‘ 2. 入力されたリテラル(ハイフン等)のみ含め、未入力のプレースホルダーは除く
MaskedTextBox1.TextMaskFormat = MaskFormat.IncludeLiterals
‘ 取得結果: “123-4567” または “123-”

‘ 3. 【超重要】ユーザーが入力した生のデータ(数字のみ)だけを取得
MaskedTextBox1.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals
‘ 取得結果: “1234567” または “123”

> プロのアドバイス
> データベースに保存するときはハイフンなし(`ExcludePromptAndLiterals`)、画面表示や帳票出力のときはハイフンあり(`IncludeLiterals`)といったように、用途に応じて `TextMaskFormat` を一時的に切り替えて `.Text` を取得するのがスマートな実装です!

—

4. UX(使い心地)を激変させるプロのイベント駆動テクニック

標準のMaskedTextBoxのままだと、ユーザーがクリックした位置にカーソルが飛んでしまい、「入力しづらい!」とクレームになることがあります。
ここでは、現場で喜ばれる「気の利いた挙動」を追加してみましょう。

テクニック①:フォーカス時に自動で先頭(または全選択)にする

ユーザーがTabキーやクリックでMaskedTextBoxに入ってきたとき、先頭にカーソルを移動させます。

テクニック②:入力未完了( incomplete )の検出

`MaskCompleted` プロパティを使うことで、「最後まで入力されたか?」を1行で判定できます。

—

5. コピペで使える!完全実用コードサンプル

それでは、ここまで解説したノウハウを詰め込んだ実践コードを見てみましょう。
フォームに `MaskedTextBox` を2つ(郵便番号用、電話番号用)と、確認ボタンを配置した構造です。

Public Class Form1

”’

”’ フォームロード時の初期化処理
”’

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
‘ ————————————————–
‘ 1. 郵便番号の設定
‘ ————————————————–
MaskedZipCode.Mask = “000-0000”
MaskedZipCode.PromptChar = “_”c ‘ プレースホルダー文字(既定は ‘_’ )

‘ ————————————————–
‘ 2. 電話番号の設定(携帯 11桁)
‘ ————————————————–
MaskedPhone.Mask = “000-0000-0000”
MaskedPhone.PromptChar = “_”c
End Sub

”’

”’ フォーカスが入った時、カーソルを先頭に移動させて入力しやすくする(UX向上)
”’

Private Sub MaskedTextBox_Enter(sender As Object, e As EventArgs) Handles MaskedZipCode.Enter, MaskedPhone.Enter
Dim msk = TryCast(sender, MaskedTextBox)
If msk IsNot Nothing Then
‘ 非同期処理でカーソル位置を先頭(0)にセット
Me.BeginInvoke(New Action(Sub()
‘ 全選択にしたい場合は msk.SelectAll() を使います
msk.SelectionStart = 0
msk.SelectionLength = 0
End Sub))
End If
End Sub

”’

”’ 登録ボタン押下時の処理(データの取得と検証)
”’

Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click

‘ — 郵便番号のバリデーション —
If Not MaskedZipCode.MaskCompleted Then
MessageBox.Show(“郵便番号を7桁最後まで入力してください。”, “入力チェック”,
MessageBoxButtons.OK, MessageBoxIcon.Warning)
MaskedZipCode.Focus()
Return
End If

‘ — 電話番号のバリデーション —
If Not MaskedPhone.MaskCompleted Then
MessageBox.Show(“電話番号を11桁最後まで入力してください。”, “入力チェック”,
MessageBoxButtons.OK, MessageBoxIcon.Warning)
MaskedPhone.Focus()
Return
End If

‘ ————————————————–
‘ 3. 値の安全な取得(DB保存用と表示用)
‘ ————————————————–

‘ DB保存用:ハイフン無しの純粋な数値文字列を取得
MaskedZipCode.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals
Dim rawZipCode As String = MaskedZipCode.Text

MaskedPhone.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals
Dim rawPhone As String = MaskedPhone.Text

‘ 画面表示用:ハイフンを含んだ整形済み文字列を取得
MaskedZipCode.TextMaskFormat = MaskFormat.IncludeLiterals
Dim formattedZipCode As String = MaskedZipCode.Text

MaskedPhone.TextMaskFormat = MaskFormat.IncludeLiterals
Dim formattedPhone As String = MaskedPhone.Text

‘ 結果の確認表示
Dim message As String = $”【送信成功】” & vbCrLf &
$”郵便番号(DB用): {rawZipCode} / (表示用): {formattedZipCode}” & vbCrLf &
$”電話番号(DB用): {rawPhone} / (表示用): {formattedPhone}”

MessageBox.Show(message, “処理完了”, MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub

End Class

—

6. 初心者が陥りやすいトラブルと解決法

疑問①:BackSpaceキーを押したときにハイフンが消えない!

回答: これは正常な挙動です。ハイフンは「リテラル(固定文字)」として定義されているため、BackSpaceを押すとハイフンを飛び越えて直前の数字が消去されます。ユーザーがハイフン自体を消してしまう事故を防ぐ仕様です。

疑問②:未入力なのに `.Text` を取ると `” – “` になってしまう!

回答: まさに本記事の第3章で触れた `TextMaskFormat` の影響です!
未入力状態で `.Text` を判定するときに `If MaskedTextBox1.Text = “” Then` と書いてしまうと、ハイフンやプロンプト文字が含まれて不一致になります。

未入力判定をしたい時は、以下のどちらかを使ってください。
1. `MaskedTextBox1.MaskCompleted` (全桁入力されたか?)
2. `MaskedTextBox1.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals` に設定した上で `.Text.Length = 0` か判定する

—

まとめ:入力制御を極めてプロのUIを作ろう!

今回は、Windows Forms開発の要である `MaskedTextBox` を使った入力制御について詳しく解説しました。

  • `Mask` プロパティでフォーマットを固定する
  • `TextMaskFormat` で「ハイフンあり/なし」を自在にコントロールする
  • `MaskCompleted` で未入力・中途半端な入力を判定する
  • `Enter` イベントでカーソル位置を調整し、使い心地を向上させる

VBAのシンプルなフォームからVB.NETへのステップアップは、最初はプロパティやイベントの多さに驚くかもしれません。しかし、今回学んだ `MaskedTextBox` のように、仕組みを一度理解してしまえば「ユーザーを迷わせない高品質なアプリ」を驚くほど簡単に作ることができます。

ここをクリアすれば、Visual Basic (VB / VB.NET)の基本はバッチリですよ!自信を持って、次のステップへ進んでくださいね。応援しています!

タイトルとURLをコピーしました