いつも大変お世話になっております。
https://hatenachips.blog.fc2.com/blog-entry-463.html
「余白に応じて行数指定無く用紙の最後まで罫線を出力する」
という記事があるにもかかわらず、似たような質問で申し訳ありません。
ページヘッダー
ビル名ヘッダー
詳細
ビル名フッター(不可視)
ページフッター
というセクションで構成されたレポートで
詳細セクションのメモ欄に書かれた内容量がレコードによって異なり、
今までは詳細セクション自体の高さを増やして、1枚に入る行数を減らして全部を表示するようにしていたのですが、
メモの内容が増えてきたレコードに合わせるとあまりに行数が少なくなり紙の無駄になるため、
印刷時拡張を「はい」にして、行の高さを可変にすることが出来たら、と考えております。
Option Compare Database
Option Explicit
Dim d As Object ' Dictionary オブジェクト用変数
Private Sub Report_Open(Cancel As Integer)
Set d = CreateObject("Scripting.Dictionary")
End Sub
Private Sub Report_Page()
On Error GoTo Err_Report_Page
Dim LineTop As Long, LineLeft As Long, LineWidth As Long, SecHight As Long
Dim i As Integer
With Me
LineTop = .ページヘッダーセクション.Height + .グループヘッダー0.Height
LineLeft = .box1.Left
LineWidth = .box1.Width
SecHight = Me.詳細.Height
'横罫線 6行分
For i = 1 To 5
Me.Line (LineLeft, LineTop + SecHight * i)-Step(LineWidth, 0)
Next
'縦罫線 内側
For i = 2 To 19
If i = 8 Then .DrawStyle = 2
If i = 19 Then .DrawStyle = 0
Me.Line (Me("lbl" & i).Left, LineTop)-Step(0, SecHight 6)
Next
'太線 の太さをここで指定
.DrawWidth = 6.8
'外枠
Me.Line (LineLeft, LineTop - .box1.Height)-Step(LineWidth, .box1.Height + SecHight 6), , B
'横罫線 上下
Me.Line (LineLeft, LineTop)-Step(LineWidth - 10, 0)
'Me.Line (LineLeft, LineTop + SecHight * 6)-Step(LineWidth, 0)
End With
Exit Sub
Exit_Report_Page:
Exit Sub
Err_Report_Page:
Select Case Err.Number
Case 2501
MsgBox "印刷するデータは有りません。", vbOKOnly
Resume Exit_Report_Page
Case Else
MsgBox Err.Number & " : " & Err.Discription
Resume Exit_Report_Page
End Select
End Sub
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
WordWrapOff Me.NAS用, Me.txtFld1
Me.NAS用.FELineBreak = False
Me.txtFld1.FELineBreak = False
というコードが記されています。
今の記述だと詳細セクションの高さ×行数(上記だと6行分)で横線を引くことになっているのはわかります。
この詳細セクションが可変の時にどのようにしたらよいかについて、冒頭の記事のコードを取り入れようにも
上手くできずに困っています。
もともと作成したのは自分なのですが、作成してからだいぶ時間が経っていることと、
その時も色々と教わりながら書いていたため、直し方もよくわからずにいます。(すみません)
用紙はA4横です。
足りない情報もあるかと思いますが、お教えいただけたら助かります。
よろしくお願いします。
提示のページフォーマット時(Report_Page)で罫線を引く方法では、行の高さが可変の場合は、むずかしいと思います。
下記のリンク先の方法ではだめなんですか。こちらの方がはるかにシンプルに実装できます。
余白に応じて行数指定無く用紙の最後まで罫線を出力する - hatena chips
hatena様
お返事ありがとうございます。
>提示のページフォーマット時(Report_Page)で罫線を引く方法では、行の高さが可変の場合は、むずかしいと思います。
やはりそうなんですね。
リンク先の方法で頑張ってみます。
すぐに取り掛かれないかもしれないので時間がかかるかもしれませんが必ず報告に上がります。
ありがとうございました。
レポートのイベントを使った処理は、イベントの発生メカニズムの理解が必須になります。
まずは、下記のページを読まれて、概要でもいいので理解しておくといいでしょう。
レポートのイベントの発生メカニズムの研究 - hatena chips
レポートのイベントの発生メカニズムの研究 その2 - hatena chips
ページフォーマット時で罫線を引くのが難しい理由は、
ページフォーマットはページ内のイベント(各セクションのフォーマット時,印刷時など)がすべて終了してから最後に発生します。
行数、行高が固定なら、For Nextループで繰り返せば簡単に罫線を引くことができますが、
行数、行高が可変の場内は、やろうと思えばできないことはないですが、複雑になります。
具体的には、各セクションの印刷時で、各セクションの高さを配列なり、Dictionaryなどに格納しておいて、ページフォーマット時でそれを参照して罫線を引くというコードを書くことになります。
それをするぐらいなら、各セクションの印刷時イベントで罫線を引いた方がシンプルです。
リンク先の方法とhttps://zawazawa.jp/ms-access/topic/728で新しく作成をし直しています。
https://zawazawa.jp/ms-access/topic/728
の方の様に周りを2ポイントの実線で囲みたいと思っているのですが、
上の線はグループヘッダーの横線(サンプルだと直線12)を2ポイント実線に
下の線は上記でhatena様が提示された方法で太線にすることが出来ました。
こちらの方は左右の外枠縦線を太線に出来たと仰っていたのですがどう頑張っても出来ないで作業が止まっています…(ダミーの空白行の外枠は太線に出来ました)
外枠の左右の縦線を太線にする場合はどこを変更すればよいのでしょうか?
もう一つ
サンプルでは罫線を引きたいエリアに対して均等に罫線を引くわけではなく、
レコード量が多く1ページに収まらない場合に
・詳細セクションの通常(1行分)の高さ
・メモ欄の内容が多かった場合(=印刷時拡張された場合)の高さ
で行を連ねて、レコードが入るところまでいき、下部の余りが次の行の高さに満たなかったら、下部に余白があっても次のページに進んでいます。
実は罫線を引きたいエリアの下部が余白ではなく違うセクションで固定で表があるため、このままだと下部の表と罫線を引きたい可変エリアの間に隙間ができてしまうため、
どうにかして形の良いおさまりを探しています。
今考えているのは
①可変エリアの下辺に合わせて固定部分の位置をずらす
②(できたら)可変エリアを印刷時拡張にするけれど、詳細セクションの倍数で拡張して可変エリアのエリア高さを固定にする(ページによって10行の場合もあれば途中でメモ量が多く1行に収まらない行がある場合は9,8,…と可変する)
なのですが
そもそもこれらはACCESSでの作成が可能なのでしょうか?(①は出来そうな気もしますが②は難しそうなのかしら…)
どんどんと話がずれてきてしまいすみません。
どうぞよろしくお願いいたします。
縦線だけ別に引いちゃえばいいんじゃないですかね
VBAの
Me.Line
でもレコードがない場合も用紙の最後まで罫線を出力する(hatena chipsさん)
でも
「違うセクションで固定で表」のセクションとはページフッターセクションのことですか。
あと言葉だけではイメージしづらいので、ご希望のレイアウトイメージを画像でアップしてもらえませんか。
hirotonさま>
ありがとうございます。
実は詳細セクションの太くしたい縦線を指定してみたのですがうまくいかなくて…
hatenaさんのこんなやり方もあるんですね。
教えて下さりありがとうございます。
今のやり方とあまりにも違うのですが状況によってはこちらも検討してみます。
hatenaさま>
ありがとうございます。
画像(説明付き)を添付しました。
イメージ伝わりますでしょうか?(説明が上手くなくすみません)
よろしくお願い申し上げます。
よく「VBAを使わないで」と話題になるのでリンクを出してますが、VBAで罫線を引くのは質問時点でVBAでやっていますよね?
わざわざ詳細セクションでセクションごとに引く必要はなく、質問のコードの「外枠」部分でやっていることで十分じゃないですか?
横罫線は、最初のリンク先の方法で。
余白に応じて行数指定無く用紙の最後まで罫線を出力する - hatena chips
縦罫線と外枠は、ページフォーマット時にVBAでLineメソッドで引けばいいのでは。
質問のコードから横罫線部分を削除すればいいと思います。
とても遅くなったのですが、ようやく方向性が決まり、以下のコードになりました。
検索してくださる方のためにもコードを残します。
ありがとうございました。
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
Dim j As Integer
Dim i As Integer
For j = 51 To 57
Me.DrawStyle = 0
Me.Line (Me("L" & j).Left, 0)-(Me("L" & j).Left, 144000)
Next
For i = 2 To 12
Me.DrawStyle = 2
Me.Line (Me("L" & i).Left, 0)-(Me("L" & i).Left, 144000)
Next
WordWrapOff Me.自社用, Me.txtFld1
Me.自社用.FELineBreak = False
Me.txtFld1.FELineBreak = False
End Sub