Microsoft Access 掲示板

営業日数

9 コメント
views

お世話になります。
飲食店の日報をフォーム上で入力する時、その日が何営業日目かという計算式を教えてください。

月曜日が定休日なので
例えば今日が8月1日(金)ですと、営業日1日目なので日報フォーム上の「営業日数(非連結)」に1と表示
今日が8月5日(火)ですと、4と表示させたいです。
しかし万が一8月3日(日)を臨時休業としてた場合は、8月5日(火)の日報入力フォームは3と表示させたいです。

また、下記の計算方法も教えてください。
このフォームのレコードソースは「T01_日報」となっていて日々の総売上等を記憶しています。
このフォーム上にある「その他日割り(非連結)」について、入力日までの総売り上げの合計を、上記で求め方を聞いた
「営業日数(非連結)」で割った答えを出したいです。

こちらのフォームは単票フォームで移動ボタンとかをなくし、保存と閉じるボタンをつけて保存を押さないと
テーブルに追加できない仕様にしていますが、総売り上げを入力したタイミングで、そのレコードを含めた今までの
総売り上げの合計を足して、「営業日数(非連結)」で割った値を「その他日割り(非連結)」に表示させることは
可能でしょうか?
宜しくお願いいたします。

名前なし
作成: 2025/08/21 (木) 01:07:33
通報 ...
1
hiroton 2025/08/21 (木) 10:09:05 4750b@f966d

今日を求める関数: Date()
日付から日部分を求める関数: Day()
今日の日の部分を求める計算式: Day(Date())

月曜日が定休日なので

当月において、「今日」までの定休日の日数を数える計算式: DateDiff("ww",Date()-Day(Date()),Date(),vbMonday)
※DateDiff関数を使って、先月末日から該当曜日(月曜日)を何回跨いだか?を計算します

定休日を除いた日数: Day(Date())-DateDiff("ww",Date()-Day(Date()),Date(),vbMonday)

しかし万が一8月3日(日)を臨時休業としてた場合は、8月5日(火)の日報入力フォームは3と表示させたいです。

このような情報は余人の知るところではないので、目的に合わせたデータが必要です。例えば「T_臨時休業日」のようなテーブルを作成し、日付のデータを登録します

今日までの当月の臨時休業の日数: DCount("*","T_臨時休業日","日付 Between #" & Date()-Day(Date())+1 & "# And #" & Date() &"#")

上記と組み合わせて次の計算式で営業日数が求められます

Day(Date())-DateDiff("ww",Date()-Day(Date()),Date(),vbMonday)-DCount("*","T_臨時休業日","日付 Between #" & Date()-Day(Date())+1 & "# And #" & Date() &"#")

※どうせ休日を登録するテーブルが必要ならば、単に「T_休業日」として月曜日(定休日)の日付もすべて登録するという方法も考えられます


「営業日数(非連結)」に表示するには、そのまま非連結であってほしい(手入力が可能な状態にしたい)のであれば、VBAを使って適宜上記計算式を呼びだします
たとえば、フォームを読み込んだ時であれば、フォームの読み込み時イベントに[イベント プロシージャ]を設定し当該フォームのモジュールに以下のように記述します

Private Sub Form_Load()
    Me!営業日数 = 営業日数取得
End Sub

Function 営業日数取得()
    営業日数取得 = Day(Date) - DateDiff("ww", Date - Day(Date), Date, vbMonday) - DCount("*", "T_臨時休業日", "日付 Between #" & Date - Day(Date) + 1 & "# And #" & Date & "#")
End Function

特に営業日数を変更するようなことがないのであれば「営業日数」のコントロールソースに上記計算式をそのまま記述してもよいでしょう。ただし、vbMondayのようなVBA内でのみ使えるような定数は書き換える必要があります

=Day(Date())-DateDiff("ww",Date()-Day(Date()),Date(),2)-DCount("*","T_臨時休業日","日付 Between #" & Date()-Day(Date())+1 & "# And #" & Date() &"#")
2
hiroton 2025/08/21 (木) 10:56:13 4750b@f966d

続く集計も同様に計算させます
総営業日や定休日を自動計算させる場合の定休日の日数を求めるため、日報を記録し始めた最初の日を取得しておきます
計上の起算日: DMin("日付","T01_日報")

総売り上げの合計は、現在入力中のフォーム上の値を使うことになりますが、未入力状態だとNullになってしまうのでNz関数で補正しておくと良いでしょう

(DSum("総売り上げ","T01_日報")+Nz([総売り上げ],0))/Date()-DMin("日付","T01_日報")+1-DateDiff("ww",DMin("日付","T01_日報"),Date(),2)-DCount("*","T_臨時休業日"))

※「日報フォームを遡って表示する」ということを考えていないのでデータの最終日のチェック部分は含んでいません

3

ありがとうございます!!
完璧にやりたいことができました。
臨時休業がある時のみ、その日を該当テーブルに登録する処理を追加して教えていただいたコードを記述することにします。
下記2点についても、お手すきの際ご教授ください。。。


「客単価(非連結)」を求める式で、希望の答えになりません。
「総売上」フォーカス喪失時に、客単価.requeryをしていて、
客単価には下記式を入力していますが、結果がつねに0になります。
=IIf([総売上]<>0,Int([客数]/[総売上]+0.5),0)
総売上、客単価は通貨型、客数は数値型です。宜しくお願いいたします。


このフォーム「F01_日報」のレコードソースは「T01_日報」ですが、フォーム上の「総売上」を
更新したタイミングでその合計値を加算して「その他日割り(非連結)」に表示することはできますか?
このフォームは保存と閉じるのボタンがあり、保存クリック時にイベントを発生させています。
やはり、T01_日報のレコードに保存されてからでないと入力中のレコードの値は利用できませんか?

Private Sub 保存_Click()
On Error Resume Next
    strMsg = "登録しますか?"
    DoCmd.GoToRecord , , acNewRec
End Sub

Private Sub 閉じる_Click()
On Error Resume Next
    strMsg = "登録して閉じますか?"
    DoCmd.RunCommand acCmdSaveRecord
    If Not Me.Dirty Then DoCmd.Close
    End Sub

よろしくおねがいいたします😣

4

お世話になります。
二つ目のご回答いただいていることに今気が付きました。
2番目の質問はそちらでできそうですね!ありがとうございます

5
token 2025/08/21 (木) 18:08:35 dc26a@20372

[客数]/[総売上]ではなく[総売上]/[客数]なのでは?

6

は!本当そのとおりですね!できました。ありがとうございます!!!!😅

7

こちらで教えていただいた下記式について
T01_日報の総売上の合計を取得する際、「F01_日報」上の日付の年月を指定して合計値を求めたい場合はこの式のどこに追加したらいいですか?
これに加えて「T01_月初」テーブルから同じ年月の「家賃」の金額も追加したいです。
宜しくお願いいたします。

(DSum("総売り上げ","T01_日報")+Nz([総売り上げ],0))/Date()-DMin("日付","T01_日報")+1-DateDiff("ww",DMin("日付","T01_日報"),Date(),2)-DCount("*","T_臨時休業日"))

8
hiroton 2025/08/25 (月) 13:14:27 b296d@f966d

最初に訂正を
>> 2ですが、なんでかかっこが漏れているところがありました

(DSum("総売り上げ","T01_日報")+Nz([総売り上げ],0))/(Date()-DMin("日付","T01_日報")+1-DateDiff("ww",DMin("日付","T01_日報"),Date(),2)-DCount("*","T_臨時休業日"))

(DSum("総売り上げ","T01_日報")+Nz([総売り上げ],0))/(Date()-DMin("日付","T01_日報")+1-DateDiff("ww",DMin("日付","T01_日報"),Date(),2)-DCount("*","T_臨時休業日"))


定義域集計関数と呼ばれる関数(D○○の名前を持ついくつかの関数)はおおよそ同じような記述を行い、「(フィールド名, テーブル/クエリ名, 抽出条件)」のように引数を取ります

すでに出ている例では

DCount("*","T_臨時休業日","日付 Between #" & Date()-Day(Date())+1 & "# And #" & Date() &"#")

で使っていて、抽出条件部分は"日付 Between #" & Date()-Day(Date())+1 & "# And #" & Date() &"#"、実際に計算されるときは例えば

日付 Between #2025/8/1# And #2025/8/25#

のような文字列となって処理されます。この部分がSQLのWhere句に相当する部分となります


任意の日付を用いて特定の年月を対象としたいのであれば、「F01_日報」フォーム上に計算式を作るとして、上記計算では「今日(=Date())」としていたところをフォーム上のコントロールの参照に置き換えます
フォーム上の日付が最大の日付になる場合

"日付 Between #" & [日付]-Day([日付])+1 & "# And #" & [日付] &"#"

さかのぼりで登録することを想定する場合([日付]よりも後の日付がテーブルに保存されている場合=月末日付を求める必要がある場合)

"日付 Between #" & [日付]-Day([日付])+1 & "# And #" & DateSerial(Year([日付]),Month([日付])+1,0) &"#"

「日付」が入力されるまでは計算式はエラーになるので、Nz関数で補正して、未入力の場合は「今日」で仮に計算する等するとよいかもしれません([日付]Nz([日付],Date())

この抽出条件をそれぞれの定義域集計関数部分に指定してあげてください

DSum("総売り上げ","T01_日報")
↓
DSum("総売り上げ","T01_日報","日付 Between #" & [日付]-Day([日付])+1 & "# And #" & DateSerial(Year([日付]),Month([日付])+1,0) &"#")

これに加えて「T01_月初」テーブルから同じ年月の「家賃」の金額も追加したいです。

多分同様にできると思うので、まずはやってみてください

9

ありがとうございます!とても嬉しいです!
やってみます。