[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『vbaで段組み印刷』(penguin)
縦長の表を段組みして印刷したいと考えています。
セルA4から縦長の表があります。
最初の改ページから次の改ページまでのデータをC4に、
その次の改ページまでのデータをE4に、
というような感じで真ん中を切り取ってデータを移動させたら
いいのではと考えました。
1
1
1
Set ws2 = ThisWorkbook.Sheets("print")
cnt = ws2.HPageBreaks.Count
For i = 1 To cnt
row1 = ws2.HPageBreaks(i).Location.Row ※ row2 = ws2.HPageBreaks(i + 1).Location.Row - 1 migi2 = i * 2 ws2.Range(Cells(row1, 1), Cells(row2, 1)).Cut_ Destination:=ws2.Range("A4").Offset(0, migi2)
Next
※の行でエラーとなります。
最初からエラーになったり、途中でエラーになったりします。
ワードにて印刷する方法も拝見しましたが、エクセルのまま複数人が使えるツールにしたいと思っております。
独学で始めた初心者ですので、おかしな構文であればご容赦ください。
ほかにいい方法があれば、ご教授ください。
ちなみに最終ページの処理はまだしておりません。
< 使用 Excel:Excel2013、使用 OS:Windows10 >
※ row2 = ws2.HPageBreaks(i + 1).Location.Row - 1
i=cnt になったとき、つまり iが最後の HPageBreaks(i) になったとき、 HPageBreaks(i+1) は存在しないからではないですか。 その部分を
If i = cnt Then row2 = ws2.Cells(Rows.Count, 1).End(xlUp).Row Else row2 = ws2.HPageBreaks(i + 1).Location.Row - 1 End If
のようのしたらうまくいきませんか?
(tora) 2020/06/18(木) 17:03
もう一つ、
Destination:=ws2.Range("A4").Offset(0, migi2)
ここでどうしてA4からOffset してるんですか? 試してみたら、4行目から貼り付けたらまた3行分、 印刷範囲からはみ出してしまいました。
(tora) 2020/06/18(木) 17:35
再度、追加です。
>※の行でエラーとなります。
この現象、こちらでも確認できました。 不思議なことにエラーになるときとならないときがありました。 調べてみたら、
この現象でしょうか。 for 〜 Next の前後に、 ws2.Cells(Rows.Count, 1).Select ws2.Cells(1, 1).Select
を入れて実行するとエラーが出なくなりました。 最終的に試したコードは下記のとおり。
なお、当然ながらA列のデータが入力されている行高は、すべて同じでないとうまくいきませんけど。
Sub test()
Dim i As Long Dim cnt As Long Dim ws2 As Worksheet Dim row1 As Long Dim row2 As Long Dim migi2 As Long
Set ws2 = ActiveSheet cnt = ws2.HPageBreaks.Count ws2.Cells(Rows.Count, 1).Select
For i = 1 To cnt If i = cnt Then row1 = ws2.HPageBreaks(i).Location.Row row2 = ws2.Cells(Rows.Count, 1).End(xlUp).Row Else row1 = ws2.HPageBreaks(i).Location.Row row2 = ws2.HPageBreaks(i + 1).Location.Row - 1 End If migi2 = i * 2 ws2.Range(Cells(row1, 1), Cells(row2, 1)).Cut _ Destination:=ws2.Range("A1").Offset(0, migi2) Next
ws2.Cells(1, 1).Select
End Sub
(tora) 2020/06/18(木) 20:07
考えてみれば、1ページに何行印刷できるかということと、 このままだと何ページ印刷できるかがわかれば、 その後はどこにページ区切りがあるかは計算で求められますね。
そのことを踏まえて上のコードを簡略化してみました。
Sub test2()
Dim i As Long Dim cnt As Long Dim ws2 As Worksheet Dim gyou As Long
Set ws2 = ActiveSheet cnt = ws2.HPageBreaks.Count gyou = ws2.HPageBreaks(1).Location.Row - 1
For i = 1 To cnt ws2.Cells(i * gyou + 1, 1).Resize(gyou).Cut _ Destination:=ws2.Range("A1").Offset(0, i * 2) Next
End Sub
こんな感じで実行すると、最初に出ていたエラー部分を回避たコードになります。 なお、私が作ったものはアクティブシートで動くようになっています。 シート名はご希望のものに差し替えてください。
(tora) 2020/06/19(金) 10:22
ご回答感謝いたします。
3行はみ出していた件は後で考えようと思ってました。
A1、A2セルに表タイトルがあり、A4からの表になっていたため、
A4から右にoffsetして表の高さをそろえたいと考えていました。
3行分はみ出してしまうのは当然でしたね・・・。
A1からの表であれば、思うような形にできあがりました。
これをもとに余白調整をいれて、後からタイトルを入れるようにしたら
理想通りに行きそうな気がしてきました。
大変助かりました。ありがとございます。
ただ、せっかく簡略化いただきましたが
fornextの間のResizeとoffsetの中がイマイチ理解できていないので、
その前のコードを使うことになりそうです(汗)
(penguin) 2020/06/19(金) 11:12
>Resizeとoffsetの中がイマイチ理解できていないので、
むやみに自分の理解できないコードを使わないという姿勢は素晴らしいと思います。 でもResizeはそれほど覚えておくと便利ですよ。
ws2.Cells(i * gyou + 1, 1).Resize(gyou).Cut _
まずiが1のとき、 ws2.Cells(i * gyou + 1, 1) この部分は最初にCutする先頭のセルです。 .Resize(gyou).Cut これでそのセルを起点に下にgyou分のセル(範囲)をCutすることになります。 セル範囲を選択するときに便利です。いろいろ応用ができるはずです。
私もVBA勉強中の身ですから、いろいろネットで調べながら作っています。 (tora) 2020/06/19(金) 13:06
解説、どうもありがとうございます。
Resize、範囲選択するときに便利だということを
覚えておきたいと思います。
offsetの中、当てはめてみて何となく理解できました。
丁寧なご説明ありがとうございました。
もっといろいろなことができるように頑張っていきたいです。
(penguin) 2020/06/19(金) 14:35
すみません。 もう見ていないかもしれませんが、一部不具合がありましたので 原文を修正しました。 (tora) 2020/06/20(土) 12:28
確認させていただきました。
ありがとうございました。
できないことができるようになるとどんどん楽しくなってきます。
また困ったときにはお助けください(笑)
(penguin) 2020/06/22(月) 10:21
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.