[[20200618163700]] 『vbaで段組み印刷』(penguin) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『vbaで段組み印刷』(penguin)

縦長の表を段組みして印刷したいと考えています。

セルA4から縦長の表があります。
最初の改ページから次の改ページまでのデータをC4に、
その次の改ページまでのデータをE4に、
というような感じで真ん中を切り取ってデータを移動させたら
いいのではと考えました。

1
1
1


2 ↑
2 この間を移動させる
2 ↓

3 ↑
3 この間を移動させる
3 ↓

    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


 再度、追加です。

 >※の行でエラーとなります。

 この現象、こちらでも確認できました。
 不思議なことにエラーになるときとならないときがありました。
 調べてみたら、

https://support.microsoft.com/ja-jp/help/210663/you-receive-a-subscript-out-of-range-error-message-when-you-use-hpageb

 この現象でしょうか。
 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


tora様

ご回答感謝いたします。

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

tora様

解説、どうもありがとうございます。

Resize、範囲選択するときに便利だということを
覚えておきたいと思います。

offsetの中、当てはめてみて何となく理解できました。

丁寧なご説明ありがとうございました。

もっといろいろなことができるように頑張っていきたいです。

(penguin) 2020/06/19(金) 14:35


 すみません。
 もう見ていないかもしれませんが、一部不具合がありましたので
 原文を修正しました。
(tora) 2020/06/20(土) 12:28

tora様

確認させていただきました。
ありがとうございました。

できないことができるようになるとどんどん楽しくなってきます。

また困ったときにはお助けください(笑)
(penguin) 2020/06/22(月) 10:21


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.