[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
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
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.