マスターシートコピー後に不要な行列を削除して
印刷範囲、改ページ位置を設定するVBAを作成しているのですが
F5実行やボタン実行とF8実行やブレークポイントで実行すると結果が変わってしまいます
全てのコードを乗せることが出来なかった為、部分記載になりますが
この様な作り方をしています
'印刷範囲の設定
Application.PrintCommunication = False
With ActiveSheet
'改ページ設定を解除
.PageSetup.PrintArea = False
.ResetAllPageBreaks
' '印刷範囲の取得
Dim print_start_s As String
Dim print_end_s As String
Dim printoutarea As Range
print_start_s = "A12" '開始行(固定)
print_end_s = "Z" & Cells(Rows.Count, 1).End(xlUp).Row '終了行(可変)
Set printoutarea = Range(print_start_s & ":" & print_end_s) '印刷範囲
'印刷範囲の収束と名前の定義
printoutarea.Name = "印刷範囲"
'印刷設定
With .PageSetup
.Orientation = xlPortrait '縦向き
.LeftMargin = Application.CentimetersToPoints(1) '左余白
.RightMargin = Application.CentimetersToPoints(1) '右余白
.TopMargin = Application.CentimetersToPoints(0.5) '上余白
.BottomMargin = Application.CentimetersToPoints(0.5) '下余白
.HeaderMargin = Application.CentimetersToPoints(0) 'ヘッダー余白
.FooterMargin = Application.CentimetersToPoints(0) 'フッター余白
.Zoom = 73 '拡大設定を74%に設定
.PrintArea = "印刷範囲" '取得した印刷範囲を設定
End With
'水平改ページ設定(ページ数設定)
Dim page_set As Range
Dim page_set_s As String
'エクセルバグ回避の為、改ページプレビュー表示にする
ActiveWindow.View = xlPageBreakPreview
'自動改ページ(ページ数)を取得
p_cnt = .HPageBreaks.Count '※変数+1した物が総ページ数
'改ページ指定設定※ある程度フォーマットを固定
For i = 13 To Cells(Rows.Count, 1).End(xlUp).Row
'区切り位置「1」入力の行検索
If Cells(i, 1).Value = 1 Then
Set page_set = Range("A" & i)
page_set_s = Replace(page_set.Address, "$", "")
.HPageBreaks.Add Range(page_set_s)
Set page_set = Nothing
page_set_s = ""
End If
Next
'エクセルバグ回避の為、開始セル、終了セルを選択する
Cells(12, "A").Select
Cells(Cells(Rows.Count, 1).End(xlUp).Row, "Z").Select
ActiveWindow.View = xlPageBreakPreview
'設定した改ページがページ跨いでないか再チェック
p_cnt = .HPageBreaks.Count '改ページ数
For i = 1 To p_cnt '改ページ数分繰り返しチェック
x = .HPageBreaks(i).Location.Row '現在の改ページ行を取得
'改ページ行のB列書式がタイトル(太字+下線+セルの結合無)か確認
If Cells(x, 2).Font.Bold = False Or Cells(x, 2).Font.Underline <> 2 Or Cells(x, 2).MergeCells = True Then
'NGなら1行づつ繰り上げて確認
For i2 = x To 12 Step -1
'タイトル行を見つけたら改ページを作成
If Cells(i2, 2).Font.Bold = True And Cells(i2, 2).Font.Underline = 2 And Cells(i2, 2).MergeCells = False Then
Set page_set = Range("A" & i2)
page_set_s = Replace(page_set.Address, "$", "")
.HPageBreaks.Add Range(page_set_s)
Set page_set = Nothing
page_set_s = ""
Exit For
End If
Next
End If
Next
End With
具体的に書くと、ページ跨ぎのチェック時に.HPageBreaks.Countが本来の数値と異なって取得されてしまい、.HPageBreaks(i).Location.Rowも存在しない行の数値を取得している為に計算が合わなくなっている様です
対象シートはおよそ600行くらいのデータなのですが対処方法がわからず・・・
ご存知の方がいれば教えて頂けないでしょうか?
宜しくお願い致します
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
こんにちは、
結果がどの様に違うのか不明ですが、検証できないのでざっくりコードを読んだ感じです。
最終行などを取得するロジックのシートオブジェクトが明示されていないようですね。
Cells(Rows.Count, 1).End(xlUp).Row
Cells(12, "A").Select など・・・
まぁ、With ActiveSheet なので 関係ないかもですが、
ActiveSheetでなく明示した方が良さそな気がします。。
デバッグ手順も詳しくわからないので、取敢えずですが、、、
(ステップ実行中にシート選択を確認の為、手動で変えたりしていませんよね)、、
No.3
- 回答日時:
こんばんは、
今日は遅いので検証することは出来ませんが、
ローカルウインドウを表示して、ステップ実行(F8)して行き
p_cntの値が変わるコード(タイミング)を調べてみてはいかがでしょう。
特定できたなら、そのメソッドやプロパティを調べたり、挙動などの検証してみるのが良いと思います。
変数宣言が見つからないのですが、おそらくLong又はIntegerだと思うのですが、数値型の代入値が関係のない他の命令やブレイクで変更される経験はありません。少ない経験ですが;
(該当しないと思いますが、RangeなどObject型だとありえます。)
検証していないので何とも言えませんが、私も不思議に思います。
週末にデモ環境を作ってみようと思います。
スルーして頂いても良いですが、私の興味にお付き合いいただけるなら
ロクな回答も出来ませんが、各変数宣言部分を教えてください。。
No.4
- 回答日時:
こんばんは、
補足を頂きまして、ありがとうございます。
今時間がなく、寝る前に確認したいと思っていますが、
順に読んでいくと、
1つ目の
p_cnt = .HPageBreaks.Count '※変数+1した物が総ページ数
'自動改ページ(ページ数)を取得
とありますので、改ページ画面移行時にExcelが余計なお世話をしている改ページ数ですね。
2つ目の
'設定した改ページがページ跨いでないか再チェック
p_cnt = .HPageBreaks.Count '改ページ数
は、
For i = 13 To Cells(Rows.Count, 1).End(xlUp).Row
'区切り位置「1」入力の行検索
If Cells(i, 1).Value = 1 Then
Set page_set = Range("A" & i)
page_set_s = Replace(page_set.Address, "$", "")
.HPageBreaks.Add Range(page_set_s)
なので、A列セル 値1の時に設定している改ページ数かと。
手動で改ページ画面に移行すると、プレビュー画面に実線部分と点線部分が、表示される場合が、印刷範囲によってあると思います。
そのカウント数を拾っているのではないでしょうか?
'改ページ指定設定※ある程度フォーマットを固定
For i = 13 To Cells(Rows.Count, 1).End(xlUp).Row ここにブレイクを入れ止めた時、改ページプレビューはどのように表示されていますか?
改ページプレビューを見ながらF8すると改ページの変化が分かるのではないでしょうか。
意味ないかも知れませんが、改ページ設定を解除してから処理を行うとか、、
ブレイクした時としない時の処理結果が違うと言う回答になっていませんが、ごめんなさい、とりあえず。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) 形式を選択して貼り付け 以下のコードで「元」シートと「先」シートのA列に同じ値があったら指定範囲をコ 5 2022/11/11 07:30
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- Visual Basic(VBA) VBAで教えて頂きたいのですが? 1 2022/04/29 02:36
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelのグレーの部分を戻したい
-
YMM4 で MOV ファイルが読み込...
-
ページが増える
-
Googleドライブの画像が開けない
-
エクセルのマクロで印刷プレビ...
-
エクセル上に貼り付けた画像が...
-
エクセルの縦の幅だけ拡大したい。
-
Excelで縦を拡大、横を縮小する...
-
エクセルでA4 2枚をA3 1枚で印...
-
改ページの2ページ目の作り方
-
Excelで特定の文字・記号のとこ...
-
ExcelVBA 改ページの横破線を消...
-
Excel上の表に縦の点線が入り消...
-
ベータ版とプレビュー版
-
Excel ~プリンターがない時で...
-
EXCEL改ページプレビューのペー...
-
エクセルのオートフィルタ機能...
-
ホームページビルダーでブラウ...
-
エクセルで印刷ページだけ白く...
-
エクセルで、大きく灰色に書か...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelのグレーの部分を戻したい
-
ページが増える
-
エクセルの縦の幅だけ拡大したい。
-
エクセルでA4 2枚をA3 1枚で印...
-
EXCEL改ページプレビューのペー...
-
改ページの2ページ目の作り方
-
エクセルのA3横一枚のデータをA...
-
YMM4 で MOV ファイルが読み込...
-
エクセル上に貼り付けた画像が...
-
EXCELで1行の内容を1枚の紙に印...
-
エクセルでページのど真ん中に...
-
印刷範囲がこまぎれになる
-
エクセルのマクロで印刷プレビ...
-
エクセルで点線を引き、印刷す...
-
Excelで縦を拡大、横を縮小する...
-
Excelの改ページ印刷についての...
-
エクセルで、大きく灰色に書か...
-
Excelで特定の文字・記号のとこ...
-
EXCEL-VBAで印刷時のページ番号...
-
プリンターが突然1部しか印刷...
おすすめ情報
お世話になります
実行中のシート切り替えはしていません
結果が違う件については
例えばコメントの「設定した改ページがページを跨いでいないかチェック」の下の
p_cnt=.HpageBreaks.Countにブレークポイントを入れて実行を止めてから
p_cntをウォッチ等で確認すると6なのですが
なお、ここで停止させてから再度F5を押すと意図したとおりの結果になります
シートの内容は同じで確認してもその下の
If Cells(i2,2).Font.Bold = True~でブレークして
p_cntをウォッチ等で確認すると10になり、そのままF5を押すと
繰り返し処理の回数が有効範囲を超えエラーになります
正直作り直しも考えていますが何故そのようになるのか不思議で
知っている人がいるかもと思い投稿しました
一度シート名を組み込んで確認してみます
よろしくお願い致します。
お世話になります
No.2の時の回答を参考にシートオブジェクトを追加してみましたが結果は変わりませんでした
p_cntの変わるタイミングはそのままp_cnt = Sheets("temp").HPageBreaks.Countで
現在の改ページ数を取得するタイミングでした
宣言していない変数の型は今回新たに全てLongにしましたが結果に変化はありませんでした
For i = 1 To p_cnt'改ページ数分繰り返しチェック にブレークポイントを設定し、
止った時にp_cntを見ると10になりますがその状態でステップを手動で繰り下げ
p_cnt = Sheets("temp").HPageBreaks.Count'改ページ数 をF8実行すると6になります
ちなみに表示上の改ページ数も6箇所です・・・
改ページ設定直後に改ページ数を取得すると正常に値が取れないという事はあるのでしょうか?
早速の返信ありがとうございます
回答します
流れ的には
①一番最初に改ページ設定と印刷範囲をクリアし
②自動で入ってくる改ページ数を取得の後、ある程度の範囲で手動改ページを設定します
※文頭にもありますが行列削除後の実行になる為、この時点では何ページ印刷か不明な為
③手動改ページ設定後に点線で表示される余分なページ跨ぎ(印刷倍率の関係で1ページに入らない)が発生する場合に中途半端な位置になると都合悪い為、2週目で意図した位置に改ページ行を移動させる(タイトル行が先頭に来る様にする)意図でVBA作成しています
現在の設定フォーマットでは一度目の自動改ページ数は7そこから手動改ページすると
2回目のチェック時は表示上6でブレークしなければ10、p_cntでブレークしてF8すると6になります
・・・不思議
行列削除のプログラムはこのコードの前に入れており印刷ページ数は3~8ページと増減があります