Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11372 / 13646 ツリー ←次へ | 前へ→

【16420】改ページプレビュー shin 04/7/27(火) 14:35 質問[未読]
【16422】Re:改ページプレビュー ちゃっぴ 04/7/27(火) 14:58 発言[未読]
【16424】Re:改ページプレビュー shin 04/7/27(火) 15:38 発言[未読]
【16429】Re:改ページプレビュー IROC 04/7/27(火) 18:07 回答[未読]
【16433】Re:改ページプレビュー ちゃっぴ 04/7/27(火) 20:34 回答[未読]
【16439】Re:改ページプレビュー ichinose 04/7/27(火) 22:49 回答[未読]
【16449】Re:改ページプレビュー shin 04/7/28(水) 9:08 質問[未読]
【16452】Re:改ページプレビュー ちゃっぴ 04/7/28(水) 11:22 発言[未読]
【16458】Re:改ページプレビュー ichinose 04/7/28(水) 12:22 回答[未読]
【16478】Re:改ページプレビュー shin 04/7/28(水) 17:44 お礼[未読]

【16420】改ページプレビュー
質問  shin  - 04/7/27(火) 14:35 -

引用なし
パスワード
   はじめまして。質問です。

VBAで印刷プレビューまで、できる印刷設定を行う予定です。

例えば、一枚の用紙に30行5列くらいのデータを印刷したいのですが、途中でデータが入った場合、改ページプレビューはずれてしまいます。

行を挿入した場合でも改ページが固定できるようなプログラムがあれば、どなたか教えてください。

【16422】Re:改ページプレビュー
発言  ちゃっぴ  - 04/7/27(火) 14:58 -

引用なし
パスワード
   >はじめまして。質問です。
>
>VBAで印刷プレビューまで、できる印刷設定を行う予定です。
>
>例えば、一枚の用紙に30行5列くらいのデータを印刷したいのですが、途中でデータが入った場合、改ページプレビューはずれてしまいます。
>
>行を挿入した場合でも改ページが固定できるようなプログラムがあれば、どなたか教えてください。

印刷の設定を縦○ページ横○ページにあわせるにしてみては?

【16424】Re:改ページプレビュー
発言  shin  - 04/7/27(火) 15:38 -

引用なし
パスワード
   チャッピーさんありがとうございます。
お答えしていただいたことがよくわかっていません。

もうすこし具体的にご指導よろしくお願いします。

参考までに現在、具体的にプログラムは以下のようになっています。

Private Sub CommandButton2_Click()

Worksheets("見積書").Activate

'印刷範囲クリア

ActiveSheet.PageSetup.PrintArea = ""

ActiveSheet.PageSetup.PrintArea = "$A3:$s$27,$A$28:$s$52,$A$53:$s$77,$A$78:$s$102,$A$103:$s$127,$A$128:$s$152"

'行1,2はすべてのページに印刷する
  ActiveSheet.PageSetup. _
    PrintTitleRows = "$1:$2"
     
'印刷プレビュー表示
ActiveWindow.SelectedSheets.PrintPreview

End Sub

【16429】Re:改ページプレビュー
回答  IROC  - 04/7/27(火) 18:07 -

引用なし
パスワード
   >>印刷の設定を縦○ページ横○ページにあわせるにしてみては?

>もうすこし具体的にご指導よろしくお願いします。

マクロではなく、印刷の設定 で拡大縮小%ではなく、
縦○ページ横○ページを使ったら如何でしょうか?
ということだと思います。

【16433】Re:改ページプレビュー
回答  ちゃっぴ  - 04/7/27(火) 20:34 -

引用なし
パスワード
   ▼IROC さん:
>>>印刷の設定を縦○ページ横○ページにあわせるにしてみては?
>
>>もうすこし具体的にご指導よろしくお願いします。
>
>マクロではなく、印刷の設定 で拡大縮小%ではなく、
>縦○ページ横○ページを使ったら如何でしょうか?
>ということだと思います。

拡大縮小印刷の場合、印刷範囲からはみ出すとExcelが
勝手に改ページを振ります。(自動改ページ)
これはExcelの仕様のため、どうすることもできません。

対応策としては、縦○ページ横○ページ印刷を使用するか、
1ページに印刷される行数を決めておいて、
手動で改ページを振るとか…

>ActiveSheet.PageSetup.PrintArea >= "$A3:$s$27,$A$28:$s$52,$A$53:$s$77,$A$78:$s$102,$A$103:$s$127,$A$128:$s$152"

印刷範囲が連続していないのはなぜでしょう?
これだと恐ろしくめんどくさい処理を書かなければなりません。

こういうことをしたいのなら、手作業でやったほうが楽かもしれません。

【16439】Re:改ページプレビュー
回答  ichinose  - 04/7/27(火) 22:49 -

引用なし
パスワード
   ▼shin さん、皆さん、こんばんは。

>チャッピーさんありがとうございます。
>お答えしていただいたことがよくわかっていません。
>
>もうすこし具体的にご指導よろしくお願いします。

飛び飛びのページ設定・・・、そんな場合もあるかもしれませんねえ。
即興で作ったので間違いがあるかもしれませんし、他に方法があるかもしれませんが、
確認して下さい。
アクティブシートに対するページ設定です。

'================================================================
Sub main()
  Call pr_settei(Range("$A3:$s$27,$A$28:$s$52,$A$53:$s$77,$A$78:$s$102,$A$103:$s$127,$A$128:$s$152"))
  ActiveSheet.PrintPreview
End Sub
'====================================================================
Sub pr_settei(prng As Range)
  Dim ar As Range
  ActiveSheet.Cells.PageBreak = xlPageBreakNone '手動設定の解除
  ActiveWindow.View = xlPageBreakPreview
  ActiveSheet.PageSetup. _
    PrintTitleRows = "$1:$2"
' 本当は、↑の辺もパラーメータ渡しの方がいいです。
  ActiveSheet.PageSetup.Zoom = 100
  ActiveSheet.PageSetup.PrintArea = ""
  For Each ar In prng.Areas
   ActiveSheet.PageSetup.PrintArea = ar.Address
   Call VDRGOFF(ActiveSheet, ar) 'オートマチックの解除
   Call HDRGOFF(ActiveSheet, ar)
   ActiveSheet.HPageBreaks.Add Range(Cells(ar.Row + ar.Rows.Count, 1), Cells(ar.Row + ar.Rows.Count, ar.Columns.Count))
   Next
  ActiveWindow.View = xlNormalView
  ActiveSheet.PageSetup.PrintArea = prng.Address
End Sub
'================================================================
Sub VDRGOFF(sht As Worksheet, rng As Range)
  On Error Resume Next
  Dim vv As VPageBreak
  For Each vv In sht.VPageBreaks
   If Not Application.Intersect(vv.Location, rng) Then
     vv.DragOff xlToRight, 1
     End If
   Next
  On Error GoTo 0
End Sub
'================================================================
Sub HDRGOFF(sht As Worksheet, rng As Range)
  On Error Resume Next
  Dim hh As HPageBreak
  For Each hh In sht.HPageBreaks
   If Not Application.Intersect(hh.Location, rng) Then
    hh.DragOff xlDown, 1
    End If
   Next
  On Error GoTo 0
End Sub

【16449】Re:改ページプレビュー
質問  shin  - 04/7/28(水) 9:08 -

引用なし
パスワード
   ichinose さん、そしてそのほかのみなさまありがとうございます。
実は私はVBAがほとんど初心者です。
もうすこし簡単にできると思ったのですが、かなりの苦戦をしいられてまして。

ichinose さんはかなり尊敬に値するものを作っていただいて感動しました。
しかし、高度すぎてよく以下のプログラムがわかっていません。
実際に以下のプログラムをコピーして使用させていただいたのですが、行を挿入したらやはり、全ページ同じ行数でプレビューできませんでした。
お時間のあるときで結構ですので、そのへんを少し教えていただけると幸いです。
申し訳ありませんがよろしくお願いいたします。

>'================================================================
>Sub main()
>  Call pr_settei(Range("$A3:$s$27,$A$28:$s$52,$A$53:$s$77,$A$78:$s$102,$A$103:$s$127,$A$128:$s$152"))
>  ActiveSheet.PrintPreview
>End Sub
>'====================================================================
>Sub pr_settei(prng As Range)
>  Dim ar As Range
>  ActiveSheet.Cells.PageBreak = xlPageBreakNone '手動設定の解除
>  ActiveWindow.View = xlPageBreakPreview
>  ActiveSheet.PageSetup. _
>    PrintTitleRows = "$1:$2"
>' 本当は、↑の辺もパラーメータ渡しの方がいいです。
>  ActiveSheet.PageSetup.Zoom = 100
>  ActiveSheet.PageSetup.PrintArea = ""
>  For Each ar In prng.Areas
>   ActiveSheet.PageSetup.PrintArea = ar.Address
>   Call VDRGOFF(ActiveSheet, ar) 'オートマチックの解除
>   Call HDRGOFF(ActiveSheet, ar)
>   ActiveSheet.HPageBreaks.Add Range(Cells(ar.Row + ar.Rows.Count, 1), Cells(ar.Row + ar.Rows.Count, ar.Columns.Count))
>   Next
>  ActiveWindow.View = xlNormalView
>  ActiveSheet.PageSetup.PrintArea = prng.Address
>End Sub
>'================================================================
>Sub VDRGOFF(sht As Worksheet, rng As Range)
>  On Error Resume Next
>  Dim vv As VPageBreak
>  For Each vv In sht.VPageBreaks
>   If Not Application.Intersect(vv.Location, rng) Then
>     vv.DragOff xlToRight, 1
>     End If
>   Next
>  On Error GoTo 0
>End Sub
>'================================================================
>Sub HDRGOFF(sht As Worksheet, rng As Range)
>  On Error Resume Next
>  Dim hh As HPageBreak
>  For Each hh In sht.HPageBreaks
>   If Not Application.Intersect(hh.Location, rng) Then
>    hh.DragOff xlDown, 1
>    End If
>   Next
>  On Error GoTo 0
>End Sub

【16452】Re:改ページプレビュー
発言  ちゃっぴ  - 04/7/28(水) 11:22 -

引用なし
パスワード
   > "$A3:$s$27,$A$28:$s$52,$A$53:$s$77,$A$78:$s$102,$A$103:$s$127,$A$128:$s$152"

行を挿入すると上記範囲が変更になりますよね。
なので、ここは変数で持たせなければいけないと思います。

また、行を挿入してその結果印刷範囲からはみ出した場合、
Excel君が勝手に改ページを振ってしまいます。
よって、拡大縮小印刷に設定するには行数(列数)に応じて
Zoomも可変にしてやる必要があります。

上記のように範囲が飛び飛びでなければ、指定行数で
改ページといった風に簡単にマクロを作成可能ですが、
飛び飛びの場合、印刷範囲の変更、行数に応じてZoomの変更等
行う処理が数倍になります。

レイアウトの見直しをお勧めします。

【16458】Re:改ページプレビュー
回答  ichinose  - 04/7/28(水) 12:22 -

引用なし
パスワード
   ▼shin さん:
こんにちは。
>実際に以下のプログラムをコピーして使用させていただいたのですが、行を挿入したらやはり、全ページ同じ行数でプレビューできませんでした。

なるほど・・、つまり、行を挿入しても常に同じ行数のプレビューをしたいということでしょうか?
もっちょうと簡単な狭いセル範囲の例にしましょう(投稿が大変なので)

新規ブックに前回のコード(pr_settei、VDRGOFF、HDRGOFF)を標準モジュールにコピーしておいてください(mainは、例題用にちょっと変更後述します)。

・新規ブックのアクティブシートのセルA1に「タイトル」とでも入れておいてください。
・同様にセルB1には「サブタイトル」と入力します。

・セルA3〜E20に以下のようなデータを入れて下さい。

aaa   aaa   aaa   aaa   aaa
aaa   aaa   aaa   aaa   aaa
aaa   aaa   aaa   aaa   aaa
bbb   bbb   bbb   bbb   bbb
bbb   bbb   bbb   bbb   bbb
bbb   bbb   bbb   bbb   bbb
ccc   ccc   ccc   ccc   ccc
ccc   ccc   ccc   ccc   ccc
ccc   ccc   ccc   ccc   ccc
ddd   ddd   ddd   ddd   ddd
ddd   ddd   ddd   ddd   ddd
ddd   ddd   ddd   ddd   ddd
eee   eee   eee   eee   eee
eee   eee   eee   eee   eee
eee   eee   eee   eee   eee
fff   fff   fff   fff   fff
fff   fff   fff   fff   fff
fff   fff   fff   fff   fff

mainプロシジャーを以下のように変更して標準モジュールにコピーして下さい。
'==================================================================
Sub main()
  Dim rng As Range
  Set rng = Range("$A$3:$E$5,$A$6:$E$8,$A$9:$E$11,$A$12:$E$14,$A$15:$E$17,$A$18:$E$20")
  Call pr_settei(rng)
  ActiveSheet.PrintPreview
End Sub

まず、この状態でmainを実行してみてください。
プレビューは、セルA3〜E5、セルA6〜E8、・・・というページ区切りで
同じ文字が3行づつ表示されていますか?

ここで7行目に行を挿入して、セルA3〜E21のデータが以下になるようにします。

aaa   aaa   aaa   aaa   aaa
aaa   aaa   aaa   aaa   aaa
aaa   aaa   aaa   aaa   aaa
bbb   bbb   bbb   bbb   bbb
bbb   bbb   bbb   bbb   bbb
bbb   bbb   bbb   bbb   bbb
bbb   bbb   bbb   bbb   bbb
ccc   ccc   ccc   ccc   ccc
ccc   ccc   ccc   ccc   ccc
ccc   ccc   ccc   ccc   ccc
ddd   ddd   ddd   ddd   ddd
ddd   ddd   ddd   ddd   ddd
ddd   ddd   ddd   ddd   ddd
eee   eee   eee   eee   eee
eee   eee   eee   eee   eee
eee   eee   eee   eee   eee
fff   fff   fff   fff   fff
fff   fff   fff   fff   fff
fff   fff   fff   fff   fff

ここで、プレビューを見てみると、
「bbb」表示されるページだけ4行になっていますよね?


ここを3行したいなら、
ここで再度、mainプロシジャーを実行してみて下さい。

aaa   aaa   aaa   aaa   aaa
aaa   aaa   aaa   aaa   aaa
aaa   aaa   aaa   aaa   aaa


bbb   bbb   bbb   bbb   bbb
bbb   bbb   bbb   bbb   bbb
bbb   bbb   bbb   bbb   bbb


bbb   bbb   bbb   bbb   bbb
ccc   ccc   ccc   ccc   ccc
ccc   ccc   ccc   ccc   ccc


ccc   ccc   ccc   ccc   ccc
ddd   ddd   ddd   ddd   ddd
ddd   ddd   ddd   ddd   ddd


ddd   ddd   ddd   ddd   ddd
eee   eee   eee   eee   eee
eee   eee   eee   eee   eee


eee   eee   eee   eee   eee
fff   fff   fff   fff   fff
fff   fff   fff   fff   fff


というようにプレビューでは表示されるはずなんですが・・・。
こういう結果がほしいのですよね?

つまり、挿入処理の後に、mainプロシジャーを再度実行することにより、
ページを再設定しなければなりません。

【16478】Re:改ページプレビュー
お礼  shin  - 04/7/28(水) 17:44 -

引用なし
パスワード
   ichinose さん本当に親切なご指導ありがとうございます。

再度実行を行ったら、先ほどの問題が解決いたしました。
ありがとうございます。

私はVBAをはじめたばかりなのでほとんどわかっていない状態ですが、もしまたわからないことがあれば教えてください!!

本当にありがとうございました。

11372 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free