難易度高めです
案件レベルです
超ザックリで以下の3ステップです
① フォーム表示専用の作業用テーブルを構築します
フィールドは下記のパターンの総数32個で、テーブル名は「月一覧テーブル」としてみます
・部屋番号(主キー)
・1
・2
≀
・30
・31
② ①をソースにした帳票フォームを作成します
ヘッダーにラベル、詳細にテキストボックスを配置します
その際、名前を意味のあるものにします
ここではラベルを [ラベル1]~[ラベル31] 、テキストボックスを [1]~[31] としてみます
③ 下記のVBAを記述します
フォーム「読み込み時」イベントで実行されるようにします
※このVBAコードはお試し用であってバグ取りはしていません
※対象となる日付が固定となっています
一般的には年月を選択する機構を設置しなければならないでしょう
※のちに氏名などの情報を表示できるように余分な仕組みを仕込んでいます
※自力でカスタマイズできないのでしたら諦めて外注してみてください
Option Compare Database
Option Explicit
Private Sub Form_Load()
Dim c As Long ' Condition
Dim d As Long ' Day
'--- 条件付き書式の設置
For d = 1 To 31
With Me(\u0026quot;[\u0026quot; \u0026amp; d \u0026amp; \u0026quot;]\u0026quot;).FormatConditions
For c = .Count To 1 Step -1
Me(\u0026quot;[\u0026quot; \u0026amp; d \u0026amp; \u0026quot;]\u0026quot;).ForeColor = vbWhite
Me(\u0026quot;[\u0026quot; \u0026amp; d \u0026amp; \u0026quot;]\u0026quot;).BackColor = vbWhite
.Item(c).Delete
Next
With .Add(acExpression, , \u0026quot;Left([\u0026quot; \u0026amp; d \u0026amp; \u0026quot;],1)=\u0026quot;\u0026quot;-\u0026quot;\u0026quot;\u0026quot;)
.ForeColor = vbWhite
.BackColor = vbWhite
.Enabled = False
End With
With .Add(acExpression, , \u0026quot;Left([\u0026quot; \u0026amp; d \u0026amp; \u0026quot;],1)=\u0026quot;\u0026quot;@\u0026quot;\u0026quot;\u0026quot;)
.ForeColor = vbYellow
.BackColor = vbYellow
.Enabled = False
End With
With .Add(acExpression, , \u0026quot;Left([\u0026quot; \u0026amp; d \u0026amp; \u0026quot;],1)=\u0026quot;\u0026quot;I\u0026quot;\u0026quot;\u0026quot;)
.ForeColor = vbRed
.BackColor = vbRed
.Enabled = False
End With
With .Add(acExpression, , \u0026quot;Left([\u0026quot; \u0026amp; d \u0026amp; \u0026quot;],1)=\u0026quot;\u0026quot;O\u0026quot;\u0026quot;\u0026quot;)
.ForeColor = vbBlue
.BackColor = vbBlue
.Enabled = False
End With
End With
Next
'--- 対象日付
Dim TargetDate As Date
TargetDate = #4/1/2025#
'--- 対象の月の日の数の可視を調整
c = Day(DateSerial(Year(TargetDate), Month(TargetDate) + 1, 0))
For d = 1 To 31
Me(\u0026quot;[\u0026quot; \u0026amp; d \u0026amp; \u0026quot;]\u0026quot;).Visible = (d \u0026lt;= c)
Me(\u0026quot;[ラベル\u0026quot; \u0026amp; d \u0026amp; \u0026quot;]\u0026quot;).Visible = (d \u0026lt;= c)
Next
'--- 対象日付よりワークテーブルのレコードを構築
BuildWorkRecords TargetDate
Me.Requery
End Sub
Sub BuildWorkRecords(TargetDate As Date)
Dim strYM As String
Dim i As Long
Dim LastDay As Long
strYM = Format(TargetDate, \u0026quot;yyyy/mm\u0026quot;)
LastDay = Day(DateSerial(Year(TargetDate), Month(TargetDate) + 1, 0))
CurrentDb.Execute \u0026quot;DELETE FROM 月一覧テーブル\u0026quot;
CurrentDb.Execute \u0026quot;INSERT INTO 月一覧テーブル ( 部屋番号 ) SELECT 部屋番号 FROM 入居者テーブル;\u0026quot;
With CurrentDb.OpenRecordset( _
\u0026quot;SELECT 月一覧テーブル.*, 入居者テーブル.入居者名, 入居者テーブル.入居日, 入居者テーブル.退去日 FROM 月一覧テーブル\u0026quot; _
\u0026amp; \u0026quot; INNER JOIN 入居者テーブル ON 月一覧テーブル.部屋番号 = 入居者テーブル.部屋番号\u0026quot; _
)
Do Until .EOF
.Edit
If Format(!入居日, \u0026quot;yyyy/mm\u0026quot;) \u0026lt;= strYM And IsNull(!退去日) Then
For i = IIf(Format(!入居日, \u0026quot;yyyy/mm\u0026quot;) = strYM, Day(!入居日), 1) To LastDay
If Format(!入居日, \u0026quot;yyyy/mm/dd\u0026quot;) = strYM \u0026amp; Format(i, \u0026quot;\\/00\u0026quot;) Then
.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;).Value = \u0026quot;I\u0026quot; \u0026amp; Mid(.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;).Value, 2)
Else
If Mid(.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;), 1, 1) \u0026lt; \u0026quot;A\u0026quot; Then
.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;).Value = \u0026quot;@\u0026quot; \u0026amp; Mid(.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;).Value, 2)
End If
End If
Next
End If
If Format(!退去日, \u0026quot;yyyy/mm\u0026quot;) \u0026gt;= strYM And IsNull(!入居日) Then
For i = 1 To LastDay
If Format(!退去日, \u0026quot;yyyy/mm/dd\u0026quot;) = strYM \u0026amp; Format(i, \u0026quot;\\/00\u0026quot;) Then
.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;).Value = \u0026quot;O\u0026quot; \u0026amp; Mid(.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;).Value, 2)
Exit For
Else
If Mid(.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;), 1, 1) \u0026lt; \u0026quot;A\u0026quot; Then
.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;).Value = \u0026quot;@\u0026quot; \u0026amp; Mid(.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;).Value, 2)
End If
End If
Next
End If
If Format(!入居日, \u0026quot;yyyy/mm\u0026quot;) \u0026lt;= strYM And Format(!退去日, \u0026quot;yyyy/mm\u0026quot;) \u0026gt;= strYM Then
For i = IIf(Format(!入居日, \u0026quot;yyyy/mm\u0026quot;) = strYM, Day(!入居日), 1) To LastDay
If Format(!入居日, \u0026quot;yyyy/mm/dd\u0026quot;) = strYM \u0026amp; Format(i, \u0026quot;\\/00\u0026quot;) Then
.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;).Value = \u0026quot;I\u0026quot; \u0026amp; Mid(.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;).Value, 2)
ElseIf Format(!退去日, \u0026quot;yyyy/mm/dd\u0026quot;) = strYM \u0026amp; Format(i, \u0026quot;\\/00\u0026quot;) Then
.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;).Value = \u0026quot;O\u0026quot; \u0026amp; Mid(.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;).Value, 2)
Exit For
Else
If Mid(.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;), 1, 1) \u0026lt; \u0026quot;A\u0026quot; Then
.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;).Value = \u0026quot;@\u0026quot; \u0026amp; Mid(.Fields(\u0026quot;[\u0026quot; \u0026amp; i \u0026amp; \u0026quot;]\u0026quot;).Value, 2)
End If
End If
Next
End If
.Update
.MoveNext
Loop
End With
End Sub