- ベストアンサー
Excel 印刷時に複数範囲を含む自動範囲設定
- Excelで更新回数の多い表を作る際、入力シートと印刷用シートに分けることがあります。入力シートに入力した項目が二つの印刷シートにそれぞれ入力されるように設定します。しかし、印刷シートではセルが隣り合った場合に関数が消える問題や、空白セルを入れると改ページされてしまう問題があります。他の方法を探しても解決できず困っています。何か良い方法はありますか?
- Excelの印刷時に複数範囲を含む自動範囲設定について、入力シートと印刷用シートを使用する方法があります。入力シートに入力した項目が二つの印刷シートにそれぞれ入力されるように設定し、印刷シートではセルが隣り合った場合に関数が消える問題や、空白セルを入れると改ページされてしまう問題が生じています。これらの問題を解決する方法を教えてください。
- Excelの印刷時に複数範囲を含む自動範囲設定についての問題です。入力シートと印刷用シートを分けて作成し、入力した項目が二つの印刷シートにそれぞれ表示されるようにしています。しかし、印刷シートではセルが隣り合うと関数が消えてしまい、空白セルを入れると改ページされてしまう問題が起きます。これらの問題を解決する方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
A列に「×」がある行は非表示にして印刷するようにしてみました。 これでダメならステップ実行して一行ずつ動作を確認するしかないですね。もしかしたらマクロが実行されていないかもしれません 余分ですがマクロが実行されたらメッセージを出すようにしました。(8行目) このメッセージが表示されないなら何らかの理由でマクロが実行されていないということになります。不要になったら8行目は削除して下さい Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim idx, LastR As Long Const sh1 As String = "プライベート版表示" Const sh2 As String = "正規版表示" On Error GoTo end0 With ActiveSheet If .Name = sh1 Or .Name = sh2 Then MsgBox("Macroが実行されています") Application.ScreenUpdating = False LastR = .Range("A65536").End(xlUp).Row For idx = 1 To LastR ' If Application.CountA(.Rows(idx)) = 0 Then If .Cells(idx, "A") = "×" Then 'ここが変わりました .Rows(idx).Hidden = True End If Next idx Application.EnableEvents = False .PrintOut .Range("A1:A" & LastR).EntireRow.Hidden = False Cancel = True End If End With end0: Application.EnableEvents = True Application.ScreenUpdating = True End Sub
その他の回答 (3)
- zap35
- ベストアンサー率44% (1383/3079)
#01,02です。うーん、空白行が印刷されますか すると空白行の判定方法が私の想像と、実際のシートで異なっているのかもしれませんね。このマクロでは =COUNTA(10:10) の値が0となる行を空白行と見なしています。(10は例えで、全行調べます)。 >何行か内容を削除し空白行を作ってみましたが 反対に何行か行挿入して何も入力しないまま印刷してもダメでしょうか あるいは#01にも書きましたが、実際のシートにそくして「この行は空白行だ」と判定する方法を教えていただければ直します(例えばA列が空白なら印字しなくて良いなど)
補足
おはようございます。返事後れてすみません。 >反対に何行か行挿入して何も入力しないまま印刷してもダメでしょうか 今試してみましたが駄目なようです>_< >あるいは#01にも書きましたが、実際のシートにそくして「この行は空白行だ」と判定する方法を教えていただければ直します(例えばA列が空白なら印字しなくて良いなど) わかりました、ではA列に関数を入れてみました。 行に入力があればココに"○"入力が無ければ"×"を白文字で書かれます。 コレでは駄目でしょうか。
- zap35
- ベストアンサー率44% (1383/3079)
以下のマクロは印刷を行う際に「空白行を印刷しないようにする」ものです。一度試して見ていただけますか? ただし印刷シートが二つあるとのことですので、その印刷シートの名前を3、4行目に入力(書き換え)してください。(指定したシート以外は普通に印刷するようにするためです) マクロはALT+F11でVBE画面を開き、左上のVBA Projectで該当するBook名の配下の「ThisWorkBook」を右クリックし「コードの表示」で開く画面に貼り付けて下さい。シートに戻り印刷を行うとマクロが実行されます。 Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim idx, LastR As Long Const sh1 As String = "印刷シート1" 'シート名を書き換える Const sh2 As String = "印刷シート2" 'シート名を書き換える On Error GoTo end0 With ActiveSheet If .Name = sh1 Or .Name = sh2 Then Application.ScreenUpdating = False LastR = .Range("A65536").End(xlUp).Row For idx = 1 To LastR If Application.CountA(.Rows(idx)) = 0 Then .Rows(idx).Hidden = True End If Next idx Application.EnableEvents = False .PrintOut .Range("A1:A" & LastR).EntireRow.Hidden = False Cancel = True End If End With end0: Application.EnableEvents = True Application.ScreenUpdating = True End Sub なお、このマクロを組み込むとデータがない行は印刷されなくなってしまいます。もし行間を空けたいなら、空白行のどこかのセルに「スペース」を入力しておけば、印刷時は空白行が印刷されます。
補足
ご丁寧にありがとうございます。 今試みましたが、うまくいかないようです。 空白行がそのまま印字されます。 念のため、何行か内容を削除し空白行を作ってみましたが 印刷されてしまいます。 手順は以下で試みています。 ============================================================== Alt+F11を押した後ブック直下のThisWorkBookの「コードの表示」を クリックし、以下の書き換えた内容を貼り付けました。 -------------------------------------------------------------- Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim idx, LastR As Long Const sh1 As String = "プライベート版表示" 'シート名を書き換える Const sh2 As String = "正規版表示" 'シート名を書き換える On Error GoTo end0 With ActiveSheet If .Name = sh1 Or .Name = sh2 Then Application.ScreenUpdating = False LastR = .Range("A65536").End(xlUp).Row For idx = 1 To LastR If Application.CountA(.Rows(idx)) = 0 Then .Rows(idx).Hidden = True End If Next idx Application.EnableEvents = False .PrintOut .Range("A1:A" & LastR).EntireRow.Hidden = False Cancel = True End If End With end0: Application.EnableEvents = True Application.ScreenUpdating = True End Sub =============================================================== また、ブック内に用意されたシートは次の名前です。 ・入力シート ・プライベート版表示 ・正規版表示 そのままの通りですが、どこか不具合あるでしょうか あと、説明が足りませんでしたがセル内に書き込みをしてあるのはそれぞれ 正規版表示 = B2~N110 プライベート版表示 = B2~N103 に、なります。
- zap35
- ベストアンサー率44% (1383/3079)
補足要求です 結局のところ何をされたいのか書かれていないように感じます。 1)印刷時にPrint_Areaを自動的に設定 2)表の空白行を印刷しないようにしたい(=行を非表示にする) のどちらでしょうか? 印刷エリアの末尾に >××産業株式会社 4月付 のような行があるのであれば、Print_Areaの設定では >内容の空の部分も、印刷されてしまします は回避できないと思いますので2)で良いのでしょうか? 2)が目的であれば「どのような条件で行を非表示にすればよいか」を提示していただかないと、マクロが書けません。 また >間に空白セルを入れると改ページされてしまいます。 とあるので、改ページはダメで印刷頁は用紙1枚に納める(場合によっては縮小する)という要望も含んでいるのでしょうか? そのシートを見たことがない第三者が読んでも分かるように補足していただけませんか
補足
失礼しました。 予定としては、 「中間にある表の空白行を印刷されないようにしたい。」 と 「その作業を自動化したい」 です。 >間に空白セルを入れると改ページされてしまいます。 というのは、自分で足掻いた時に PrintArea = シート名!$B$2:$P$35, OFFSET(シート名!$B$39,0,0,COUNTIF(シート名!$C:$C,"x")*3,15), シート名!$B$101:$P$114 を利用した時にできたものです。
お礼
こんばんわ。 ありがとうございます、うまく行きました! 長い間親切にご指導頂きありがとうございました! 今、ちゃんとプリンターから印刷されて出てきています! あまりに感動的で少し涙が出ている程です。 オーバーかもしれませんが現実で、とても感謝しています! ありがとうございました!!