プロが教えるわが家の防犯対策術!

エクセル2010 マクロエラーについて
以前 印刷について下記コードを提示して頂きました。
このコードが通る時と2回目の .Zoom = j で止まる時があります。
どなたか検証して頂き、何が原因なのかご教示頂けますでしょうか?
宜しくお願い致します。

Dim myRng As Range
Dim i As Long
Dim j As Long
Dim k As Long

j = 100

With ActiveSheet
Set myRng = .Range("A1", .Cells(Rows.Count, "L").End(xlUp)).Resize(, 16)
For i = 1 To myRng.Columns.Count
If i = 11 Then
.Columns(i).AutoFit
End If
Next i
With .PageSetup
.PrintArea = myRng.Address
.Orientation = xlLandscape
.PaperSize = xlPaperA4
.Zoom = j
Do
k = Application.ExecuteExcel4Macro("COLUMNS(GET.DOCUMENT(65))")
If k = 1 Then Exit Do
j = j - 1
.Zoom = j '”ここで実行時エラー1004” PageSetupクラスのZoomプロパティを設定できません”
Loop
End With
.PrintOut Preview:=True
.PageSetup.Zoom = 100
End With

A 回答 (2件)

こんばんは。



そのコードのエラーは、もともと想定済みなのですが、注意点として、あまりも古い問題なので、今さらということで、曖昧にしていました。もちろん、Microsoft側も、曖昧なままにしています。たぶん、現在のバージョンまで直っていないと思います。

この話は、Microsoft Support に残っているかもしれませんが、趣旨は、Zoomなど、画面全体に影響するものは、印刷の設定自体が狂うことがあるそうです。当然ですが、無理な部分のあるコードです。

k = Application.ExecuteExcel4Macro("COLUMNS(GET.DOCUMENT(65))")
これは、横方向のページ改行の数を取得しようとしたコードです。
それで、ワザと、マクロ関数を使ったわけです。VBAメソッドでは、かなりのタイムロスが生じるためです。

しかし、それが逆に災いしてしまったようです。

今考えられるのは、2つの方法です。

例えば、

 If k = 1 Then Exit Do
  j = j - 1
  .PrintArea = myRng.Address '*
  .Orientation = xlLandscape '*
  .PaperSize = xlPaperA4 '*
  .Zoom = j
Loop

とフルに入れる方法と、もうひとつは、設定が安定するのを待たせるために、ループのスピードを落とす方法です。

モジュール画面の一番上に

Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
と入れておいて、

  Do
   k = Application.ExecuteExcel4Macro("COLUMNS(GET.DOCUMENT(65))")
   If k = 1 Then Exit Do
   j = j - 1
   .Zoom = j
   DoEvents '*
   Sleep 500 '*500/1000秒 'スピードの調整。二度目からの安定を図る
  Loop

このどちらかだと思います。Waitでも良いのですが、Sleepという、Win32API関数を使う理由は、メモリ負担を減らす目的です。なお、これで直らない場合は、エラー・トラップ(On Error Goto ~)を設定してください。事前には、なかなか書きにくかったことで、ご面倒をかけましたが、よろしくご了解願います。
    • good
    • 0
この回答へのお礼

申し訳なく思いつつも、大変感謝しています。
体調は如何でしょうか?

提示して頂いた修正コード2点ですが、
実際に動かしましたところ、最初のフルに入れる方法を活用させて頂きます。

2点目のコードだと、同じく .Zoom = j のところでエラーが発生してしまい、
またOn Error Goto ~を用いてもエラーは回避しても時間が掛かるため
最初のコード(こちらもやや時間はかかりますが)の方が
確実性があるように感じましたので、そちらを使用させて頂きます。

過去に遡り多々ご迷惑をお掛けしました事、申し訳ありませんでした。
しかし、その後素人の悪あがきで、試行錯誤しながら手を変え品を変え
コードを書き換えたりしていましたら、ほぼ思い通りの形となりました。

当初、想定していたもの以上のものが出来るようで、本当に感謝しています。

ありがとうございました。

お礼日時:2014/05/11 00:53

Do~Loopでjが減算されていますがそこがマイナスになるということは無いですか。

    • good
    • 0

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