書き込みに気がつかなくて返事が遅れてしまいました。が、その間に下記のマクロを入れてみたら思いどおりの動きをしてくれました。…また突っ込みどころの多いコードかと思いますが。
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim c As Long, d As Long, e As Long, f As Long, g As Long, h As Long
Dim i As Long, j As Long, k As Long, l As Long, m As Long, n As Long
Dim maxRow As Long
c = Cells(Rows.Count, "C").End(xlUp).Row
d = Cells(Rows.Count, "D").End(xlUp).Row
e = Cells(Rows.Count, "E").End(xlUp).Row
f = Cells(Rows.Count, "F").End(xlUp).Row
g = Cells(Rows.Count, "G").End(xlUp).Row
h = Cells(Rows.Count, "H").End(xlUp).Row
i = Cells(Rows.Count, "I").End(xlUp).Row
j = Cells(Rows.Count, "J").End(xlUp).Row
k = Cells(Rows.Count, "K").End(xlUp).Row
l = Cells(Rows.Count, "L").End(xlUp).Row
m = Cells(Rows.Count, "M").End(xlUp).Row
n = Cells(Rows.Count, "N").End(xlUp).Row
maxRow = WorksheetFunction.Max(c, d, e, f, g, h, i, j, k, l, m, n)
ActiveSheet.PageSetup.PrintArea = "B1:N" & maxRow
End Sub
私だったら、自分が使う用なら関係ないシートやセルの変更時に
今回の処理はする必要はないので無駄を省くという意味で
変数宣言のあとに以下の点線内のコードを追加するんじゃないかと思います。
---------------------------------------
'対象シートじゃなかったら Exit Sub する
If Not (Sh Is Worksheets(1)) Then Exit Sub
'対象セルが含まれていなかったら Exit Sub する
If Intersect(Target, Range("B:N")) Is Nothing Then Exit Sub
---------------------------------------
そもそも、シートモジュールの Worksheet_Change プロシージャに書いておけば
If Not (Sh Is Worksheets(1)) Then Exit Sub すら不要になります。
↑
現状は全てのワークシートが変更対象になっていますよね。
ワークブック内の全てのワークシートに処理が必要か、
もしくはワークブックにワークシートが1枚しかないという仕様を
考慮した上でのことであるならこのコメントは無視してください。
Intersect関数は、Target As Range を引数に受け取るプロシージャでよく使います。
ご参考までに^^;