- 締切済み
Excel 改ページのVBAうまくいかないです
助けてください。EXCEL2000を使用しています。 マクロを組んでいるのですが、改ページがうまくいきません。 マクロ実行前の状態では、ページ設定で、用紙が「A3」の「縦」で拡大縮小が「79%」、データの区切りのいいところに何箇所か改ページが設定されています。 そこで、マクロを使って、A3サイズ、用紙を横、拡大縮小92%にして、尚かつ区切りのいいところ(毎回印刷範囲、区切りたいセルの位置は決まっている)で印刷できるようにしたいです。 印刷範囲は A1:P63,A64:P126,A127:P193,A194:P237,A257:P329, A330:P357,A368:P397,A401:P462 で設定したいです。 改ページしたい行を ひたすら ActiveSheet.HPageBreaks.Add Before:=Range("セル番地") で記述したのですが、 余計なところにも改ページ線ができてしまいました。(121行目の下、 351行目の下) このいらない改ページ線は、用紙を横にして、拡大縮小を92% をした時点で、ついてしまった線のようです。 余計な改ページ線を削除したいです。 なお、マクロは自動記録しかわかっておらず、 意味がわかっていないです。 お手数ですが お分かりになる方、 わかりやすくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 私は、以下の言葉をご質問で読んだ時に、 >マクロを組んでいるのですが、改ページがうまくいきません。 >余計なところにも改ページ線ができてしまいました。(121行目の下、 351行目の下) Excel内で「A3横の標準ページ行数」と「手動改ページを入れた間(ユーザーが入れる改ページ)」の行数では、「手動改ページ」の行数のほうが大きいのではないかと、と考えました。 例えば、 「A3横」で、縦が、標準ページ行数を、62 行とします。 そして、A127:P193 というページ行数を設定したら、67行あります。 そうしたら、Excelのほうが自動改ページで189行目に入れてしまい、残りの5行が余って、その5行は次のページに追いやられてしまいます。そして、5行だけのページが出来てしまいます。 本来は、手動改ページは、189行目以下(127行 + 62行) であれば、半端なページは出来ません。それを、公開はしませんでしたが、今まで書いたことをチェックするマクロで考えていました。どうやら違ったようですが。 ** >このコードの下に、ページ設定や 改ページの記述すればよろしいのでしょうか。 改ページ挿入マクロと、全体のページ設定のコードとは、見易さや、全体の負担を考えて別々にしたらどうでしょうか? 単独に、以下のPageBreakInsert マクロでも設定できるはずです。ただし、Excel 97 では、以下のマクロは動きません。Const myPBreak As String = "・,・,・,・,・,・" コンマ切りにして、一行で書けば、一つずつ .HPageBreaks.Add に渡してくれます。 つなぐときは、 Sub 印刷設定() '←charodesuさんの作った既存のマクロ With ActiveSheet.PageSetup .PrintTitleRows = "" .PrintTitleColumns = "" ・ ・ Call PageBreakInsert '最後にこう書けば、次のマクロに飛びます。 End Sub '-------------------------------------------------------- '<標準モジュール> Sub PageBreakInsert() Dim myPBreaks As Variant, i As Long 'ユーザーの改行ページ設定 Const myPBreak As String = "A64,A127,A194,A238,A330,A358,A398,A463" 'ページブレイクの配列作成 myPBreaks = Split(myPBreak, ",") With ActiveSheet For i = LBound(myPBreaks) To UBound(myPBreaks) .HPageBreaks.Add .Range(myPBreaks(i)) Next i End With End Sub '-------------------------------------------------------- p.s. #2 のSub PrintSettingTest2() は、没にしてください。
- Wendy02
- ベストアンサー率57% (3570/6232)
#1 の方のご説明で、出来たのですか? PrintSettingTest1 は、出さないことにします。 私が、ふと心配に感じたのは、ページの物理的限界を超えて、1ページを設定させることは不可能だと思ったから、一旦、標準ページ行数を取り出して、それで範囲をチェックすることを考えましたが、取り越し苦労のようです。 Sub PrintSettingTest2() Dim myPagesArray As Variant, i As Long Dim strRng As String 'ユーザーのページ設定 Const myPages As String = "A1:P63,A64:P126,A127:P193,A194:P237,A257:P329,A330:P357,A368:P397,A401:P462" With ActiveSheet If InStr(myPages, ":") = 0 Then MsgBox "1つ以上のセルを記述してください。", vbCritical Exit Sub End If 'ページの配列作成 myPagesArray = Split(myPages, ",") .PageSetup.PrintArea = "" For i = LBound(myPagesArray) To UBound(myPagesArray) strRng = Mid$(myPagesArray(i), InStr(myPagesArray(i), ":") + 1) .HPageBreaks.Add .Range(strRng) Next i End With End Sub
補足
回答ありがとうございます。 一応、No1さん のやり方で、できたのですが、 問題はありますでしょうか。 すみません。あまり意味がわかっていません・・・ Wendy02さん のやり方の方も 試してみたいのですが、上記の コードを コピーペーストして大丈夫ですか?(VBAがわかっていません) ちなみに 上記のコードだけを マクロとして記述したら、改ページが一切なしの 一枚 として仕上がりました。 このコードの下に、ページ設定や 改ページの記述すればよろしいのでしょうか。 しかし、それをやってみたところ、マクロがうまく実行できなくてエラーになりました。 たびたび申し訳ございませんが、教えてください。 With ActiveSheet.PageSetup .PrintTitleRows = "" .PrintTitleColumns = "" End With ActiveSheet.PageSetup.PrintArea = _ "$A$1:$P$237,$A$257:$P$357,$A$368:$P$397,$A$401:$P$462" With ActiveSheet.PageSetup .LeftHeader = "" .CenterHeader = "" .RightHeader = "" .LeftFooter = "" .CenterFooter = "" .RightFooter = "" .LeftMargin = Application.InchesToPoints(0.78740157480315) .RightMargin = Application.InchesToPoints(0.196850393700787) .TopMargin = Application.InchesToPoints(0.78740157480315) .BottomMargin = Application.InchesToPoints(0) .HeaderMargin = Application.InchesToPoints(0.078740157480315) .FooterMargin = Application.InchesToPoints(0.15748031496063) .PrintHeadings = False .PrintGridlines = False .PrintComments = xlPrintNoComments .CenterHorizontally = False .CenterVertically = False .Orientation = xlLandscape .Draft = False .PaperSize = xlPaperA3 .FirstPageNumber = xlAutomatic .Order = xlDownThenOver .BlackAndWhite = False .Zoom = 92 ActiveSheet.HPageBreaks.Add Before:=Range("A64") ActiveSheet.HPageBreaks.Add Before:=Range("A127") ActiveSheet.HPageBreaks.Add Before:=Range("A194") ActiveSheet.HPageBreaks.Add Before:=Range("A238") ActiveSheet.HPageBreaks.Add Before:=Range("A330") ActiveSheet.HPageBreaks.Add Before:=Range("A358") ActiveSheet.HPageBreaks.Add Before:=Range("A398") ActiveSheet.HPageBreaks.Add Before:=Range("A463") End With End Sub
- misatoanna
- ベストアンサー率58% (528/896)
マクロの自動記録を開始し、 1.シート全体を選択 2.[挿入]-[すべての改ページを解除] を実行 3.記録終了 で記録される2行を ActiveSheet.HPageBreaks.Add Before:=Range("セル番地") の前に既述して実行されたらいかがでしょうか。
お礼
できました! ありがとうございます。 わかりやすかったです!!
補足
Wendy02さん、せっかく早く教えてくださったのに、お返事がかなり遅くなりまして申し訳ありません。 実はまだうまくいかないでおります・・・ もう 忘れちゃったよ、と言われそうですが、 よろしくお願いします。 マクロを二つ分けるとき、 >Call PageBreakInsert '最後にこう書けば、次のマクロに飛びます。 とのことですが、最初のマクロのコードの最後、End Sub の前に 入れて、実行すると、 エラーが出てしまいます。 その他必要な コードはありますでしょうか? 初歩的な質問で申し訳ありません。