• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:2つのマクロを1つにしたい)

マクロで複数のシートを印刷し、セルを結合する方法

このQ&Aのポイント
  • マクロを使用して、複数のシートを印刷し、シート上のセルを連続して結合する方法について教えてください。
  • 現在のコードでは、(2)のマクロがアクティブシートにしか動作しない問題があります。マクロを修正し、すべてのシートで(2)の処理を実行できるようにしたいです。
  • また、データのある2から14のシートのみを印刷するようにする方法についても教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

#1補足欄への返信です。 > ただ、データーのないシートまで印刷プレビューが出るのです。 > A2にデーターがない場合は、飛ばして次のシートへ移動させるには、そうすればいいのか、再度お願いします。 これも元のマクロを踏襲していたのですが、 印刷プレビューについても、"A2にデーターがない場合だけ"、 という風に変更するのでしたら、 #1の記述について、 >    End If >    Sh.PrintPr の2行を       Sh.PrintPrevieweview     End If のように、入れ替えてみたら如何でしょう。     If Sh.Range("A2").Value <> "" Then     ' ' 「A2にデーターが【ある】場合」の処理     End If という構造です。

kisaragijec
質問者

お礼

realbeatinさん、ありがとうございました。 希望通りに動きました。 私のコードで、連結はできなかったけれど、印刷プレビューは希望通りに動いていたので、Sh.PrintPrevieweviewの位置はあっているものと思い込んでいました。 先日まで、会社のインターネットが使えなくて、質問等できなかったのですが、これからまたマクロをいろいろ作っていきたいと思っています。 ご教示ください。よろしくお願いいたします。

その他の回答 (1)

回答No.1

どうも^^こんにちは。 > (2)上記のうち、c列のデーターで連続しているセルを結合する。  "2から14までのシート"のそれぞれについて、  C列で縦方向に連続したデータがある場合は  連続したデータをひとつに纏めるような形で[セルの結合]処理をする。 ということで宜しいでしょうか? > t = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row "2から14までのシート"それぞれに最下行を取得しなくても良いのでしょうか? 処理の対象はC列なのに、A列を基準にしてもいいのでしょうか? > Application.DisplayAlerts = False Applicationのプロパティ設定変更は、通常、ループの外で行い、 処理が済んだら必ず元に戻すもの、、、という風に覚えておいて下さい。 勿論、例外はありますが、ループの内で処理するのであれば、それは、 特筆事項として、説明が必要です。 必然性のある処理であったとして、そういったスクリプトを書く場合は、 何故そうしたのか、ということを、コメントとして残しておくことをお奨めします。 状況の確認を待たなくとも、ひとつの答えになっているものを書くことはできますので、 とりあえず、一答しておきます。 上述の疑問点に関しては、すべて手当てする方向で書き換えています。 > Dim i As Range 変数名としての "i" は、一般に、増減[increment(decrement)]する数値 を指す変数名として用いるもので、オブジェクトに使うことには 違和感がありましたので、 Dim c As Range と書き換えています。 その他の処理の仕方については、ご質問の原文を踏襲しています。 一応、サンプルを作成して、簡単なテストをして、 こちらの想定通りの動作であることは確認してあります。 ご質問の主題への答えとしては、 ' ★★★ でマークした行の記述にあるように、 Rangeの親シートの指定漏れを正す、ということなのだと思っています。 こちらの想定が違っていた場合や不足があった場合は、 補足欄にでも書いてみてください。 ' ' /// Sub Re9044868w() Dim Sh As Worksheet Dim t As Long Dim c As Range '  t = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row ' ★ ? 全シートで最下行が同じ、という前提?ならイキ   Application.DisplayAlerts = False ' ★★Application のプロパエティ処理は大抵ループの外   'データーのあるシートだけ印刷   For Each Sh In Worksheets(Array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14))     If Sh.Range("A2").Value <> "" Then       t = Sh.Range("C" & Rows.Count).End(xlUp).Row ' ★ ? 全シートで最下行が同じ、という前提?ならトル       '連続データーセル結合       For Each c In Sh.Range("C1:C" & t) ' ★★★         If c.MergeArea(1).Value = c.Offset(1).Value Then           Range(c.MergeArea, c.Offset(1)).Merge         End If       Next c     End If     Sh.PrintPreview   Next Sh   Application.DisplayAlerts = True ' ★★ 必ず元に戻す End Sub ' ' ///

kisaragijec
質問者

補足

realbeatinさん お久しぶりです。 今回もありがとうございます。 > C列で縦方向に連続したデータがある場合は  連続したデータをひとつに纏めるような形で[セルの結合]処理をする。 つたない説明をご理解いただきありがとうございます。そうです。 > "2から14までのシート"それぞれに最下行を取得しなくても良いのでしょうか? For Each Sh In Worksheets(Array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14))でシートの最下位行をそれぞれに選択しているつもりになっていました。 For Each c In Sh.Range("C1:C" & t) で、Rangeの前にシート名を入れないといけなかったのですね。 > 処理の対象はC列なのに、A列を基準にしてもいいのでしょうか? A列にデーターがないと、他の列にもデーターはないので、基準にしていました。 C列を対象とするときは、C列を基準にするものなんですね、失礼いたしました。 > Application.DisplayAlerts = False の使い方、よくわかりました。動いたので、よく調べずに使っていました。 教えていただいたコードで、各シートのC列の結合ができるようになりました。 ただ、データーのないシートまで印刷プレビューが出るのです。 A2にデーターがない場合は、飛ばして次のシートへ移動させるには、そうすればいいのか、再度お願いします。

関連するQ&A