Microsoft Access 掲示板

サブフォームのデータを上書きする方法について

3 コメント
views
4 フォロー

以前、こちらのコミュニティでお世話になった者です。
前回はご丁寧かつ分かりやすく教えていただきありがとうございました。

この度、行き詰まってしまった部分があり、ご相談させていただきたく存じます。

前に教えていただいた、フォーム上で指定した月数分のデータをサブフォームに追加するマクロですが、
こちらに「データを上書きする」機能を加えたいと思っております。

例えば、まず1月~5月分のデータをコマンドボタンで登録し、その後3月~5月のデータのみ上書きしたい場合、
これまでだと今までのデータを手動で消して新たに追加しておりましたが、
上書きすることで1月~2月分のデータはそのままに、3月~5月のデータだけを上書きするようにしたいです。

もし、3月~6月分を新たに登録するとした場合、3月~5月分まで上書きし、
6月分を新しく登録できるようにしたいです。

画像1

'契約期間の差から請求月数を算出
Dim startDate As Date: startDate = DateSerial(Me.開始年, Me.開始月, 1)
Dim monthNum As Long: monthNum = DateDiff("m", startDate, DateSerial(Me.終了年, Me.終了月, 1))

'請求月数の分だけ、サブフォームにレコードを追加する
Me.S_登録の月額サブフォーム.Form.AllowAdditions = True
Dim i As Long, s As Long
    If Me.入金月頻度 = "1ヶ月" Then
    s = 1
    ElseIf Me.入金月頻度 = "2ヶ月" Then
    s = 2
    ElseIf Me.入金月頻度 = "半年" Then
    s = 6
    ElseIf Me.入金月頻度 = "1年" Then
    s = 12
    End If

With Me.S_登録の月額サブフォーム.Form.Recordset
    For i = 0 To monthNum Step s
        'レコードがない場合、そのまま追加する
        If .RecordCount = 0 Then
            .AddNew
            Call レコードの追加および編集(i, startDate)
            .Update
        Else
            '既に同じ入金月が入力されている場合
            Dim rs As Recordset: Set rs = CurrentDb.OpenRecordset("T_月額マスタ_仮", dbOpenDynaset)
            rs.FindFirst "入金月 = #" & Format(DateAdd("m", i, startDate), "yyyy\月m\月") & "#"
                rs.Edit
                rs![契約番号] = Me.txt契約番号
                rs![月額] = Me.月額
                rs![入金月] = DateAdd("m", i, startDate)
                rs![税率] = Me.税率
                rs![税の処理] = Me.税の処理
              rs.Update
            If Not rs.NoMatch = False Then
                .AddNew
                Call レコードの追加および編集(i, startDate)
                .Update
            End If
        End If
    Next
End With
Private Function レコードの追加および編集(ByRef i As Long, ByRef startDate As Date)

With Me.S_登録の月額サブフォーム.Form.Recordset
    ![契約番号] = Me.txt契約番号
    ![月額] = Me.月額
    ![入金月] = DateAdd("m", i, startDate)
    ![税率] = Me.税率
    ![税の処理] = Me.税の処理
End With

End Function

以上で実行すると、

rs.FindFirst "入金月 = #" & Format(DateAdd("m", i, startDate), "yyyy\月m\月") & "#"

の部分で、「式の日付の構文エラーです」というエラーが発生してしまいます。
画像1

「登録の月額サブフォーム」は「T_月額マスタ_仮」テーブルをソースとしており、
「入金月」フィールドは「日付/時刻型」で書式に「yyyy\月m\月」を設定しております。
※「T_月額マスタ_仮」テーブルは登録用のワークテーブルのため常に空の状態です

考えられる原因としてどのようなものがあるか、お気づきの点がありましたら教えていただけませんでしょうか?
お手数をお掛けしますが、ご教授いただけますと幸いです。どうぞよろしくお願いいたします。

だいふくもち
作成: 2021/06/18 (金) 14:49:33
最終更新: 2021/06/21 (月) 10:45:31
通報 ...
1
りんご 2021/06/18 (金) 17:22:08 48103@0e907

日付型のデータであるならば、#で囲めるとする。
例えば、#おはようございます#、これは、日付じゃないから、ルール違反。
では、#2021\月6\月#、これはどうですか?
と、思ったのだが、間違っていたら、すまん。

2
l2106 2021/06/18 (金) 20:17:16 9b357@095c4

私もそう思います。
値と書式(指定に従って値を Access が加工してくれるもの)は別なのでは。
例えば日付型のフィールドの書式にyyyy/mm/dd(aaa)を指定して、
「2021/06/18(木)」と入力しようとしても拒否されます。
「2021/06/18」の入力が受け付けられた後、Access が「2021/06/18(木)」を表示しますよね。

3
だいふくもち 2021/06/21 (月) 10:44:18

りんご様、l2106様、ご回答いただきありがとうございます!

rs.FindFirst "入金月 = " & "#" & DateAdd("m", i, startDate) & "#"

このように変えたらうまくいきました!
なるほど…Format関数は日付型でなく文字列型にするので、"#"で囲んでも意味がなかったのですね…
おかげさまで大変勉強になりました!この度は助けていただき本当にありがとうございました!