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

・Sheet3 を Sheet2 へコピーし、Sheet2 へ改ページを挿入するマクロを作りました。
しかしこの改ページ処理
  ws_sheet2.Cells(idx_sentou + 1, 1).PageBreak = xlManual
を実行すると以下のエラーが発生します。

  実行時エラー '1004':
  Range クラスの PageBreak プロパティを設定できません。

不思議なことに、デバッグウィンドウを表示しF5で実行すると、上記のエラーは発生しません。

・以下の条件下で発生する事が判明しています。
EXCEL2010、他のバージョンでは試していません。
Sheet1 へ図形を貼り付け、そこへマクロはを登録し実行しています。
Sheet2 は[改ページプレビュー]です、[標準]ビューではエラーになりません。
Sheet2 の全てのセルを削除した状態でのみ発生し、1行でもセルが存在する場合には発生しません。
※具体的には Sheet2 の "A1"セルにカーソルがある状態で、CTRL + SHIFT + END で全セルを選択後、右クリックより削除(D)でセルを削除。

・どうかご教授の程、宜しくお願い致します。

・マクロ
Sub Macro1()

Dim ws_sheet2 As Object
Dim ws_sheet3 As Object
Dim idx_sentou As Long

'* ワークシート変数の設定
Set ws_sheet2 = Worksheets("Sheet2")
Set ws_sheet3 = Worksheets("Sheet3")

'* インデックスの設定
idx_sentou = 10

'* sheet2 の初期クリア
ws_sheet2.Range("A1:P999").Clear

'* sheet2 の改ページをクリア
ws_sheet2.ResetAllPageBreaks

'* sheet3 を sheet2 へコピー
'* ※sheet3には書式が設定されており、その書式を sheet2 へコピーする為
ws_sheet3.Range("1:10").Copy
ws_sheet2.Range("1:10").PasteSpecial Paste:=xlPasteAll

'* sheet2 をクリア
ws_sheet2.Cells(1, 1).Resize(9, 4).Value = ""

'* sheet2 を編集
ws_sheet2.Cells(10, 1).Value = "XXXXXXXX"

'* 改ページの挿入
ws_sheet2.Cells(idx_sentou + 1, 1).PageBreak = xlManual

End Sub

A 回答 (1件)

2003でも発生しますね。


[改ページプレビュー]時の描画関係で何か不具合があるのかもしれません。
#タイミングの問題?

解消策としては
・一旦[標準]ビューで処理し、最後に[改ページプレビュー]設定する。
・ws_sheet2をActiveにして実行する。
・'* 改ページの挿入の直前に DoEvents を挿入する。
・Application.ScreenUpdating = False で実行する。
いずれでも解消するようです。

以下余談、ちょっと気になったこと。
>ws_sheet3.Range("1:10").Copy
>ws_sheet2.Range("1:10").PasteSpecial Paste:=xlPasteAll
xlPasteAllなら
ws_sheet3.Range("1:10").Copy ws_sheet2.Range("1:10")
でもいいかな、という点と
>'* sheet2 をクリア
なら
ws_sheet2.Cells(1, 1).Resize(9, 4).ClearContents
のほうがいいかな、という点です。参考まで。
    • good
    • 1
この回答へのお礼

早速の回答と、丁寧な説明、自環境で再現テストまでしていただき、
本当にありがとうございました。

>>・一旦[標準]ビューで処理し、最後に[改ページプレビュー]設定する。
(;^_^A アセアセ・・・、ご指摘を受ける前にこの方法に気付くべきですよね...
この事象は質問を書いている途中で気が付き、
そこまで頭がまわりませんでした。
→解消いたしました

>>・ws_sheet2をActiveにして実行する。
ws_sheet2.Activateを挿入しOKでした。
→解消いたしました
ただ、オリジナルのソースの方でも既にActivateは試していたのですが
、そちらは何故かNG、もっと複雑なソースなので別要因かもしれません。

>>・'* 改ページの挿入の直前に DoEvents を挿入する。
→解消いたしました

>>・Application.ScreenUpdating = False で実行する。
こちらの環境ではNGでした。
Application.ScreenUpdating = False
'* 改ページの挿入
ws_sheet2.Cells(idx_sentou + 1, 1).PageBreak = xlManual
Application.ScreenUpdating = True


>>ws_sheet3.Range("1:10").Copy ws_sheet2.Range("1:10")
>>でもいいかな、という点と
VB ならまだしも VBA となるとまるで素人で、よくわからず
作っております、ご指摘の通りに修正しました。

>>ws_sheet2.Cells(1, 1).Resize(9, 4).ClearContents
>>のほうがいいかな、という点です。参考まで。
同じく、ご指摘の通りに修正しました。
こう言うアドバイスって素人には本当に助かります。


最終的には DoEvents 使用し解決とさせていただきました。
なにはともあれ、本当にありがとうございました。

お礼日時:2012/12/20 09:40

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

このQ&Aを見た人はこんなQ&Aも見ています