[[20170125160018]] 『textboxの日付入力について』(micky) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『textboxの日付入力について』(micky)

textboxの日付入力について教えてください。

ユーザーフォーム上に作成したtextboxに
1/25と入力すると、2017/1/25と表示されるようにしたいのですが
1と入力した途端、1899/12/31と表示されてしまい
1899/12/31/21と入力してから1899/12/3を消さないと正しい日付が
入力されません。
どの様にしたらうまく日付表示できるでしょうか?

Private Sub 納期_Change()

  納期.Value = Format(納期.Value, "yyyy/mm/dd")
End Sub

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 シート上では、セルに 1/25 といれて確定すると、1/25 という値を持ってChangeイベントが発生します。
 でも、ユーザーフォームのTextBoxやComboBoxでは、同じ Changeイベントという名前なので誤解されてしまいがちですけど
 『1文字』入力するたびに、Changeイベントが発生します。

 ですから、少なくとも TextBox のChangeイベントは、使うのが難しいというか、ないほうがいいとさえ
 思っています。

 シート上のセルのChangeイベントに相当するものは、ユーザーフォームのイベントとしては BeforeUpdate や AfterUpdate といった
 Exit系イベントです。

 これは TextBox にすべて入力が終わり、エンターやタブキーを押す、あるいはマウスで別コントロールを選択した時に発生します。
 その時点では その TextBox の Value は 1/25 です。

 こちらを使うことを強く推奨します。

(β) 2017/01/25(水) 16:25


ユーザーフォーム上のTextBoxの場合、ノーチェックにするのが一番ですよ。
そして処理開始ボタン等を押した際に、正しく入力されているかを、全て調べるのです。これが一般的。
(???) 2017/01/25(水) 16:29

 Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'Enterキーで確定
    If KeyCode <> 13 Then Exit Sub
    If IsDate(TextBox1.Value) Then
        If IsDate(Year(Date) & "/" & TextBox1.Value) Then TextBox1.Value = Year(Date) & "/" & TextBox1.Value
    End If
End Sub
(mm) 2017/01/25(水) 17:57

 To mmさん

 横やりを入れるようで心苦しいのですが、TextBoxの入力完了はエンターキーだけではありません。
 タブもそうですし、別コントロールのマウスでの選択もそうです。

 エンターのみをチェックすることに、いかほどの意義があるのでしょうか?

 BeforeUpdateやAfterUpdate を使わず、KeyDown で Enter をチェックする意図は?

(β) 2017/01/25(水) 23:25


 別案というか、追加でコメントします。
 ??? さんの提言、TextBox の項目チェックは、最後の更新処理ボタン等がおされたタイミングで行う。

 大賛成です。

 私も、その昔、業務で実際に使うコードを書いていたときには、すべてを、その形にしていました。

 項目チェックということを考えると、必ずしも単一のTextBoxの値をチェックすれば済むわけではなく
 他のTextBoxの値との関連チェックが必要な場合が少なくない、あるいは必須チェック等は、最後にチェックせざるを得ない。
 (必須チェックを Exitイベントで行うコードを見かけますが、これは、そのコントロールにフォーカスがいかないと
  チェックそのものができない)

 ただ、そういう構成にしておくと、操作者からは、

 ・エラーなら、入力した時に知らせてくれよ!! あとから あれが違う、これが違うというのは不親切!!

 なんてクレームがでることもありました。
 でも、それは、その理由を説明して納得してもらいましたね。

 一方、今回のテーマは項目チェックというより、入力したものの「編集」ですね。
 よくあるのが、 1234 と 入力した時に 1,234 と編集したい というもの。

 かつ、『電卓効果』といいますか、入力とともに、数字のカンマ編集を行いたいということであれば
 CHangeイベントを使うのが簡単ということになります。

 ただ、入力を編集したものを、その入力欄に書き戻すと、データによっては訂正時の入力が面倒になるケースもあります。
 (編集ロジックにもよりますが、多くの場合は、いったん、入力されている文字列を選択してDeleteキーで消してから入力すればいいと思いますけど)

 また、気にしなければいいのですが、実際に自分が入力したものと、そこに表示されたものが異なっている。

 こういった場合、私のケースでは、TextBox の横に Label を配置して、TextBoxのValue からLabelのCaption に
 編集して表示。
 こういう構えにすることが多かったです。

 こういう構えにしても、『入力チェック』としてのタイミングは ???さん指摘のタイミングにすることを
 推奨しますが、入力時の表示だけということであれば、

 たとえば lbl納期 というLabelを用意して

 Private Sub 納期_Change()
    lbl納期.Caption = Format(納期.Value, "yyyy/mm/dd")
 End Sub

 こんなコードにしておくことも考えられます。

 まぁ、このあたりはそれぞれの考え方ですけど、検討してみるのもよろしいかと。

(β) 2017/01/26(木) 07:36


Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'修正版
    If IsDate(TextBox1.Value) Then
        If IsDate(Year(Date) & "/" & TextBox1.Value) Then TextBox1.Value = Year(Date) & "/" & TextBox1.Value
    End If
End Sub
(mm) 2017/01/26(木) 09:14

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.