質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

2818閲覧

VBA: pageSetUpオブジェクトで改行するには?

hokosugi

総合スコア63

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/06/08 01:53

編集2019/06/08 13:18

pageSetUpオブジェクト内で改行まで完結させたいのですが、うまくいっていません。
お教えください。

ResetAllPageBreaksとすべてクリアすると初期値の列改ページがばらつきがあり、columnWidthで列幅を揃えましたがそれでもシートごとに列改ページ(青線)が変わっているので止む無く、pageSetUpprintAreaプロパティで列を指定しました(例: "A:AS")。
printAreaを指定すると行数に関係なく1枚に収まる設定になっており、どのようにすれば改ページ出来るかで悩んでいます。

やってみたこと

  1. FitToPagesWideでページ数を設定(数指定が決まっていて多めに設定)=>効いていない。ドキュメントには書いていないがprintAreaとの併用は無理なのかもしれない。

  2. with文pageSetUpを抜けた後にpageBreakオブジェクトを設定(printAreaで列は設定されたので後は行の改行だけ)=>改行が出来ない。(手動で「ファイル」、「印刷」、「シートを1ページに印刷」から「すべての列を1ページに印刷」なら変更できる)

pageSetUpは印刷設定を自由に設定することが出来るので使い勝手が良いと感じますが、改行だけがネックになっています。

うまくいく方法を宜しければお教えください。

vba

1Sub 報告書の印刷範囲を指定する() 2 Dim reportFolderPath As Variant 3 Dim reportObj As Object 4 Dim reportWb As Workbook 5 Dim reportWs As Worksheet 6 Dim i As Integer 7 8 reportFolderPath = "C:\Users\masas\Documents\sample報告書-完成\" 9 10 With CreateObject("Scripting.FileSystemObject") 11 For Each reportObj In .getfolder(reportFolderPath).Files 12 Set reportWb = Workbooks.Open(reportObj) 13 For Each reportWs In reportWb.Worksheets 14 endRows = reportWs.Cells(Rows.count, 1).End(xlUp).Row 15 For i = 1 To 46 16 reportWs.Columns(i).ColumnWidth = 1.29 17 Next i 18 reportWs.ResetAllPageBreaks 19 With reportWs.PageSetup 20 .PrintArea = "A1: AS" & endRows '"A:AS"から変更 21 .Zoom = False 22 '.FitToPagesTall = 1 23' .FitToPagesWide = 10 24' .LeftMargin = Application.InchesToPoints(0.8) 25' .RightMargin = Application.InchesToPoints(0.3) 26' .BottomMargin = Application.InchesToPoints(0.8) 27 28 End With 29 For i = 50 To endRows Step 50 30 'reportWs.Columns(46).VPageBreak = xlPageBreakManual 31 reportWs.Cells(i, "AT").PageBreak = xlPageBreakManual 32 Next i 33 Next reportWs 34 Next reportObj 35 End With 36End Sub

報告書のサンプル

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

pageSetUpオブジェクト内で改行まで完結させたいのですが、うまくいっていません。

んと、VBAから設定しようが手動で設定しようが、出来ることは変わらないので、
まずは、改ページプレビューの画面を表示して、眺めてみてください。

その上で、どこに改ページを挿入するのかルールを考えてみてください。
VBAの命令は手動の操作を「マクロの記録」という機能でVBAに翻訳して記録してくれますので、それで知ることができます。

やりたいことは、
シート上にいくつかの表が配置されていて、
その表を表ごとに紙一枚に収めて印刷したいということですか?
ならば、表毎に印刷範囲を設定して印刷すればいいように思いますが、
印刷範囲の設定(=pageSetUp)は、重いので少し処理に時間が掛かるかもしれません。

まずはやりたいことを伝わるように説明してみてください。
コードに向かう前に作業手順の確立が先だと思いますよ。

あ、表毎に1枚で印刷するとして、
表の中に、空白行や空白列が存在しますでしょうか?
その辺も説明をお願いします。


ああああ、失礼しました。
やっと、理解したかも^^;
失礼しました。

マクロの記録で出来たコード(.Zoom = False)をコピペしたらエラーになるという事でしたか^^;
で、どう回避すればいいかを質問されているのですね。

ExcelVBA

1Sub Macro3() 2 Dim ws As Worksheet 3 Dim rng As Range 4 5 For Each ws In ThisWorkbook.Worksheets 6 With ws 7 .ResetAllPageBreaks '改ページのクリア 8 Set rng = .UsedRange '←上手く行くための呪文 9 With .PageSetup 10 .PrintArea = "" 11 .Zoom = False '印刷範囲のクリア 12 .FitToPagesTall = False '←縦は自動の設定にする 13 .FitToPagesWide = 1 '幅方向を1ページに 14 End With 15 End With 16 Next 17End Sub

リボン上で設定をいじるとわかると思いますが、
幅方向のページ数を設定することと、
拡大縮小の設定をすることは同時にはできません。
先に設定した方が優先になりそうですかね?
そこで、無効になっている設定をいじろうとするからエラーになるのかな?
(勘で出来るだけエラーにならないであろう手順で書いたら、
エラーにならなかったので、エラーになる場合を検証していませんm(_ _)m)
この流れで処理したら行けるのではないかと思います。
ここまでで、お分かりとは思いますが、
マクロの記録では不要なコードも記録される場合が多いです。
ヘルプで確認して不要な部分は削除して構いません。
あと、マクロの記録も完璧ではありませんので、
微妙な調整が必要な場合がありますので、心に留めておいてください。

最後になりましたが、物分りが悪く、不要な説明を要求しました。
失礼しましたm(_ _)m


んと最初にプロパティ名で説明されてたじゃないですか。
自分、英語が苦手なんで基本、アルファベットは飛ばし読みしてます。
それに、エクセルの設定の話なんで、日本語で説明していただけるとありがたかったです。
あと、ここのサイトの強調文字も読みにくいので、それもあって、
説明が頭に入らなかったような気がします。

で、
リボン上でいろいろいじくってみたらわかると思いますし、
薄々分かっておられると思いますが、
印刷範囲の設定(PrintArea)を設定した場合、
横の縮小(FitToPagesWide)や縦の縮小(FitToPagesTall)
が無効になるようです。(全体の拡大縮小は有効)

横の縮小や縦の縮小
(基本的にはどちらかを設定し、どちらかを自動で使うものでしょう)を
設定した場合、
全体の拡大縮小は無効(両方利用するのは矛盾がある)

という仕様のようです。

今回の件の場合、

要件としては、 「シート上の印刷出来るものがあるセル範囲の内、左から45列分を紙1枚に収めたい。」 (縦にはみ出す分は次ページでOK)(という事だろうと思います。) で、前提条件として、 シート上の印刷できるものがあるセル範囲は、 45列以上ある。(意図的にしているのか、操作者が誤ってセルの書式設定等をいじった) ということは、印刷範囲の設定をすることになる。必然的に横の縮小は使えないので、 上手く列方向が1ページに納まらない。なにかいい方法がないか? (同じ様式のシートが多数あるので最終的にはこの操作をマクロ化したいと考えている。)

と、質問してくれるとこちらも何度も聞きなおさなくてもよかったのかなぁと思います。
まぁ、なかなか最初から整理して質問するのは難しいので、
今回のように、やり取りしながら、頭を整理して説明していただけたらいいのかなとは、思います。

こういう場合、エクセルの設定をいじるだけの話なので、
VBAで書いて実行してみるのは、
直接触られるものをわざわざラジコンで遠隔操作しているような
ものなので、まどろっこしいと思います。
直接、エクセルの画面上でまずは挙動確かめるほうが楽です。
その上で、どのような設定で希望の印刷ができるかをまずは見つけることができれば、
その操作をマクロの記録でVBAに翻訳してもらい、コードを探ると開発が楽になると思います。

では、どのような設定(あるいは操作)で希望の結果が得られるか。
まずは、印刷範囲の設定を希望のセル範囲に設定したうえで、
自動的に設定される縦方向の改ページを意図的に削除してやるといいと思います。
(操作的には、改ページの線を印刷範囲外に追いやる。)

コード的には以下のようになると思います。

ExcelVBA

1Sub Macro4() 2 With ActiveSheet 3 .PageSetup.PrintArea = .UsedRange.Resize(, 45).Address 4 With .VPageBreaks 5 If .Count > 0 Then 6 .Item(1).DragOff Direction:=xlToRight, RegionIndex:=1 7 End If 8 End With 9 End With 10End Sub

やりたいことは、合ってますかね?ちょっと不安です^^;

こちらも、反射的に思いつきで書いちゃうので、的外れなことも言ったりしますが、
その辺はやり取りしながら、掏り合わせて行けたらと思います。ご容赦のほどを。

投稿2019/06/08 03:43

編集2019/06/09 01:31
mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hokosugi

2019/06/08 10:31

ご回答ありがとうございます。やりたいことはシートごとに行数が違う表形式に改ページを付けることです。pageSetUpオブジェクトで.zoom=false .fitToPagesTall = 7 .fitToPagesWide = 1 とか、自動で改ページをしてくれると思っていましたが思う通りの挙動にならないためご意見伺い、色々試してみました。「マクロの記録」を使い確認していくと 「数値は10から400までの範囲で指定してください」とメッセージが出るようになり、zoom=trueにすると出なくなります。そうするとfitToPagesTall,fitToPagesWideが効かずに改ページがなされず行数に関わらず1ページに収まってしまいます。zoom=100で正常に挙動しましたが、zoom=falseでなぜ範囲指定の催促が来るのかよく分かりません、with文でzoomを後にしたり先にしたりとしましたが関係ないようです。 質問ではpageAreaプロパティとfitToPagesWideらの相性が悪いのかと書きましたが、原因はzoom のようです。ドキュメントには「zoom=falseでfitToPagesWideらで制御」とあり、zoom=falseが当然の指定と思われます。なぜ範囲指定のメッセージが出るのか良く分からないでいます。 尚、表の中には空白行や列はありません。
mattuwan

2019/06/08 11:11

>やりたいことはシートごとに行数が違う表形式に改ページを付けることです。 列数のことですかね?(横方向の数が違う?) 行数が違うだけなら、難しく考える必要が無いような気がします。 どうもやりたいことのイメージがつかめません^^; >「数値は10から400までの範囲で指定してください」 とでるなら、 VBAでTrueは-1、Falseは0と数値に変換されます。 なのでどちらも数値的には該当しないかと思いますが、 Tureの方は0以外と判定されているのかなぁ。。。 それとも、-1が特別な意味が設定されているのかも? とりあえず、2シート分の列数と行数を教えてください。 A,B,Cが列、1,2,3が行と呼びますのでその辺を踏まえて教えてください。
hokosugi

2019/06/08 11:25

>行数が違うだけなら、難しく考える必要が無いような気がします。 そうなんです。難しく考える必要はないと思っていたんですが、中々で。 列数は46で固定、行数は400、800です。取り合えず、application.displayalerts = falseで メッセージを出さないようにすれば正常に「ページ設定」の「次のページ数に合わせて印刷」にラジオボタン、数値も反映されています。
mattuwan

2019/06/08 11:45

1)各シートの列数は46列で固定 2)行数は変動 3)列を1ページ内に収めたい まではイメージできましたが、 困っているのは、 水平の改ページが違う位置に来るということですか? あと、用紙はA4? フォントの大きさは?
mattuwan

2019/06/08 11:50 編集

あ、あと、罫線の太さをいろいろ変えてます? それから、行タイトルに何か設定してます? とりあえず、印刷の設定の問題の前に前提条件を揃えないと、 確かなことが言えません。
hokosugi

2019/06/08 12:30

これらはpageSetUpのプロパティですね。「マクロの記録」を取った時にすべてのプロパティが書かれていたのでそれに沿っています。以下のようです。これで水平の改ページが自動的に作成されます。問題は改ページを出すのに下記コードをVBAコードにコピペすると、先ほどの「数値は10から400の範囲で指定してください」が出てくることです。それを回避するためにzoom=trueにすると改ページがなくなり範囲すべてが1ページになってしまします。「ページ設定」「次のページ数に合わせて印刷」が「横」1、「縦」1の設定になっています。 With ActiveSheet.PageSetup .LeftHeader = "" .CenterHeader = "" .RightHeader = "&9 3150003" .LeftFooter = " &""メイリオUI,標準""&10JPFA-SP-S:2014" .CenterFooter = "" .RightFooter = "" .LeftMargin = Application.InchesToPoints(0.590551181102362) .RightMargin = Application.InchesToPoints(0) .TopMargin = Application.InchesToPoints(0.31496062992126) .BottomMargin = Application.InchesToPoints(0.393700787401575) .HeaderMargin = Application.InchesToPoints(3.93700787401575E-02) .FooterMargin = Application.InchesToPoints(0.196850393700787) .PrintHeadings = False .PrintGridlines = False .PrintComments = xlPrintNoComments .PrintQuality = 600 .CenterHorizontally = False .CenterVertically = False .Orientation = xlPortrait .Draft = False .PaperSize = xlPaperA4 .FirstPageNumber = xlAutomatic .Order = xlDownThenOver .BlackAndWhite = False .Zoom = False .FitToPagesWide = 1 .FitToPagesTall = 15 .PrintErrors = xlPrintErrorsDisplayed .OddAndEvenPagesHeaderFooter = False .DifferentFirstPageHeaderFooter = False .ScaleWithDocHeaderFooter = True .AlignMarginsHeaderFooter = False .EvenPage.LeftHeader.Text = "" .EvenPage.CenterHeader.Text = "" .EvenPage.RightHeader.Text = "" .EvenPage.LeftFooter.Text = "" .EvenPage.CenterFooter.Text = "" .EvenPage.RightFooter.Text = "" .FirstPage.LeftHeader.Text = "" .FirstPage.CenterHeader.Text = "" .FirstPage.RightHeader.Text = "" .FirstPage.LeftFooter.Text = "" .FirstPage.CenterFooter.Text = "" .FirstPage.RightFooter.Text = "" End With
mattuwan

2019/06/08 12:41 編集

??? やりたいのはすべての列を1ページに収めたい。 けど、水平の改ページが一定ではないので、同じに揃えたいという事ではないのですか? プロパティをいじったところで、手動で出来ない設定は、 VBAでも出来ないので、まずはエクセル君の癖(仕様)を探りましょうよ。 そのためには、印刷の設定の前にシートの状態をそちらと出来るだけ同じにして試したいのですが。。。 例えば、罫線の太さが違っても、文字が重ならないように、隙間をとるので、1行の間隔がずれるのですが。。。。
hokosugi

2019/06/08 13:45

>水平の改ページが一定ではない これは改ページが一定なのではなく、範囲全てが1ページに収まるため改ページを設定したいということです。教えていただいた「マクロの記録」で手動で設定すると問題なく出来ました。先ほども書きましたが列範囲を手動で46にして「ページ設定」「次のページ数に合わせて印刷」を横1、縦15です。 ですが、このコードを自分のコードにコピペすると、なぜか「数値は10から400までの範囲」のメッセージが出るようになりました。ただ、警告を取ってやると設定は正常に書き換わっています。ですのでこの警告が出るのはなぜなのかに変わっています、もちろん警告が出ることが、zoom= falseとfitTopagesTall等を指定していながら改ページの出ない全範囲1ページになった原因でもあるのだと思っています。 なかなか言葉で説明が難しいので報告書のスクショを撮り、質問下部に付記しました。説明不足の一助になればうれしいです。今回の対処は自分でも整理が中々つかず、解決の糸口も見つけられないのですが、ある程度は進展して使えるほどまでには来ています。「マクロの記録」を教えていただけたのがよかったです。もし宜しければ新たな問題にお答えくださるとうれしいです。
hokosugi

2019/06/08 13:57

ありがとうございます。酔ってますし眠たくなってきましたので明日試してみたいと思います。
hokosugi

2019/06/08 21:37

ご協力ありがとうございました。 usedRangeを使っても「数値は10から400までの範囲~」のmsgboxはまだ出てきます。.printAreaで範囲指定せずにusedRangeを使うと47列以降もpageWideに入ってしまいますので使わずに.printAreaに戻しました。尚、usedRangeもprintAreaも設定せずに試してもメッセージは出まして、拡大縮小とページ数に合わせて印刷の相性の問題というよりzoomプロパティ自体の問題若しくは設定なのかもしれません。ただ、警告を非表示にしても挙動には影響もなくこのまま使えそうなのでこれで一旦良しとします。 mattuwanさんの粘り強いコミットのおかげで理解も深まりましたし説明も少しはうまくなったと感じています。改めて感謝いたします。 今日のところはこれで良しとして、今後謎が解けてクリアしたときにはここに書いておきます。意外に数日経つと分かったりすることが多いw
hokosugi

2019/06/09 04:54

そうですそうです。 知らないメソッドとプロパティがあって理解するのに30分ほど掛かりましたがやりたいことはその通りです。簡単に書けるものですね、見習わないといけません。 マクロの記録、今回のwithの階層化、とても参考になりました。もう一つ「高評価」を上げたいくらいです(やると取り消されたw)。改めてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問