質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

442閲覧

accessについて

zerobemy

総合スコア14

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2020/10/05 06:12

編集2020/10/05 07:14

お世話になっております。
accessについて質問させてください。

車の保険を管理している帳票フォームがあります。
車の保険が3年契約だろうと1年契約だろうと次回保険提出日は1年後になります。

例えば
保険期間:2020/10/1~2021/10/1
この場合は提出期限が2021/10/1

保険期間:2020/10/1~2023/10/1
この場合も提出期限2021/10/1

このようになります。

フォームには、提出期限日と保険満期日のフィールドがあります。
私のしたいことは、保険保険期間が1年契約の保険だとそのまま1年後の満期日を提出期限に表示
保険期間が1年以外(2年3年4年5年・・・)だと満期日にかかわらず1年後の日時を表示させたいです。

  • 氏名:短いテキスト
  • 許可開始日:日付/時刻型

書類を提出した日を許可開始日にしています

  • 保険満期日:日付/時刻型

保険期間の始まりを入力するフィールドはなく、保険の満期日だけを入力しています。

  • 提出期限日:日付/時刻型

主なフィールドは上記になります。

また、現在日を基準にして提出期限日を計算しています。
hatena19様の
>今日は 2020/10/05 なので、 保険期間:2019/10/01~2022/10/01 なら、 提出期限日は 2021/10/01 ということですか。
こちらで合っています。

すごくややこしくて申し訳ありませんがこれができる方法をお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2020/10/05 06:49 編集

テーブルのフィールド名とそこに入力されているデータ例を出してもらえますか。 「保険期間」というテキスト型フィールドがあって、「2020/10/1~2021/10/1」とされいるのか、 あるいは、「保険期間開始日」「保険期間満了日」という日付/時刻型フィールドがあり 「2020/10/1」「2021/10/1」と入力されているか。 あるいは、それ以外なのか。 フィールド名は実際のもので具体的に提示してください。 あと、現在日を基準にして提出期限日を計算するのでしょうか。 例えば、今日は 2020/10/05 なので、 保険期間:2019/10/01~2022/10/01 なら、 提出期限日は 2021/10/01 ということですか。
guest

回答1

0

ベストアンサー

「保険満期日」の月日が、現在日付の月日より小さい(昨日以前)場合は、現在の年に+1した「保険満期日」の月日とする。

以下上記仕様の式(=提出期限日)

DateSerial(Year(Date()) - (Month(保険満期日) * 10 + Day(保険満期日) < Month(Date()) * 10 + Day(Date)), Month(保険満期日), Day(保険満期日))

Format()を使う方が若干式が短くなるし、分かり易いかも。

DateSerial(Year(Date()) - (Format(保険満期日, "MMDD") < Format(Date(), "MMDD")), Month(保険満期日), Day(保険満期日))

コントロールソースやクエリーの式としてそのまま記述するよりも、ユーザー関数にした方が保守性は良いと思います。

VBA

1Public Function 提出期限日(保険満期日 As Variant) As Variant 2 3 提出期限日 = DateSerial(Year(Date) - (Format(保険満期日, "MMDD") < Format(Date, "MMDD")), Month(保険満期日), Day(保険満期日)) 4End Function

投稿2020/10/05 16:49

編集2020/10/06 09:24
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zerobemy

2020/10/05 23:29

回答ありがとうございます。 上記3つとも試してみましたが、どれもうまくいきませんでした。 上2つは提出期限日のコントロールソースに設定しましたがnameエラーが出ます。 下のVBAはモジュールに書き込みましたがなにも反応がありませんでした・・・ なにか原因はありますでしょうか? お手数をおかけしますが再度お付き合い頂けたらと思います。
zerobemy

2020/10/05 23:34

追記です。 クエリの式としていれるとDateSerial(Year(Date) - (Format(保険満期日, "MMDD") < Format(Date, "MMDD")), Month(保険満期日), Day(保険満期日)) こちらのコードで、Year(Date)この部分がYear([Date])と表示されてしまいDate?というパラメータが出てしまいす・・・
sazi

2020/10/06 04:11

クエリーで確認しましたが問題ありませんでしたよ。 Accessのバージョンは何でしょう?
sazi

2020/10/06 04:12

VBAの部分はクエリーなどから呼び出す必要があります。
zerobemy

2020/10/06 05:39

accessのバージョンは2019になります。 クエリでの呼びだし方を教えて頂ければありがたいです。
sazi

2020/10/06 09:17

select 提出期限日(保険満期日) as 提出期限日 from テーブル のように記述します。
sazi

2020/10/06 09:26

> Year([Date])と表示されてしまいDate?というパラメータが出てしまいす・・・ この部分を訂正しました。貼り付けると勝手に[]が付いてしまうので、Date()として勝手に付加されないようにしました。 尚、保険満期日は必ず値が入っている前提でNull考慮はしていません。
zerobemy

2020/10/06 23:10

ありがとうございます! 反映しました! しかし、期限が切れているもの(現在の日付よりも前の日付)まで更新がかかり提出期限が伸びてしまいました・・・ 期限が切れているものはそのままそのままにしたいのですが可能でしょうか? 例えば、 任意保険日:2020/6/10 提出期限日:2020/6/10 にしたいです。 この式だと提出期限日が2021/6/10になってしまいます。。
sazi

2020/10/07 00:33 編集

> 満期日にかかわらず1年後の日時を表示させたい という条件から変更ですか。 式ならIIf()で、関数ならif文で判断すれば良いだけです。 iif(保険満期日 < Date(), 保険満期日, DateSerial(Year(Date()) - (Format(保険満期日, "MMDD") < Format(Date(), "MMDD")), Month(保険満期日), Day(保険満期日))) それから、満期日の閏年には対応していないので、2/29などが指定されることがあるとエラーになる年があります。
zerobemy

2020/10/07 00:30

ありがとうございました。
zerobemy

2020/10/07 00:33

とても助かりました。
sazi

2020/10/07 00:38 編集

貼り付けてOKだけだと応用が利かなくなりますよ。 詳しい解説はしていませんので、なぜこの式で実現できているのかを理解するように努めて下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問