Microsoft Access 掲示板

6,644 件中 1 から 40 までを表示しています。
3

上記の投稿は私の投稿です。出先でログインせずに投稿してしまいました。

2
名前なし 2025/11/27 (木) 14:26:53 40184@3d35d

「重複のないデータを取得する」とのことですが、件数を取得するということでいいのでしょうか。
提示のコードは常に全データ件数になり、重複も含む件数になると思いますが。

'前略

    ReDim myArray(FlCnt, RcCnt) '二次元配列を再定義
    myArray = adoRs.GetRows    '全レコードを配列として取得

    x = 0
    Dim nbDic As Object
    Set nbDic = CreateObject("Scripting.Dictionary") 'Dictionaryを生成、Dictionaryの中身は空
    For i = 0 To RcCnt - 1
      If nbDic.exists(myArray(0, i)) = False Then '空のDictionary内にデータがあるか確認
                                                  '空なので存在するはずがない、常にFalse
         x = x + 1
      End If
     Next

    MsgBox x

件数を取得するなら下記のようなコードになると思います。

'前略

    ReDim myArray(FlCnt, RcCnt) '二次元配列を再定義
    myArray = adoRs.GetRows    '全レコードを配列として取得

    Dim nbDic As Object
    Set nbDic = CreateObject("Scripting.Dictionary") 'Dictionaryを生成、Dictionaryの中身は空
    For i = 0 To RcCnt - 1
      nbDic(myArray(0, i)) = myArray(0, i) 'データ配列の1列目をDictionaryに格納
                                           ’重複データは上書きされる
    Next

    MsgBox nbDic.Count  ’件数を表示

SELECT DISTINCTを使うと、少し負荷が大きいようで時間がかかります

重複をチェックするフィールドに インデックス(重複あり) を設定してありますか。
もし設定してないなら、設定すると飛躍的に速度は改善すると思います。

1

原因が分かりました
.Existsでした
sが抜けてました

2

ありがとうございました。
非常に分かりやすいコードです。

1

ざっとみたところ下記の箇所があきらかな間違いですので、修正してみてください。

-            With Sh1.Shapes.AddShape(msoOval, lef + wd / 2, h - 0.5, hg + 1, hg + 1)
+            With Sh1.Shapes.AddShape(msoshapeOval, lef + wd / 2, h - 0.5, hg + 1, hg + 1)
-             .Line.ForeColor.RGB = vbBlock
+             .Line.ForeColor.RGB = vbBlack

これでとりあえずはエラーなく動くと思います。

もし自分が書くなら下記のような感じになります。

Sub test1()
    With ThisWorkbook.Worksheets("申請書")
        Dim l As Single, t As Single, w As Single, h As Single
        With .Range("aK23:aL23")
            l = .Left
            t = .Top
            w = .Width
            h = .Height
        End With
        With .Shapes.AddShape(msoShapeOval, l + w / 2 - h / 2, t, h, h)
            .Fill.Visible = msoFalse
            .Line.Weight = 1
            .Line.ForeColor.RGB = vbBlack
        End With
    End With
End Sub

ちなみに、
ここは Microsoft Access に関する質問をする掲示板です。次回からは適切な掲示板で質問してください。

例えば、
エクセル質問掲示板 質問 疑問 使い方 掲示板 エクセル Excel [エクセルの学校]
Excel VBA を学ぶなら moug モーグ|Excel (VBA)

3
ヒロ 2025/11/12 (水) 20:16:30 c1459@a6874

ありがとうございます

こちらの記述で思う通りにできました

Private Sub 参加カテゴリ_Exit(Cancel As Integer)

    If Nz(Me.参加カテゴリ.Value) = "" Then
        Cancel = True 'フォーカス移動をキャンセル
        MsgBox "参加種目が選択されていません", vbOKOnly
    End If

End Sub

2

もし、テキストボックスにフォーカスある状態で未入力の場合はほかのコントロールにフォーカス移動を禁止したいという仕様がご希望なら、一般的には下記のような設計にします。

テキストボックスのフォーカス移動時のイベントプロシージャに下記のコードを設定します。

テキストボックス名が「参加カテゴリ」として、

Private Sub 参加カテゴリ_Exit(Cancel As Integer)

    If Nz(Me.参加カテゴリ.Value) = "" Then
        Cancel = True 'フォーカス移動をキャンセル
        MsgBox "参加種目が選択されていません", vbOKOnly
    End If

End Sub

これで未入力状態では他コントロールへ移動できません。

ただし、このフィールドを入力必須にしたいということなら、これでは不十分です。
このテキストボックスをとばして、他のテキストボックスへ移動したりして、レコード保存操作をすれば未入力のまま保存されます。

この場合は、テーブルデザインで入力必須の設定をするのが確実です。

1

Forms!F点数入力![1-1].SetFocus

この行で実行時エラーになるのでしょうか。

また、このコードはどこのどのイベントプロシージャに設定しているのでしょうか。

Sub から End Sub までのコード全体を提示してもらえると状況を把握しやすいです。

テキストBOX形式のフィールドが空欄の場合は処理を
停止したく下記のように記述しましたがメッセージも表示されず

どのような状況のときにどのような処理をしたいのかもう少し具体的に説明してください。

[参加カテゴリ]テキストボックスにフォーカスあり未入力(Null値)のとき、他のテキストボックスに移動させたくないということでしょうか。

2
ヒロ 2025/11/09 (日) 18:28:13 c1459@a6874

mayu  さん

ありがとうございました。
クエリの方で動作確認させていただきました!

1

順位: DCount("総得点","氏名クエリ","総得点>" & [総得点])+1

 
同着の順位付けは以下のように記述します

順位: DCount("*", "氏名クエリ"
            , "総得点 > " & 総得点 
                          & " OR ( 総得点 = " & 総得点 
                          & "        AND " 
                          & "      Nz(順位決定戦, 0) > " & Nz(順位決定戦, 0) 
                          & " )"
      ) + 1

 
ただし、DCount関数を使った順位付けは 重たい処理になりますから
クエリの表示速度に難があるようでしたら

hatenaさんが公開されている汎用関数 SetSequenceNumber

グループ毎連番を自動入力する関数
クエリで連番を表示する場合、DCount関数やサブクエリを利用する方法はあちこちで紹介されています。 しかし、この方法は自分より前のレコード件数をカウントするというロジックなのでレコード件数が多くなると幾何級数的に重くなります。また、グループ毎に連番を振るという仕様になると、条件式も複雑になってきます。 クエリは使わずにテーブルに連番フィールドを持たせて、そこに VBA で連番を書きこむようにすると高速...
fc2

を、ご自身のデータベースにインポートしておき、
以下のように呼び出し用のコードを記述して、適当なタイミングで実行するほうがいいでしょう
 

Sub sample()
    Rem // 関数の第一引数と第二引数は環境に合わせて変更して下さい
    Call SetSequenceNumber( _
             "順位を書き込むフィールド名", _
             "実際のテーブル名", , _
             "総得点 DESC, 順位決定戦 DESC" _
    )
End Sub
2
ヒロ 2025/11/04 (火) 13:57:49 c1459@a6874

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

コマンドボタンに下記記述でできました
本当にありがとうございました。


Private Sub コマンド71_Click()
Me![1投目得点].Locked = True
Me![2投目得点].Locked = True
Me![3投目得点].Locked = True

End Sub

1

詳細が不明瞭なのでとりあえずヒントだけ。

編集できないようにするにはテキストボックスのLocked プロパティを True に設定します。

    Me!テキストボックス名.Locked = True
3
beginner 2025/10/27 (月) 08:47:54 9eaf4@2128d

mayuさん ありがとうございます。(返信遅れて失礼しました)
サブクエリを使う手がありましたね。確かにこれは時間かければ辿り付いたかもしれません。
でもInStrは全く思いつきませんでした。またJOIN結合でLikeが使うのは絶対に浮かばないアイデアでしたので、勉強になりました。大変お世話になり、本当にありがとうございました。

5
hiroton 2025/10/27 (月) 01:16:50 bc5cb@2ee8f

確かなことはわかりませんが、そのまんま検索すると謎のバグが起きることがあるらしいという情報はありますね
https://www.google.com/search?q=2147467259:引数が無効です

4

データペースファイルの修復/最適化では修復できませんでした。
手入力した時に出てくるエラーメッセージは、「引数が無効です」でした。
表示された後に、データは入力されています。
何が無効なのか謎ですが、キャッシュがクリアされないでゴミがたまって壊れて壊れた的な状態のような気がします。

カラムが100くらいだと、この症状が出ることはないのですが、
150近くになると、データ型やカラム名を変更していると、たびたび発生するようになります。
officeでは、ここまでだよと言われれば仕方ないのですが、
カラム数にはまだだいぶ余裕があるはずですし。
データ処理に、もっと金使えよ~という事なんでしょうか、、、、、

どうしようもないので、新しくテーブルを作って、ALTER TABLEでカラムを作り直したので、普通に処理できています。

3

[整理番号]フィールドのデータ型はテキスト型(短いテキスト)ですよね。

複製テーブルに、手入力でデータを追加できますが、必ずではない状態です。
整理番号を手入力で追加してみた時も、エラーが出たこともありました。

このエラーが追加クエリでのエラーと同じ原因の可能性はありそうですか。

念のために下記の手順を試してみてください。

データペースファイルの修復/最適化の実行
それでだめなら、
新規にデータベースファイルを作成して、そこに元ファイルからすべてのオブジェクトをインポートして、この新規ファイルで試してみる。

2

設定に、違いはありません。
accessは、倉庫として利用しているので、テーブル同士のリレーションシップの機能は利用しておりません。
複製テーブルに、手入力でデータを追加できますが、必ずではない状態です。
整理番号を手入力で追加してみた時も、エラーが出たこともありました。
確か、無効なデータですのようなメッセージが表示された気がします。
-2147467259:引数が無効ですという事なのでしょう。

フィールド数は150程度なので、まだ余裕があります。
ただ、フィールド名やデータ型の変更があったため、これ以上変更できなくなったので構造を複製しました。
今までは、複製すると変更したカウントがチャラになって続行できたのですが、
今回は、この当たりが怪しい気がしておりますが、こんなことが起こるものなのでしょうか?

1

これだけの情報からは原因を特定するのは難しいです。

このような場合はまずは問題の切り分けをしましょう。
私なら下記のような手順をやってみます。

Accessから元テーブルと複製テーブルをデザインビューで開いて設定に違いがないか確認(データ型、インデックス設定など)
リレーションシップを開いて両者のテーブルのリレーションシップ設定に違いがないか確認
複製テーブルに手入力でデータを追加できるか確認
クエリで同様のSQLを設定して実行してみてデータ追加できるか確認

2

テーブルにある摘要欄(文字列フィールド)を
Like複数の文字列条件での抽出はクエリに Like "ABC" Or Like "DEF" Or ・・・・

条件部を他のテーブルに設定した値で可能でしょうか?
そうしておけば条件の変更追加も分かり易く簡単に出来る

 
達成目標に対し、行動目標や手段がそこまで明確なのですから
時間をかけてでも試行錯誤すれば、自ずからご希望の結果が得られたのではないか、と推測します

以下、結果セットが同じになるSQLの記述方法をいくつか載せておきます

 
■DDL

CREATE TABLE t_摘要 (
      x_id AUTOINCREMENT PRIMARY KEY
    , 摘要欄 VARCHAR(100)
);
CREATE TABLE t_条件 (
      y_id AUTOINCREMENT PRIMARY KEY
    , 条件部 VARCHAR(50)
);

 
■データ例

t_摘要

x_id摘要欄
1ABCDEF
2ACE
3DEFFE
4BAACD
5MBABC
6ONJBD
7B_DEF_ABCF
8DEABFC

 
t_条件

y_id条件部
1ABC
2DEF

 
■DML

SELECT * FROM t_摘要 x
WHERE EXISTS 
(
    SELECT 1 FROM t_条件 y
    WHERE x.摘要欄 Like '*' & y.条件部 & '*'
);
SELECT * FROM t_摘要 x
WHERE EXISTS 
(
    SELECT 1 FROM t_条件 y
    WHERE InStr( 1, x.摘要欄, y.条件部, 1 ) > 0
);
SELECT DISTINCT x.*
FROM t_摘要 x
   , t_条件 y
WHERE InStr( 1, x.摘要欄, y.条件部, 1 ) > 0
;
SELECT DISTINCT x.*
FROM t_摘要 x
INNER JOIN t_条件 y
        ON ( x.摘要欄 Like '*' & y.条件部 & '*' )
;

 
■結果

x_id摘要欄
1ABCDEF
3DEFFE
5MBABC
7B_DEF_ABCF
1
beginner 2025/10/24 (金) 08:57:48 9eaf4@2128d

質問に書き忘れたのですがLikeは部分一致の Like "*ABC*" ・・・です。
宜しくお願いします。

2
beginner 2025/10/21 (火) 12:52:42 9eaf4@2128d

hirotonさん ありがとうございます。
その後色々コード等変更等している内にCount(*)でも正常になりました。他の処理との兼ね合いだったかもしれません。様子見て見ます。お騒がせしました。

1
hiroton 2025/10/18 (土) 23:34:24 0fd4e@75660

シチュエーションの詳細が不明ですね
この場合のMe.[tx件数]Count(*)は完全に同一のものというわけではないので、特定の場合において、Count(*)のつもりでMe.[tx件数]を使用した場合に不具合が起こることはあり得ます

Count(*)Recordset.RecordCountはまず同一とみてかまわないですが

7
あん 2025/09/22 (月) 12:52:22 3a8f2@888cb

hiroton様、mayu様
情報ありがとうございます。

両方とも試してみます!
何とか解決法が見つかりそうで、うれしいです。

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

6
mayu 2025/09/21 (日) 22:14:05 修正 4f8cb@6c788

カレンダーによる入力をする際、
非連結テキストボックスの年と月を読み込んで、その月を表示させたい

 
ご希望のUIが搭載された 日付ピッカー は、おそらく以下で紹介するようなコンポーネントでしょう
 

Better Date Picker
A better date picker that works in both 32-bit & 64-bit Access and uses no ActiveX controls. The latest version automatically adjusts the form size depending on screen resolution and optionally translates the form captions to match the Office language. It also includes a week number feature
Isladogs on Access

 

なお、Colin Riddington(isladogs)氏作の日付ピッカーを利用する場合、
バージョン 1.5 や 1.6 は入力フォームでのコード量も少ないですし、説明動画も用意されていることから
ご自身で仕組みを理解し、運用なさることをお薦めします

5
hiroton 2025/09/19 (金) 18:16:16 2d761@f966d
Private Sub 日付カレンダー_Enter()
    Me!日付.TabStop = False
~(略)~
End Sub

Private Sub 日付カレンダー_LostFocus()
    Me!日付.TabStop = True
End Sub

この部分はキーボード操作向けのおまけ対策です

通常、[TAB]で次のコントロール[Shift]+[TAB]で前のコントロールに移動しますが、
・カレンダーを表示

・[ESC]でカレンダーを非表示

・[Shift]+[TAB]で前のコントロールに移動

とすると、「日付」テキストボックスに戻って「日付」テキストボックスのフォーカス取得時イベントが発生して再び「日付カレンダー」に戻ってくる(動かない)ので「日付」テキストボックスを飛ばしてさらにその前のコントロールに移動できるように制御しています

ついでに、いろいろ触っていたら、この状態([ESC]でカレンダーを非表示にした状態)で何か入力するとエラーが発生したので対策を置いておきます

Private Sub 日付カレンダー_Change()
    On Error Resume Next
    Me!次のコントロール.SetFocus
    If Err <> 0 Then
        DoCmd.RunCommand acCmdShowDatePicker
    End If
    On Error GoTo 0
End Sub

「何か入力」すると、たいていそれは日付として認識できないので、その状態でフォーカスを移動しようとしてエラーが発生します。とりあえず、エラーが発生したら何もしないで再度カレンダー表示に戻すって形で

4
hiroton 2025/09/19 (金) 15:49:49 修正 2d761@f966d

ACCESSの仕様的に「日付」テキストボックスだけではどうしようもないかなーと思ってます
直接入力を禁止し、カレンダーからしか選べないような形であれば、入力用のテキストボックスを使ってどうにかなるかもしれません

入力用に「日付カレンダー」テキストボックス(非連結)を用意します。プロパティを「0cm」にし、「日付」テキストボックスの左端に重なるように設置して見た目上見えないようにします

以下、VBAを使って、「日付カレンダー」(見えないテキストボックス)で日付選択カレンダーを表示し、カレンダーの日付選択時に「日付」テキストボックスに値を設定するサンプルです。

Private Sub 日付_Enter()
    Me!日付カレンダー.SetFocus
End Sub

Private Sub 日付カレンダー_AfterUpdate()
    Me!日付 = Me!日付カレンダー
End Sub

Private Sub 日付カレンダー_Change()
'//カレンダーの日付をクリックしたときに発生するイベント
'//ここで、別なコントロールに移動してAfterUpdateを発生させる
    Me!次のコントロール.SetFocus
End Sub

Private Sub 日付カレンダー_Enter()
    Me!日付.TabStop = False
    If IsDate(Me!日付) Then
        Me!日付カレンダー = Me!日付
    Else
        If IsDate(Me!対象年 & "/" & Me!対象月 & "/1") Then
            Me!日付カレンダー = Me!対象年 & "/" & Me!対象月 & "/1"
        Else
            Me!日付カレンダー = Null
        End If
    End If
    DoCmd.RunCommand acCmdShowDatePicker
End Sub

Private Sub 日付カレンダー_LostFocus()
    Me!日付.TabStop = True
End Sub

※カレンダーで選択した値を反映させるために変更時('change')イベントを使ってコントロールの移動('setFocus')をしています。「Me!次のコントロール」は適切なものを指定してください

3
あん 2025/09/19 (金) 11:57:44 3a8f2@888cb

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

テーブルは、「日付」 日付/時刻型フィールド

フォームは、このテーブルがレコードソースになってます。
単票形式フォームです。

非連結テキストボックス 「対象年」、「対象月」があります。
連結テキストボックス「日付」があります。

「日付」を入力する際、カレンダーが表示されますが、
「対象年」と「対象月」が入力されていたらその月のカレンダーを表示してほしいです。

hiroton様
非連結のテキストボックスに入力したら、連結テキストボックスは空欄の状態で、入力する際に日付カレンダーをその月で表示してほしいです。

非連結の月に絞って、ユーザーが連結テキストボックスでカレンダーから入力してほしいです。

どうでしょうか。

2
hiroton 2025/09/19 (金) 10:44:18 2d761@f966d

日付選択カレンダーを表示したときに選択されている日付は、コントロールに日付が入力されている場合はその日付、入力がない場合は「今日」になるようです
非連結の2つのテキストボックスの更新時で日付フィールドの連結テキストボックスに日付を入力するようにするか、新規レコードの場合であれば、規定値プロパティを変更しても反映されます

9

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

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_月初」テーブルから同じ年月の「家賃」の金額も追加したいです。

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

7

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

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

6

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

1
hiroton 2025/08/21 (木) 18:27:49 ecd92@f966d

文字ならコピペできます

デザインビューで対応していない高度なクエリ(unionクエリやサブクエリなど)を組むことができます

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

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

4

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

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

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

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_臨時休業日"))

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

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() &"#")
14
beginner 2025/08/05 (火) 11:29:44 61dd6@2128d

hatenaさん ありがとうございます。
各グループに段階的に1、-1持たして集計合計の形ですね。応用できる様に工夫してみす。
まずは参考分を理解するようにします。

13

下記のページの方法が参考になると思います。

レポートでの複雑な集計、グループ化(会計帳票) - hatena chips

簡単に説明すると項目マスターとは別に演算用のグループマスターを作成しておいてそれを結合して集計クエリにするという方法になります。