【Access VBA】レポートのセルを結合したように見せる


レポートのセルを結合したように見せる



レコードソースの準備

下のようなレコードソースを用意しました。


レポートの作成

下のようなレポートを作成しました。
詳細セクションの明細番号テキストボックスから数量テキストボックスまでをまたぐように別のテキストボックス(名前:txtBack)を配置します。このテキストボックスに1行おきに背景色を設定します。
罫線の部分に赤色の直線と緑色の直線(名前:lineDate)および水色の直線(名前:bottomLine)を配置しています。
日付が1行上のレコードと同じ場合に緑色の直線を非表示にし、日付の文字を白色にします。
水色の直線はページが2ページ以上になるとき最終ページ以外のページの一番下の罫線になります。

レポートの読み込み時とクリック時および日付ヘッダーのフォーマット時のイベントプロシージャに以下のコードを記述します。
印刷時に指定行数になるまで空白行を出力します。空白行のテキストボックスを非表示にするため、すべてのテキストボックスにタグを設定しています。

Private intCount As Integer 'レポートのレコード件数格納用変数
Private n As Integer '行番号格納用変数
Private dDate As Date '1行上の日付格納用変数
Private lngNo As Long '明細番号格納用変数
Const printRec As Integer = 20 '印刷する行数

Private Sub Report_Load()
    intCount = DCount("明細番号", Me.RecordSource)
    n = 0
    dDate = 0
    Me![日付].Visible = True
    Me!lineDate.Visible = True
    Call SetTextBox(True)
End Sub

Private Sub Report_Click()
    n = 0
    dDate = 0
    Me![日付].Visible = True
    Me!lineDate.Visible = True
    Call SetTextBox(True)
End Sub

Private Sub グループヘッダー0_Format(Cancel As Integer, FormatCount As Integer) 
    intCount = DCount("明細番号", Me.RecordSource) 
    n = 0
    dDate = 0
    Me![日付].Visible = True
    Me!lineDate.Visible = True
    Call SetTextBox(True)
End Sub

Private Sub SetTextBox(ByVal flag As Boolean)
    Dim ctl As Control
    For Each ctl In Me.Section(0).Controls
        If ctl.Tag = "表示" Then
            ctl.Visible = flag
        End If
    Next
End Sub

詳細セクションの描画時のイベントプロシージャに下記コードを記述します。

Private Sub 詳細_Paint()
    Me!bottomLine.BorderStyle = 0
    n = n + 1
    If n = 1 Then
        lngNo = Me![明細番号]
    End If
    If Me![明細番号] = lngNo Then
        dDate = 0        
        n = 1
    End If
    If n Mod 2 = 0 Then '1行おきにレコードの背景色を設定
        Me!txtBack.BackColor = RGB(235, 241, 222)
    Else
        Me!txtBack.BackColor = RGB(255, 255, 255)
    End If
    If Me![日付] = dDate Then '日付が上の行と同じときは非表示
        Me![日付].ForeColor = vbWhite
        Me!lineDate.BorderStyle = 0
    Else
        Me![日付].ForeColor = vbBlack
        Me!lineDate.BorderStyle = 1
    End If
    dDate = Me![日付]
End Sub

レポートビューを表示すると下のようになります。

詳細セクションのフォーマット時のイベントプロシージャに下記コードを記述します。

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
    n = n + 1
'----------空白行の設定---------------------------------
    If n Mod printRec > 0 Then
        If n < intCount Then
            Me.NextRecord = True
            Call SetTextBox(True)
            Me!bottomLine.Visible = False
            Me![newPage].Visible = False
        ElseIf n = intCount Then
            Me.NextRecord = False
            Call SetTextBox(True)
            Me!bottomLine.Visible = False
            Me![newPage].Visible = False
        ElseIf n > intCount Then
            Me.NextRecord = False
            Call SetTextBox(False)
            Me!bottomLine.Visible = False
            Me![newPage].Visible = False
        End If
    Else
        If n < intCount Then
            Me.NextRecord = True
            Call SetTextBox(True)
            Me!bottomLine.Visible = True
            Me!bottomLine.BorderStyle = 1
            Me![newPage].Visible = True
        ElseIf n = intCount Then
            Me.NextRecord = True
            Call SetTextBox(True)
            Me!bottomLine.Visible = False
            Me![newPage].Visible = False
        ElseIf n > intCount Then
            Me.NextRecord = True
            Call SetTextBox(False)
            Me!bottomLine.Visible = False
            Me![newPage].Visible = False
        End If
    End If
'-------------------------------------------------------
    If n Mod 2 = 0 Then '1行おきにレコードの背景色を設定
        Me!txtBack.BackColor = RGB(235, 241, 222)
    Else
        Me!txtBack.BackColor = RGB(255, 255, 255)
    End If
    If Me![日付] = dDate Then '日付が上の行と同じときは非表示
        Me![日付].Visible = False
        Me!lineDate.Visible = False
    Else
        Me![日付].Visible = True
        Me!lineDate.Visible = True
        Me!lineDate.BorderStyle = 1
    End If
    If n Mod printRec = 1 Then '1行目は必ず表示する
        Me![日付].Visible = True
        Me!lineDate.Visible = True
        Me!lineDate.BorderStyle = 1
        Me![日付].ForeColor = vbBlack
    End If
    If n = intCount + 1 Then '最終行の日付の下側の罫線を表示
        Me!lineDate.Visible = True
        Me!lineDate.BorderStyle = 1
    End If
    dDate = Me![日付]
End Sub

印刷すると下のように出力されます。