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