テキストボックスが日付か判定

中級VBA

はじめに

 テキストボックスは値を文字列として受け取るため、セルのような自動変換は行われません。そのため、一旦セルに値を入力し得た値を文字列としてテキストボックスに表示させる例を以前、紹介しました。

 ・テキストボックスに書式設定

 上記の例を日付に特化させて、テキストボックスの文字列が日付に適合しない場合は、エラーを出すようにしてみました。

 動作としては、テキストボックスと1つのセルをリンクさせてテキストボックスに入力された値を一旦セルに入れます。
 つぎにIsDate関数で日付かを確認し、日付でなければ、ラベルに「日付ではありません。」と表示させます。

 日付の場合は、ラベルに「2023/10/30」という形式で表示させます。これは数式バーに表示される書式です。

 日付の場合は、セルに入力された文字列をそのままテキストボックスにフィードバックする形で表示させます。

作り方

 今回のサンプルでは、テキストボックスとリンクするセルを使うため「テキストボックス」というシートを用意します。必要なら非表示設定にしてください。

ユーザーフォームの部品配置

 ユーザーフォームは以下のような部品配置になります。

プログラムコード

 まず標準フォームにユーザーフォームを表示させるプログラムを書きます。

'// 標準モジュールに記述します。
Sub Test()
    UserForm1.Show
 
End Sub

 次に、ユーザーフォームのプログラムです。
全てイベントプロシージャですので、プログラムウインドウの上部から、CommandButton1、Click と、TextBox1、AfterUpdate を選択してプロシーシャを表示させます。

'// フォームモジュールに記述します。
Private Sub CommandButton1_Click()
    Unload Me
End Sub

Private Sub TextBox1_AfterUpdate()
    With Worksheets("テキストボックス")
    
    '書式を標準に戻す
    .Range("A1").NumberFormatLocal = "G/標準"
    
    .Range("A1") = Me.TextBox1.Text
    If IsDate(.Range("A1")) Then
        Me.TextBox1.Text = .Range("A1").Text
        Me.Label2 = Format(.Range("A1"), "yyyy/m/d")
    Else
        Me.Label2 = "日付ではありません。"
    End If
    
    End With
End Sub

 CommandButton1_Click()はコマンドボタンが押された時のプログラムで、今回はユーザーフォームを閉じるUnloadを実行しています。

 TextBox1_AfterUpdate()は、テキストボックスの編集後に実行されるイベントプロシージャです。「テキストボックス」というシートのA1セルと、テキストボックス、ラベル(Label2)でやり取りします。
 最初にA1セルを標準の書式設定に戻しておきます。これは以前の書式設定に引きずられないようにするためです。
 続いてテキストボックスの値をA1セルに代入します。この時、日付なら自動変換が起こるはずです。これをIsDate関数で確かめて、日付でない場合は、ラベルにエラーメッセージを表示させます。

 もし、日付の場合はA1セルの表示文字列をテキストボックスにフィードバックさせ、ラベルには”yyyy/m/d”というフォーマットで入力します。

エラー対策

 A1セルの幅が狭く、日付表示が#######になってしまう場合がありますので、A1セルの幅は広めにとっておくようにしましょう。

表示結果

 日付に年を入れない場合は、そのまま表示されますが、日付型として保持したい場合はA1セルの値を取得するようにすれば良いでしょう。

 元号表示から西暦表示に変更した場合も、書式設定を標準に戻してから変換しているので、正常に表示されます。

まとめ

 今回はテキストボックスで日付を扱うアイデアを紹介しました。テキストボックスは文字列を専門で扱うため、セルの自動変換が欲しくなることが多いと思います。
 そのような時は、1つのセルを用意しておきリンクさせれば以外に簡単に実現させることが出来ますので試してみてください。

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