ExcelVBAでの日付入力について
UserFormにTextBoxがTextBox1からTextBox10の10個あり、すべて日付を入力します。
たとえば「12/10」と入力し、EnterもしくはTabキーなどで他のTextBoxにカーソルを移動させると
「2008/12/15」と前に年を表示させたいと思っています。
もし、日付ではないものを入力された場合は、エラーメッセージを表示したいと思っています。
日付入力はTextBox1から順に入力していくのですが、いつも10個すべてのTextBoxが入力される
わけではありません。(TextBox1~TextBox3のみ入力などがあります。)
どのようにしたら日付データ「12/10」と入力したら自動的に「2008/12/10」と年を追加させる
ことができ、日付データではない場合はエラー表示することができるのでしょうか。
(「2008/12/10」と入力された場合は、そのまま表示)
ご教授のほど、よろしくお願いします。
回答(4件)
- 最新から表示
- |
- 回答順に表示
- |
- ベストアンサーのみ表示
No.4ベストアンサー20pt
こんな感じでいいんじゃないかな
#2さんのと被ってるけど^^;
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim tmp As String
Cancel = validateDateString(Me.TextBox1.Text, tmp)
Me.TextBox1.Text = tmp
End Sub
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim tmp As String
Cancel = validateDateString(Me.TextBox2.Text, tmp)
Me.TextBox2.Text = tmp
End Sub
Private Function validateDateString(dateString As String, ByRef resultString As String) As Boolean
validateDateString = False
dateString = Trim(dateString)
If Len(dateString) = 0 Then
resultString = vbNullString
ElseIf IsDate(dateString) Then
resultString = Format(CDate(dateString), "yyyy/mm/dd")
Else
MsgBox "日付を入力してください", vbExclamation
resultString = dateString
validateDateString = True
End If
End Function
No.3ベストアンサー10pt
日付チェックを始めるきっかけは、何を使うか、はっきり認識すべきです。
(1)入力完了済みの意志のコマンドボタンのクリック
(2)テキストボックスのイベント
など
ーー
12/10を2808/12/10と解するのはたやすいが、実際には危険を伴う。2009年になったらどうする。
・操作時の年
・毎年初プログラムを手直し
なども有ると思うが、やはり年は1箇所か、全テキストボックスに入れるべきではないかな。10個とも日付年がそろうものかな。
ーー
日付として、日付シリアル値数的・カレンダー的に有効かどうかはIsDate関数が有る
Sub test01()
If IsDate(Cells(1, "A")) = True Then
MsgBox "日付OK"
Else
MsgBox "日付NO"
End If
End Sub
0,13月、33日などチェックしてくれる。
ーーー
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
t = "2008/" & UserForm1.TextBox1.Text
If IsDate(t) = True Then
MsgBox "日付1 OK"
Else
MsgBox "日付1 NO"
End If
End Sub
ーーーーー
これは1つのテキストボックス対応だけだが、VBAでは、とりあえずは各テキストに対応した10個似たものを並べてください。
将来1つのルーチンで済ます方法を勉強してください。
日付かどうかをチェックし、日付なら編集後の文字列を返し、
日付として不正ならエラーメッセージを表示して、空文字列を
返す関数の例
Function 日付検査(ByVal 文字列 As String) As String
If Trim(文字列) = "" Then Exit Function '空文字列は許可
If IsDate(文字列) Then
日付検査 = Format(CDate(文字列), "YYYY/MM/DD")
Else
MsgBox "日付として不正です", vbCritical, "日付エラー"
End If
End Function
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim a As Date
If TextBox1.Text = "" Then Exit Sub
On Error GoTo ErrorHandler
a = TextBox1.Text
If a < #1/1/2000# Then GoTo ErrorHandler
TextBox1.Text = a
Exit Sub
ErrorHandler:
TextBox1.Text = ""
MsgBox "error"
Cancel = True
End Sub
完全ではないので、参考までに
特に日付関係はムズイ
もっと条件を絞らないとエラーの回避は出来ないと思う
月と日を分けて別々のtextboxに入力させた方がエラー対処がしやすいと思う
他の入力方法としてカレンダコントロールを使用するのが良いかも
マウスで入力できるし、エラー処理も殆んどしなくてよいと思うよ
- 最新から表示
- |
- 回答順に表示
- |
- ベストアンサーのみ表示












