プロが教える店舗&オフィスのセキュリティ対策術

Accessについてです。
フォームの「年齢」のコントロールソースに、年齢が自動計算できるよう
=DateDiff("yyyy",[生年月日],Date())+(Format([生年月日],"mmdd")>Format(Date(),"mmdd")) & "才"
と入れましたが、フォームはきちんと自動計算されて年齢が表示されるのですが、テーブルには反映されません(コントロールソース「年齢」を選択しなければやはりなにも反映されないのでしょうか)
テーブルに反映させるにはどうしたらよいのでしょうか。

質問者からの補足コメント

  • 初心者のためできれば具体的に詳しい手順を知りたいです。

      補足日時:2016/05/20 11:18
  • 単純に

    年齢 = DateDiff("yyyy",[生年月日],Date())+(Format([生年月日],"mmdd")>Format(Date(),"mmdd")) & "才"

    で解決しました。ありがとうございました。

    No.11の回答に寄せられた補足コメントです。 補足日時:2016/05/24 17:17
  • 単純に

    年齢 = DateDiff("yyyy",[生年月日],Date())+(Format([生年月日],"mmdd")>Format(Date(),"mmdd")) & "才"

    で解決しました。ありがとうございました。

    No.10の回答に寄せられた補足コメントです。 補足日時:2016/05/24 17:17

A 回答 (11件中1~10件)

途中から失礼します。


『計算で求められるものはテーブルに保存しない』のが原則かと思います。
テーブルに保存した場合には現時点での年齢を求めるために
更新クエリを毎回行わねばなりません。
なので、
テーブルからは年齢フィールドは削除し、クエリに演算フィールドを設定します。
テーブル1が
ID    オートナンバー型
氏名   テキスト型
生年月日 日付時刻型
・・・
のデザインで
ID 氏名  生年月日
1 ポチ  2006/04/01
2 トラ  2010/10/10
のようなデータが入っているとします。

クエリを新規作成して添付図のようにします。(読めるかな)
デザイングリッドの、年齢:DateDiff("yyyy",・・・・は画面スペース上途中で切れていますので
年齢: DateDiff("yyyy",[生年月日],Date())+(Format([生年月日],"mmdd")>Format(Date(),"mmdd"))
にします。
『才』を入れた状態にしたいのなら
年齢フィールドのどこかで右クリックしプロパティを表示させ
書式欄に、0\才
とします。
このクエリをフォームのレコードソースにしてください。
年齢フィールドは数値型のままなので右詰で表示されますし
抽出や平均年齢などの計算もやりやすくなるかと思います。
「【Access】フォームで自動計算した年」の回答画像11
この回答への補足あり
    • good
    • 0
この回答へのお礼

遅くなりましたが回答ありがとうございました。

クエリでもできましたがどうしてもテーブルに反映させたいのです。

年齢の更新後処理のイベントプロシージャで

Private Sub 生年月日_AfterUpdate()
年齢 = Year(date())-Year([生年月日])
End Sub

でテーブルにも反映させることができましたが
単純にいまの年2016から生まれ年を引いた数に
なってしまいます。。

お礼日時:2016/05/24 17:11

遅くなりました。


ちょっとまとめますね。
年齢のコントロール名をtxt年齢、生年月日のコントロール名をtxt生年月日とします。どちらもテキストボックスです。

Private Sub txt生年月日_AfterUpdate()

txt年齢= DateDiff("yyyy",[生年月日],Date())+(Format([生年月日],"mmdd")>Format(Date(),"mmdd")) & "才"

End Sub

これでいけると思うんだけど…
この回答への補足あり
    • good
    • 0
この回答へのお礼

遅くなりましたが回答ありがとうございました。

年齢の更新後処理のイベントプロシージャで

Private Sub 生年月日_AfterUpdate()
年齢 = Year(date())-Year([生年月日])
End Sub

でテーブルにも反映させることができましたが
単純にいまの年2016から生まれ年を引いた数に
なってしまいます。。

お礼日時:2016/05/24 17:10

参考になるかな?


http://accessvba.pc-users.net/form/event.html

エラーが出ます?
    • good
    • 0
この回答へのお礼

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

今日は時間がなくなってしまったので明日またチャレンジしてみますTT

お礼日時:2016/05/20 17:58

おしい!


年齢のコントロール名=DateDiff("yyyy",[生年月日],Date())+(Format([生年月日],"mmdd")>Format(Date(),"mmdd")) & "才"

ちなみに、テーブルの方の年齢のデータ型は文字列になってます?数値型だとエラーになると思います。

隣の席なら、すぐ解決するんですけどね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
コントロール名はプロパティシートの名前とはちがうのでしょうか。
データ型はテキスト型にしています。

お礼日時:2016/05/20 17:38

あ、もしかして、フォームのプロパティ画面に貼り付けちゃいました?


もしそうなら、更新後処理のイベントプロシージャ内に記述してください。

アクセスをしばらく触ってないもので、細かいところは忘れてます…
    • good
    • 1
この回答へのお礼

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

Private Sub 生年月日_AfterUpdate()

= DateDiff("yyyy",[生年月日],Date())+(Format([生年月日],"mmdd")>Format(Date(),"mmdd")) & "才"

End Sub

ではおかしいですよね…TT

お礼日時:2016/05/20 16:57

年齢コントロールの名前はそのまま(年齢)でいいですよ。

つまり、年齢コントロール名もコントロールソースも「年齢」と。(なんかややこしいですね。)

こういう名前とフィールドの混同があるので、出来ればコントロール名はフィールドと同一にしないほうがいいんですよね。

出来ました?
スマホなんで、遅くてすいません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。こちらこそ何度もすみません。

年齢コントロール名もコントロールソースも「年齢」、
生年月日の更新後処理を=DateDiff("yyyy",[生年月日],Date())+(Format([生年月日],"mmdd")>Format(Date(),"mmdd")) & "才"
にしましたが、できません。。
更新後処理のところはイベントプロシージャは使用しなくて良いのですよね?

お礼日時:2016/05/20 15:56

であれば、生年月日のコントロールの中に「更新後イベント」があると思います。


そこに記述してください。

年齢コントロール名=年齢コントロールソースの計算式。

生年月日のコントロール名は[生年月日]となっていれば、そのままコピペでいけると思います。
カーソル移動時に反映されます。(たしか)

年齢コントロールのコントロールソースが、テーブルの年齢フィールドに設定されていれば反映されていると思います。

※もし反映されていない場合は、レコード移動時かもしれません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
生年月日の「更新後処理」に=DateDiff("yyyy",[生年月日],Date())+(Format([生年月日],"mmdd")>Format(Date(),"mmdd")) & "才"
年齢の「名前」にも=DateDiff("yyyy",[生年月日],Date())+(Format([生年月日],"mmdd")>Format(Date(),"mmdd")) & "才"
年齢のコントロールソースは「年齢」にするということでしょうか。
何度も申し訳ないです。

お礼日時:2016/05/20 14:19

では、どのタイミングで更新したいのでしょうか?



登録ボタンが一般的ですが、更新クエリという方法もあります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
タイミングとしては、フォームで生年月日入力→年齢自動計算されて勝手に表示される
→登録ボタンを押して登録→テーブルを開くと反映されているという感じを考えています。

お礼日時:2016/05/20 13:52

ちなみに、「連結されている」とは、コントロールの値とテーブルの値が連動していて、かつ、フォームの方を変更するとテーブルも変更される状態のことを言います。



見た目が同じなんで、間違いやすいですけどね。
    • good
    • 0

なるほど、分かりました。



まず、フォームの年齢テキストにはテーブルの生年月日を取得し、年齢を計算するという式が設定されています。これは連動はしますが、連結はされていません。
なので、そのフォームのどこかにテキストボックスを追加して、そのテキストのコントロールソースをテーブルの年齢と連結させてください。
コントロールソースに[年齢]でいけると思います。

よくある勘違いなんですが、フォームを自動生成すると、テーブルのフィールド名とテキストボックスの名前が同じになってしまうんで、連結している、と勘違いしてしまいます。実際は、コントロールソースの方が重要なんです。

で、その新しく作成したコントロールに年齢を手入力するとテーブルに反映されてると思います。

ここまで確認できたら、あとはどのタイミングで反映させるかだけです。

理解できました?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
実際にやってみて理解できましたが、フォームには年齢欄が2つになってしまうということですか?
>新しく作成したコントロールに年齢を手入力する
作業なくして実現するのは不可能なのでしょうか。

お礼日時:2016/05/20 13:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A