レポートのセルを結合したように見せる
レコードソースの準備
下のようなレコードソースを用意しました。
レポートの作成
下のようなレポートを作成しました。
詳細セクションの明細番号テキストボックスから数量テキストボックスまでをまたぐように別のテキストボックス(名前: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
印刷すると下のように出力されます。