もちべーこん日記

もちべーこん日記

あなたのハートにもちべーこん!

【Excel VBA】テキストボックスに半角英数字+記号のみを入力できるようにする

きっかけ

  • フォームのテキストボックスへ文字を入力するときに、決められた文字以外を入力して欲しくない場合がある
  • 数字のみを入力する方法はいくつか見つかるが、半角英数字+記号のみを入力できるようにするコードは見つからない

という訳で書いた

解説

Initializeイベント

  • 「Me.TextBox1.IMEMode」でフォーム起動時のTextBox1のIMEモードを設定
  • 「fmIMEModeDisable」でIMEモードの切り替えを無効に
  • 無効にすることで全角入力を防ぐ

【IMEMode一覧】

定数 設定される内容
0 fmIMEModeNoControl コントロールなし(初期値)
1 fmIMEModeOn オン(日本語入力)
2 fmIMEModeOff オフ(アルファベット入力)
3 fmIMEModeDisable 無効
4 fmIMEModeHiragana ひらがな
5 fmIMEModeKatakana 全角カタカナ
6 fmIMEModeKatakanaHalf 半角カタカナ
7 fmIMEModeAlphaFull 全角英数
8 fmIMEModeAlpha 半角英数

KeyPressイベント

  • KeyPressイベントはTextBox1内でKeyが押下された時に発生するイベント
  • (ByVal KeyAscii As MSForms.ReturnInteger)で押下したKeyのAsciiコードが引数KeyAsciiに入る
  • Asciiコードをざっくり説明すると「ある文字に割り当てられた文字コード」のこと(詳しくはググって)
  • Asciiコードでは33~126が半角英数字と記号に対応している
  • Asciiコードの0番は空白(null文字)
  • つまり「KeyAscii < 33 Or KeyAscii > 126」で「半角英数字と記号以外」、「KeyAscii = 0」は「KeyAsciiに空白(null)を入れる」→半角英数字と記号以外を押したときには文字入力を行わない
  • 「If KeyAscii < 33 Or KeyAscii > 126 Then」は「 If Not KeyAscii >= 33 And KeyAscii <= 126 Then」(KeyAsciiが33~126の範囲の時以外)という書き方もできる
  • Asciiコードを調べて値を変更すれば入力できる文字を可能

Changeイベント

  • 上記二つのコードのみだと、コピペで貼り付けた際はそのまま貼りつけられてしまう
  • そのため、ChangeイベントでTextBox1内に変更が加えられた場合に入っている文字列を判定する
  • TextBox1内の文字を変数strに格納
  • 変数strの文字を左から順に1文字ずつ取得し、その文字のAsciiコードを変数AscCodeに格納
  • KeyPressイベントの判定と同じく、AscCodeが範囲内かどうかをチェック
  • 半角英数字と記号以外の場合はエラーメッセージを表示してTextBox1を空白にする
  • 半角英数字と記号以外が含まれていた場合はその後処理を停止し、そうでない場合は次の文字を確認
  • 文字数分のループ処理を行う

応用

  • 数字のみを入力可能にする場合

問題点

  • コピペする文字に半角英数字+記号以外が含まれている状態で貼り付けると既に入力したTextbox1の内容が消えてしまう(入力済みの文字はそのまま残したい)