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

解決済みの質問

日付の計算式についてアドバイスをお願いします

レコードソース無しのフォームにテキストボックスを三個作って、西暦月日「任意」を入力し日数「数値」を入力することで、後日「月日と曜日」と遡っての過去「月日と曜日」を知りたいと思っています。正直、計算フォーム「よろず計算用」として既に使っているフォーム「エリアに余裕」への追加になります。

I,フォーム名:計算フォーム
II,テキストボックス
1,テキストボックス名:西暦 = 西暦入力(英数半角)
2,テキストボックス名:日数 = 日数入力(英数半角)

 ・日 数:1日を1とする
 ・後 日:正の整数を入力
 ・遡り日:負の整数を入力(-数値)

3,テキストボックス名:対象日= 対象日表示

以上ですが、宜しくお願いします。

投稿日時 - 2017-04-11 14:56:01

QNo.9316278

困ってます

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

>クリックしないで「2017/05/08(月)」表示は可能でしょうか
クリックは関係ないです。書式の年のyは4つです。
yyyy/mm/dd(aaa)とyを1字除去して下さい
入力は同じ場所に西暦 2017/05/08 または 和暦 h29/5/8 で結果は同じです
書式の詳細は前回の参考URLの最後尾を参考にして下さい

投稿日時 - 2017-04-12 15:27:50

お礼

chayamati レベル12様へ
自分自身がもっと確りすべきでした「学習の場であることの初心忘れ」。お恥ずかしい限りです。最初のアドバイスで終了していた内容です。更には、学習用「教材」としてのアドレスも見ていませんでした。
http://www11.plala.or.jp/koma_Excel/contents1/mame1003/mame100301.html

最初のアドバイスの通り完了致しました。ありがとうございました。

投稿日時 - 2017-04-13 10:37:44

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

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

回答(6)

ANo.6

No3、No5の続きですが、
キー解放時のイベントを入れる場合は、更新後処理のイベントは
なくしておいてくださいね。

投稿日時 - 2017-04-13 10:18:59

ANo.5

クリックしないで表示するばあいは、当然ながらVBAコードを
書くようになります。
No3のテキストボックスの名前のままにしていますが、
数値をtx2に入力したときの「キー解放時」のイベントに
以下のようにします。
この場合は、
  CLng(Me!tx2.Text)
のように、tx2のTextプロパティを使用してキー入力の
データを先読みして日付処理の式にデータを渡して
処理をしています。

なお、一応念のためにClngとかCDateなどのデータ変換用の関数を
使っています。


Private Sub tx2_KeyUp(KeyCode As Integer, Shift As Integer)
On Error Resume Next
Me!tx3 = Format(DateAdd("d", CLng(Me!tx2.Text), CDate(Me!tx1)), "yyyy/mm/dd(aaa)")
End Sub


On Error Resune Nextを入れたのはtx1からtx2にフォーカスが
移動したときに先読みでデータを読み取るので空のデータが

Me!tx3 = Format(DateAdd("d", CLng(Me!tx2.Text), CDate(Me!tx1)), "yyyy/mm/dd(aaa)")

という処理式に渡ってエラー表示が出るのを阻止するためです。
なお、この場合他のエラー処理は入れていません。

なお、tx3には処理をしたデータが表示されますが、tx2の数値を
訂正して再度入力するときにtx2が空になったときにtx3にはデータが
残るので何となくブルーに感じるならば、以下のようにtx2の変更時の
イベントを入れておいてもいいです。

Private Sub tx2_Change()
If IsNull(Me!tx2) Then
Me!tx3 = ""
End If
End Sub

なお、日付処理などはAccessのヘルプに掲載さrているのでよく
読んでみてください。

投稿日時 - 2017-04-13 10:02:13

ANo.3

tx1、tx2、tx3はテキストボックスの名前です。
それぞれ以下のコード中のテキストボックス名を
実際に合わせて変更してください。

tx1  日付を入力
tx2  数値を入力
tx3  日付を表示

tx2に数値を入力した更新後処理のイベントに以下を
行ないます。なお、コード中にエラー処理を一括で入れていますが
tx1の更新後処理で日付であるかのチェックをいれてもいいです。

Private Sub tx2_AfterUpdate()
 If Not IsDate(Me!tx1) Then
   MsgBox ("日付の入力が不正です")
 Exit Sub
 End If
 If IsNull(Me!tx2) Then
   MsgBox ("数値を入力してください")
   Exit Sub
 End If
 If Not IsNumeric(Me!tx2) Then
   MsgBox ("数値を入力してください")
   Exit Sub
 End If
 '以下が日付の処理です。
 Me!tx3 = Format(DateAdd("d", CLng(Me!tx2), CDate(Me!tx1)), "yyyy/mm/dd(aaa)")
End Sub

投稿日時 - 2017-04-12 12:57:11

お礼

piroin654 レベル13様へ
アドバイスをありがとうございました。私のレベルが低すぎるために皆様へご迷惑をおかけしております。実は「yyyyy/mm/dd(aaa)」の記述で「y」が1個多かった事による表示の不具合でした。申し訳ございませんでした。

投稿日時 - 2017-04-13 10:26:53

ANo.2

ACCESSですね
・日付、時刻はシリアルナンバーという正の実数(少数点以上が日付で小数点以下が時刻)です。
・西暦、和暦は同じシリアルナンバーで表示形式(yyyy/mm/dd又はge/mm/dd)です。
ACCESSはEXCELに比べてい関数が少ないので、次のように基準日より処理しています。
この式はEXCELでも通用します。
Private Sub 基準日_AfterUpdate()
翌日 = 基準日-1
前日 = 基準日+1
月初日 = 基準日 - Day(基準日) + 1
月末日 = 月初日 + 31: 月末日 = 月末日 - Day(月末日)
End Sub

参考URL:http://www11.plala.or.jp/koma_Excel/contents1/mame1003/mame100301.html

投稿日時 - 2017-04-12 12:06:47

補足

有難うございます。ご面倒をお掛けしています。やり直してみましたところ下記の様になりましたので、ご報告させていただきます。

書式:yyyyy/mm/dd(aaa)

テキストボックス「非連結」名前「西暦」へ 2017/03/19 入力
テキストボックス「非連結」名前「日数」へ 50 入力

テキストボックス「非連結」名前「対象日」= 2017128/05/08(月) と表示。テキストボックスをクリックすると「2017/05/08」と表示されますが。クリックしないで「2017/05/08(月)」表示は可能でしょうか。


書式:ge/mm/dd(aaa)
テキストボックス「非連結」名前「西暦」へ 2017/03/19 入力
テキストボックス「非連結」名前「日数」へ 50 入力

テキストボックス「非連結」名前「対象日」= H29/05/08(月) と表示されました。

以上、宜しくお願いします。

投稿日時 - 2017-04-12 13:09:40

ANo.1

対象日のセルに、
=西暦のセル+日数のセル
と入力し、書式を
yyyyy/mm/dd(aaa)
にしてみて下さい。

投稿日時 - 2017-04-11 15:03:15

補足

aokii レベル14様へ
早速のアドバイス有難うございます。実施しましたところ下記の状況になっています。どこがおかしいのでしょうか、ご指導をお願いします。

テキストボックス「非連結」名:西暦 へ 2017/03/19 入力
テキストボックス「非連結」名:日数 へ 50 入力
テキストボックス「非連結」名:対象日 = 2017/03/1950 と表示

テキストボックス「非連結」名:西暦 へ 2017/03/19 入力
テキストボックス「非連結」名:日数 へ -50 入力
テキストボックス「非連結」名:対象日 = 2017/03/19-50 と表示

以上、宜しくお願いします。

投稿日時 - 2017-04-12 08:41:30