こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

Access コントロールに設定した書式の例外?

お世話になります。
Win 7
Access2013
歴史の出来事を学ぶデータベースを作成途中で、困った事に出くわしました。
テーブルのフィールドとして
・事象ID
・発生日
・見出し
・内容
と言うフィールドがあり、これを元にデータビューフォームを作成して一覧にしています。
そしてフォームの
「発生日」には書式設定で yyyy/mm/dd として、別に、新しいコントロールを作成して
コントロールソース = 発生日とし、書式設定を gee年mm月dd日(aaa)として
邦暦でも一目で解るようしています。
それと、別にコントロールを配して、 " あれから 000年" と事象が発生してから何年経ったか
を誕生日を求める式で
=DateDiff("yyyy",[発生日],Date())+(Format([発生日],"mmdd")>Format(Date(),"mmdd"))
「あれから 44年」とか見えるようにしています。

ところが、歴史の書物の中には、歴史的事象の発生日を 「1867年7月」としか書いて
いないものが多く、「発生日」に 1867/07/ と入力しても、 
「このフィールドに入力した値が正しくありません」と表示されてしまいます。

そこで、この「発生日」に、1867/07/  や 1560 と入力しても、入力できて、
「あれから 120年」とか表示されるようにならないものでしょうか?

何卒、よろしくお願いいたします。

投稿日時 - 2016-03-14 15:55:54

QNo.9142982

困ってます

質問者が選んだベストアンサー

追記。

イベントプロシージャで何とかする場合、以下のようにします。

1.「入力用テキストボックス」を作成し、「コントロールソース」を空欄(非連結)にし、定型入力を「0000/99/99;;_」にして「定型入力中の文字を含めずに保存する」に設定する。

2.「入力用テキストボックス」の「更新後処理」に、以下のイベントプロシージャを書く。

Private Sub 入力用テキストボックス_AfterUpdate()
Dim 入力文字 As String
入力文字 = [入力用テキストボックス]
If Len(入力文字) = 4 Then
入力文字 = 入力文字 & "01"
End If
If Len(入力文字) = 6 Then
入力文字 = 入力文字 & "01"
End If
[入力用テキストボックス] = 入力文字
[更新用テキストボックス] = Left(入力文字, 4) & "/" & Mid(入力文字, 5, 2) & "/" & Mid(入力文字, 7, 2)
End Sub

3.「更新用テキストボックス」を作成し、「コントロールソース」を「発生日」にし、定型入力を「日付(S)」にして「可視」を「いいえ」に設定する。

4.「フォーム」の「レコード移動時」に。以下のイベントプロシージャを書く。

Private Sub Form_Current()
[入力用テキストボックス] = Format([更新用テキストボックス], "yyyymmdd")
End Sub

このようにすると「年4桁を入力した段階でENTERキーを押す」「年4桁、月2桁を入力した段階でENTERキーを押す」と、勝手に「1月1日」や「1日」が補われます。

投稿日時 - 2016-03-14 17:20:46

補足

chie65535様
うぎゃ~...と思ってしまいました。

しかし、ご教示いただき誠にありがとうございます。
じっくり取り組みたいと思います。
不明な箇所が出てきたら、再度お願いするかもしれませんが、その節には
よろしくお願いします。
まずは、やってみたいと思います。

投稿日時 - 2016-03-14 17:54:50

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(6)

ANo.6

>入力時にやっちゃったほうが、「簡単」じゃないか?
>と思ったりしているところでございます。

Accessのテキストボックスの仕様の問題で「入力時」にやると問題が出ます。

最初、当方もそう考えて、入力時に桁を補おうとしてハマりました。

それと、例示したプログラムは「ヌルの時(空欄のままEnterを押した時)の対処をしてない」ので、空欄の状態でEnterを押すと「nullの使い方が~~~」と言うエラーで止まってしまいます。

投稿日時 - 2016-03-15 15:26:07

お礼

chie65535様
ご返信ありがとうございます。

「入力時にやる」と言いますのは、『「うぎゃ~」のプロシージャは記述せずに、発生日を入力時にyyyy年01月01日と入力する』のでも、同じ事?

だと、思ったのですが...? 話がかみ合っていなければ、すみません。


 

投稿日時 - 2016-03-15 16:38:17

-広告-

ANo.5

追記。

例示したプログラムは「手抜き」で「4桁入力された時」と「6桁入力された時」しか対処していません。

実際に運用する場合は「5桁入力された時」「7桁入力された時」のような「不正な入力」は更新を拒否するようにしましょう。

具体的には「更新前処理」のイベントプロシージャに、以下のコードを書きます。

Private Sub 入力用テキストボックス_BeforeUpdate(Cancel As Integer)
Dim 入力文字 As String
入力文字 = [入力用テキストボックス]
If Len(入力文字) = 5 Or Len(入力文字) = 7 Then
Cancel = True
End If
End Sub

投稿日時 - 2016-03-15 10:39:58

お礼

chie65535様
ご教示くださいまして誠にありがとうございます。

最初にお示しくださった「うぎゃ~」のプロシージャにつきまして
最後まで、拝見いたしましたところ、年の後に01月01日が補われる
のであれば、入力時にやっちゃったほうが、「簡単」じゃないか?
と思ったりしているところでございます。

もう少し納得の出来る方法がないか、考え中でございますので、このようにさせていただきます...と言う解決策が出たら、ご報告させていただきますね。

投稿日時 - 2016-03-15 13:40:02

ANo.4

southbreeze さんへ
こういうのは、日にちのデータをそのまま信じてよいか、便宜上1日を入れているに過ぎないという区別をYes,No型で入力しておくと良いと思います。1日が真になることは滅多にないと思いますが、絶対にないものでもないですから、〇年〇月1日の1日を必ず偽とは言い切れないと思います。Yes,Noの区別を付けておいて、IIFで条件分岐して表示することを考えると良いと思います。

投稿日時 - 2016-03-14 22:42:13

お礼

panacon様
ご回答ありがとうございます。そうですねぇ?

今まで記録した中で01月01日を検索してみると、豊臣秀吉は1537年01月01日に誕生した(Wikepediaの一説)とあり、史実のようです。
但し、長宗我部元親は1539年01月01日と便宜上記載しているのですが、こちらは真偽は不明となっています。

そもそも、良く調べてみましたら、今の暦を利用するようになったのは、明治6年からだそうで、それ以前は陰暦が使用されていて、現在の日にちとは違うようなのです。ですので、それ以前の出来事については、暦はどの暦での日か?というのを考える必要がありそうです。

やはり、発生日には yyyy/mm/dd と月日が不明なものについては01/01と入力して、「真」又は「偽」のyes, noが良いのかもしれません。

ご回答ありがとうございます。

投稿日時 - 2016-03-15 09:10:51

ANo.3

>イベントプロシージャといいますのは...? 書き方が解らないのですが...?

添付画像のようにして、プロパティを開いて、イベントを書きたい項目の右の「・・・」を押して「ビルドの選択」が出たら「コード ビルダ」を選んで、プログラムを書いて下さい。

投稿日時 - 2016-03-14 17:34:49

お礼

chie65535様

図を添付してくださりありがとうございます。

投稿日時 - 2016-03-14 18:02:08

ANo.1

>そこで、この「発生日」に、1867/07/  や 1560 と入力しても、入力できて、

それは「直接には不可能」なので「年しか判らないなら1月1日にしておく」「年月しか判らないなら1日にしておく」しかありません。

こういう事がやりたいなら「非連結のテキストボックス」を用意して「値が更新されたら実行するイベント」を呼び出して、イベントプロシージャで

・年4桁だけ入力されたら「/1/1」を補って、発生日を更新する

・年4桁、/、月2桁の7文字を入力されたら「/1」を補って、発生日を更新する

・年4桁、/、月2桁、/、日2桁を入力されたら、そのまま発生日を更新する

という処理をしないといけません。

投稿日時 - 2016-03-14 16:30:18

補足

chie65535様
早々のご回答ありがとうございます。
そうですねぇ...! やはり書式設定をしていると、そうなるのですね?

・年4桁入力したら、「/1/1」を補う
・年4桁、/,月2桁を入力したら「/1」を補う

イベントプロシージャといいますのは...? 書き方が解らない
のですが...?

ご存知なら、お教えいただけませんか?

何卒、よろくしくお願いいたします。

投稿日時 - 2016-03-14 16:53:07

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-