質問: i + 1 Loop '印刷プレビューを表示 Worksheets("シート名").PrintPreview End sub ``` ### 補足情報(FW/ツールのバージョンなど) ``` Windows7 32bit Excel2010での環境です。 シート名には実務で使用する際に使うブックのシートの名前が入ります。 ```
回答: ども。 やりたいことは、 「K列のデータを上から順に見て行って、見てるセルの値が、その上のセルの値と違っていたら、改ページを挿入したい。」 ということですよね? > > 「値が変更された際に改行をするプログラムを作成したい」 > > > 「値が変更された際に」と言われると、 「いま、まさに対象のセルの値が変更された」その時と解釈されます。 そして、改行ではなく改ページですよね? エクセル君は一字一句でも間違えると、期待した答えを返してくれません。 人間だと、文脈とかから類推して言いたいことを推測しちゃうんですが^^; 上手くいかなくて混乱してたり、時間がなくて焦って書いたり、 変な文言を使ったのかも知れませんが、この辺をちゃんと間違わないで、 説明できるようにならないと、プログラムも書けるようになりません。 さて、ちょっと1のなんで?って疑問は、同じデータで同じマクロを動かしてみないとわかりませんが、こういうのは自分で間違いを見つけられるようにならないといけません。 VBAを書くツールでVBEを使っていると思いますが、このツールは、 間違いを見つけるために、一行毎にプログラムを実行できる機能が付いています。 https://asatte.biz/vba-debug-menu/ こういうことをすれば間違いを見つけられるかも知れません。 (今回の件で見つかるかどうかは不明) 今回の件で言うと、 > > 「改ページが挿入されたりされなかったり」 > > > ということは、 > > If SaveKey <> Cells(i, 11).Value Then > > > のところで意図した判定が行われてないと想像できます。 なので、ステップ実行しながら、比較している値が、 どんな値かいちいちチェックして、どうなりたいけど、 どうなっているかを確認してみたらいいと思います。 特に、英数の半角・全角の違いは画面上でみてもよくわからないので、 その辺は注意してみてみるといいでしょう。 他には記号系も似ているけど違うなんてこともあるので、 (例えば、〇と○とかエクセル上では違いが分かり難い?) 注意しましょう。 もし、どうしても解らなくて、他人にデバッグを頼みたいのならば、 マクロのコードだけでなく、同じデータで動作確認するひつようがあります。 今回の場合はK列のデータ? その辺をも少し落ち着いて確認されたり、説明されたりするといいと思います。 提示のコードのデバッグはご自分でされるとして、 もう一度やりたいことを、整理してみましょう。 0)プログラム始め 1)シート上の改ページを解除する 2)K3から下にデータが無くなるまで見て行く 3)見ているセルの値とその下(またはその上?)の値と比べて、 違っていたら改ページを挿入する 4)2に戻る 5)プログラム終わり こうなると思います。 ここで、コードを書く前にエクセル君の癖と必要なコードを、 「マクロの記録」という機能を用いて探ってみます。 ``` Sub Macro1() ' ' Macro1 Macro ' ' Range("B6").Select ActiveWindow.View = xlPageBreakPreview Range("A1").Select ActiveCell.FormulaR1C1 = "1" Range("A1").Select Selection.AutoFill Destination:=Range("A1:A37"), Type:=xlFillDefault Range("A1:A37").Select Range("A9").Select ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell Range("A21").Select ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell Range("A30").Select ActiveSheet.ResetAllPageBreaks End Sub ``` 行った操作と記録されたコードを見て、さらに、ヘルプも確認します。 http://www.ken3.org/vba/excel-help.html 結果、指定したセルの上に改ページが挿入されるので、 K4から見て行って、見ているセルの1個上が空白になるまで繰り返すように 書いてみます。 ``` '0)プログラム始め Sub test() Dim i As Long '1)シート上の改ページを解除する ActiveSheet.ResetAllPageBreaks '行番号の初期値を設定 i = 4 '2)対象のセルの上のセルが空白でない間、繰り返す Do While Cells(i - 1, "K").Value <> Empty With Cells(i, "K") '3)見ているセルの値とその上の値と比べて、違っていたら If .Value <> .Offset(-1).Value Then '改ページを挿入する ActiveSheet.HPageBreaks.Add Before:=.Cells End If End With '次の行番号を用意 i = i + 1 '4)2に戻る Loop '5)プログラム終わり End Sub ``` > > 2改良できる場所があれば教えてください。 > > > そもそも、 「小計」機能に改ページを付ける機能が付いているので、 小計機能でデータの件数でも数えてやれば、 マクロなんて必要ないうえに先に書いたコードよりも速く処理できます。 どうしても、数式が不要な場合は、 ジャンプ機能で挿入された数式を検索して、行削除してやるといいと思います。 もし、他にも数式が入っているという事なら、 データ中の空白をジャンプ機能で検索するとかしたらいいと思います。 それもだめなら、検索とか置換とかフィルターも合わせて何か方策を探って、 解決していけばいいと思います。 そして、手順が複雑になったら、その時に操作の自動化(=マクロ化)を 考えて行ったらいいと思います。 操作手順が明らかになっているなら、それをマクロの記録してみて、 記録されたマクロをブラッシュアップして汎用的に使えるように、 改良したらいいと思います。