- 締切済み
Accessのフォームのオープンのコマンド。
テーブル1 ・名前 ・誕生日 ・年齢 フォーム1 ・名前 ・誕生日 ・年齢 ・コマンドボタン コマンドボタンのコード Private Sub コマンド6_Click() Age_Keisan End Sub 関数Age_Keisanのコード Private Sub Age_Keisan() Dim Age As Integer Dim Birth_Y As Integer Dim Birth_M As Integer Dim Birth_D As Integer Dim Now_Y As Integer Dim Now_M As Integer Dim Now_D As Integer Birth_Y = Left([誕生日], 4) Birth_M = Right(Left([誕生日], 7), 2) Birth_D = Right([誕生日], 2) Now_Y = Left(Date, 4) Now_M = Right(Left(Date, 7), 2) Now_D = Right(Date, 2) Select Case Birth_M Case Is < Now_M Age = Now_Y - Birth_Y Me![年齢] = Age Case Is > Now_M Age = Now_Y - Birth_Y - 1 Me![年齢] = Age Case Is = Now_M Select Case Birth_D Case Is <= Now_D Age = Now_Y - Birth_Y Me![年齢] = Age Case Is > Now_D Age = Now_Y - Birth_Y - 1 Me![年齢] = Age End Select End Select End Sub となっています。 これですと、年齢を入れて、ボタンを押さないと誕生日が過ぎた場合、年齢が増えていきません。 クエリーを使用してフォームをつくればよかったのですが、テーブルから直接フォームを作成しているので 計算もできません。 できればフォームのオープンコマンドに上記のボタンと同じような機能を入れたいのですが、 どのようにすればいいのでしょうか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- ryuu001
- ベストアンサー率61% (46/75)
まだ締め切られていませんが、 何か 分からないことございますか?
- ryuu001
- ベストアンサー率61% (46/75)
> 1番最初に出てくるレコードと、レコード移動して見てみたものしか 変らないんですよね? レコード数は 1件ではないのですか? KODAMARさんの コードでは 複数レコードに対応されていないようです。 複数レコード対応にするには、yoishoさんの方法とか、 recordsetを使い、レコードの最初から最後まで読む方法をとります。 yoishoさんの ***具体的には、*** のところが良いと思います。 参考までに、recordset を使用する場合の例を書きます。 フォームを開いたときのイベントです。 Private Sub Form_Open(Cancel As Integer) Dim Db As DAO.Database Dim Rs As DAO.Recordset Set Db = CurrentDb() Set Rs = Db.OpenRecordset("テーブル1") Rs.MoveFirst Do Until Rs.EOF = True Rs.Edit Rs!年齢 = Int(DateDiff("d", Rs![誕生日], Now()) / 365) Rs.Update Rs.MoveNext Loop Rs.Close Set Rs = Nothing Db.Close Set Db = Nothing End Sub
- yoisho
- ベストアンサー率64% (331/516)
単にフォーム上の表示だけの目的でしたら、 フォーム1の [年齢] テキストボックスのコントロールソースを (テーブル1の [年齢] フィールドではなくて、) =Int(Format(Date(),"yyyy\.mmdd")-Format([誕生日],"yyyy\.mmdd")) としてやれば、現在の年齢が表示できると思います。 テーブル1 の [年齢] フィールドの値は [誕生日] の値から一意に決まります(しかも現在の日付によって変動する)ので、あえてフィールドとして持つ必要はないと思うのですが、 もし、その後の計算の簡略化等の目的で、どうしても必要なら、 フォーム1の Openイベントで、(更新クエリーのSQLを利用して)テーブル1の [年齢] の値の更新を行えば、全ての年齢データの更新が可能だと思います。 具体的には、 Private Sub Form_Open(Cancel As Integer) DoCmd.RunSQL "UPDATE テーブル1 SET テーブル1.年齢 = " _ & "Int(Format(Date(),""yyyy.mmdd"")-Format([誕生日],""yyyy.mmdd""))" End Sub または、(むしろ、こっちの方がわかりやすいでしょうか?) DoCmd.RunSQL "UPDATE テーブル1 SET テーブル1.年齢 = " _ & "IIf(Format([誕生日],""mm/dd"")<=Format(Date(),""mm/dd"")," _ & "DateDiff(""yyyy"",[誕生日],Date()),DateDiff(""yyyy"",[誕生日],Date())-1)"
- ryuu001
- ベストアンサー率61% (46/75)
フォーム オープン時のイベントに登録します。 フォーム のプロパティの イベントに ”開く時”があります。 そこを [イベント プロシージャ]にして vbaにコードを書けばOKです。
お礼
回答ありがとうございます。 フォームの「開く時」に質問文で書いたコード、もしくは 「Age_Keisan」といれてフォームを開くと 実行時エラー'2448': このオブジェクトに値を代入することはできません。 と出てしまうのです。 仕方ないので、フォームの読み込み時とレコード移動時に 「Age_Keisan」としてみたのですが、これですと、 1番最初に出てくるレコードと、レコード移動して見てみたものしか 変らないんですよね? それだともしかしたら洩れがあるかもしれないのでなんとか 「開く時」のイベントで何とかできないかと思っているのですが。 よろしくお願いします。