アプリ版:「スタンプのみでお礼する」機能のリリースについて

マスターシートコピー後に不要な行列を削除して
印刷範囲、改ページ位置を設定する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行くらいのデータなのですが対処方法がわからず・・・
ご存知の方がいれば教えて頂けないでしょうか?
宜しくお願い致します

質問者からの補足コメント

  • うーん・・・

    お世話になります
    実行中のシート切り替えはしていません

    結果が違う件については
    例えばコメントの「設定した改ページがページを跨いでいないかチェック」の下の
    p_cnt=.HpageBreaks.Countにブレークポイントを入れて実行を止めてから
    p_cntをウォッチ等で確認すると6なのですが
    なお、ここで停止させてから再度F5を押すと意図したとおりの結果になります
    シートの内容は同じで確認してもその下の
    If Cells(i2,2).Font.Bold = True~でブレークして
    p_cntをウォッチ等で確認すると10になり、そのままF5を押すと
    繰り返し処理の回数が有効範囲を超えエラーになります

    正直作り直しも考えていますが何故そのようになるのか不思議で
    知っている人がいるかもと思い投稿しました

    一度シート名を組み込んで確認してみます
    よろしくお願い致します。

    No.2の回答に寄せられた補足コメントです。 補足日時:2021/01/28 01:33
  • うーん・・・

    お世話になります
    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箇所です・・・
    改ページ設定直後に改ページ数を取得すると正常に値が取れないという事はあるのでしょうか?

    No.3の回答に寄せられた補足コメントです。 補足日時:2021/01/28 19:49
  • うーん・・・

    早速の返信ありがとうございます
    回答します
    流れ的には
    ①一番最初に改ページ設定と印刷範囲をクリアし
    ②自動で入ってくる改ページ数を取得の後、ある程度の範囲で手動改ページを設定します
    ※文頭にもありますが行列削除後の実行になる為、この時点では何ページ印刷か不明な為
    ③手動改ページ設定後に点線で表示される余分なページ跨ぎ(印刷倍率の関係で1ページに入らない)が発生する場合に中途半端な位置になると都合悪い為、2週目で意図した位置に改ページ行を移動させる(タイトル行が先頭に来る様にする)意図でVBA作成しています
    現在の設定フォーマットでは一度目の自動改ページ数は7そこから手動改ページすると
    2回目のチェック時は表示上6でブレークしなければ10、p_cntでブレークしてF8すると6になります
    ・・・不思議
    行列削除のプログラムはこのコードの前に入れており印刷ページ数は3~8ページと増減があります

    No.4の回答に寄せられた補足コメントです。 補足日時:2021/01/28 23:02

A 回答 (4件)

ブレイクポイントでデバッグ出来ないなら、debug.print で各変数を書き出したら?


それでも無理なら、一からロジックを考え直す事だね。
    • good
    • 0

こんにちは、


結果がどの様に違うのか不明ですが、検証できないのでざっくりコードを読んだ感じです。

最終行などを取得するロジックのシートオブジェクトが明示されていないようですね。
Cells(Rows.Count, 1).End(xlUp).Row
Cells(12, "A").Select など・・・
まぁ、With ActiveSheet なので 関係ないかもですが、
ActiveSheetでなく明示した方が良さそな気がします。。

デバッグ手順も詳しくわからないので、取敢えずですが、、、
(ステップ実行中にシート選択を確認の為、手動で変えたりしていませんよね)、、
この回答への補足あり
    • good
    • 0

こんばんは、


今日は遅いので検証することは出来ませんが、
ローカルウインドウを表示して、ステップ実行(F8)して行き
p_cntの値が変わるコード(タイミング)を調べてみてはいかがでしょう。
特定できたなら、そのメソッドやプロパティを調べたり、挙動などの検証してみるのが良いと思います。
変数宣言が見つからないのですが、おそらくLong又はIntegerだと思うのですが、数値型の代入値が関係のない他の命令やブレイクで変更される経験はありません。少ない経験ですが;
(該当しないと思いますが、RangeなどObject型だとありえます。)

検証していないので何とも言えませんが、私も不思議に思います。
週末にデモ環境を作ってみようと思います。

スルーして頂いても良いですが、私の興味にお付き合いいただけるなら
ロクな回答も出来ませんが、各変数宣言部分を教えてください。。
この回答への補足あり
    • good
    • 0

こんばんは、


補足を頂きまして、ありがとうございます。
今時間がなく、寝る前に確認したいと思っていますが、
順に読んでいくと、

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すると改ページの変化が分かるのではないでしょうか。
意味ないかも知れませんが、改ページ設定を解除してから処理を行うとか、、

ブレイクした時としない時の処理結果が違うと言う回答になっていませんが、ごめんなさい、とりあえず。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!