以前、こちらのコミュニティでお世話になった者です。
前回はご丁寧かつ分かりやすく教えていただきありがとうございました。
この度、行き詰まってしまった部分があり、ご相談させていただきたく存じます。
前に教えていただいた、フォーム上で指定した月数分のデータをサブフォームに追加するマクロですが、
こちらに「データを上書きする」機能を加えたいと思っております。
例えば、まず1月~5月分のデータをコマンドボタンで登録し、その後3月~5月のデータのみ上書きしたい場合、
これまでだと今までのデータを手動で消して新たに追加しておりましたが、
上書きすることで1月~2月分のデータはそのままに、3月~5月のデータだけを上書きするようにしたいです。
もし、3月~6月分を新たに登録するとした場合、3月~5月分まで上書きし、
6月分を新しく登録できるようにしたいです。
'契約期間の差から請求月数を算出
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\月") & "#"
の部分で、「式の日付の構文エラーです」というエラーが発生してしまいます。
「登録の月額サブフォーム」は「T_月額マスタ_仮」テーブルをソースとしており、
「入金月」フィールドは「日付/時刻型」で書式に「yyyy\月m\月」を設定しております。
※「T_月額マスタ_仮」テーブルは登録用のワークテーブルのため常に空の状態です
考えられる原因としてどのようなものがあるか、お気づきの点がありましたら教えていただけませんでしょうか?
お手数をお掛けしますが、ご教授いただけますと幸いです。どうぞよろしくお願いいたします。
日付型のデータであるならば、#で囲めるとする。
例えば、#おはようございます#、これは、日付じゃないから、ルール違反。
では、#2021\月6\月#、これはどうですか?
と、思ったのだが、間違っていたら、すまん。
私もそう思います。
値と書式(指定に従って値を Access が加工してくれるもの)は別なのでは。
例えば日付型のフィールドの書式にyyyy/mm/dd(aaa)を指定して、
「2021/06/18(木)」と入力しようとしても拒否されます。
「2021/06/18」の入力が受け付けられた後、Access が「2021/06/18(木)」を表示しますよね。
りんご様、l2106様、ご回答いただきありがとうございます!
このように変えたらうまくいきました!
なるほど…Format関数は日付型でなく文字列型にするので、"#"で囲んでも意味がなかったのですね…
おかげさまで大変勉強になりました!この度は助けていただき本当にありがとうございました!