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

エクセル2000のVBAマクロ中で印刷をしよう
として、実行時エラー1004が発生し、原因が分からず
苦慮しています。
(前略)
Sheets("ラベル印刷").Select
...
ActiveSheet.PageSetup.PrintArea = "$A$1:$B$2"
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True

を実行すると、WorksheetクラスのPrintOutメソッドが
失敗しましたというエラーがでます。
色々試して、
Worksheets("ラベル印刷").Activate
ActiveSheet.PrintOut
とやってみたり、シートの名称をデフォルトのSheet1に
戻したりしても同様でした。
同じモジュール中で、
Sub printtest()
  Worksheets("ラベル印刷").PrintOut
End Sub
というのを記述して、VBAエディター中で実行ボタン
(▼)で実行したり、ワークシートのツール/マクロの
実行から実行すると問題なく印刷できます。
ところが、マクロを改造してこのサブルーチンをコールする
ようにすると、上と同様の現象が出ます。
別のPCで試みても再現されました。

他の部分は完成したつもりなのに、印刷が出来ず困っております。
アドバイスお願いします。

A 回答 (6件)

Win98SE,Excel2000+SP3の環境で、


下記プログラムを試してみましたが、
エラーは出ませんでした。
Sub printtest()
Sheets("ラベル印刷").Select
ActiveSheet.PageSetup.PrintArea = "$A$1:$B$2"
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
End Sub

ただ、マイクロソフトは↓のURLで、
 Excel VBA で改ページを追加する (HPageBreaks コレクション
 オブジェクト Add メソッド) 場合等、プリンタ情報の取得を伴
 う処理を行うと、Excel が強制終了し、VBA 実行時エラー 1004
 が発生する場合があります。
のような不具合があることを認めてます。
ここに書いてある回避策を試してみたらどうでしょうか?
根本的な回避策ではないようですが...

参考URL:http://www.microsoft.com/japan/support/kb/articl …
    • good
    • 0
この回答へのお礼

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

マイクロソフトジャパンのサイトで検索された、
”VBAでプリンタ関連コマンド利用時に強制終了”
という内容でしょうか。
試みてみましたが駄目でした。
やはり、EXCELのバグなのでしょうね。
先人の作成したマクロに改造を重ねて来ており
再構築には旧版EXCELのダイアログ等が作り直しになるので覚悟が必要です...

お礼日時:2003/04/05 20:11

こんにちは。



Excel97しか持ってないので外してるかも知れません。
CommandButtonなどから呼んだ場合に「1004」が出る時は「ActiveCell.Activate」を入れてます。

Excel97で、Sheet1上にCommandButtonを1つ置き、Clickイベントに

Private Sub CommandButton1_Click()
 Worksheets("Sheet1").Activate
 Worksheets("Sheet1").Copy after:=Worksheets(1)
End Sub

だと「実行時エラー1004」が出ますが、

Private Sub CommandButton1_Click()
 ActiveCell.Activate
 Worksheets("Sheet1").Copy after:=Worksheets(1)
End Sub

だとコピー出来ます。

同様の原理で↓とかにしてみたらどうでしょう?

Sub printtest()
  ActiveCell.Activate
  Worksheets("ラベル印刷").PrintOut
End Sub
    • good
    • 0
この回答へのお礼

教えていただいた、"ActiveCell.Activate "
を入れてみましたが残念ながら、改善されませんでした。

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

お礼日時:2003/04/05 20:16

私はExcel97ですが、最近はコマンドボタンを使わずにダイレクトに実行するようにしています。

なぜかコマンドボタンを使って実行マクロを呼び出すとエラーが生じるから。
オートシェイプでボタンを書き、右クリックで実行マクロを登録するやり方です。
質問とは違うかもしれませんが、コマンドボタンで1クッション置いていた時よりエラーは無いような気がします。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。

マクロでダイアログ(エクセル95から移行した隠しダイアログ)
を表示して、種々の入力を行い、そのダイアログのボタンから
更に実行するマクロなので、直に実行するという訳にはいかないのです。

ご参考までに、本日このために雑誌を購入してきて、付録の
Office2000sp-3でアップデートしてみましたが、事態は変わりませんでした。

お礼日時:2003/04/06 23:45

再びこんにちは。



省略しないでソースを提示してみては?

Sub printtest()
  Worksheets("ラベル印刷").PrintOut
End Sub

が印刷出来るのですから、これに至るまでに問題があると思います。

この回答への補足

ご指摘ごもっともです。

ただ、非常にマクロが長いのですべて載せるのは控えさせていただきます。
近道はなさそうなので、枝葉を削って簡略化し、どこで問題が出るのか
検討してみます。
結果が出たら報告させていただきます。

補足日時:2003/04/06 23:45
    • good
    • 0
この回答へのお礼

アドバイスいただいた皆さんありがとうございました。
見通しは暗そうですが、ご参考までに簡略化したリストを開示させていただきます。

エクセル95からの移行マクロなので、全て標準モジュール内に
含まれています。全部で9行に簡略化してみました。
Option Explicit
‘これはワークシートのコマンドボタンから実行され、
‘エクセル95から移行のダイアログを表示する
Sub SokutyoCalc()
DialogSheets("SokutyoDialog").Show
End Sub

‘次は上述ダイアログのコマンドボタンから実行され、諸処理を
‘行った後にプリントアウトするマクロ
‘ダイアログからは、そのCalcBegin_Click実行用のボタン
‘以外は事態の単純化のため外してしまった。
Sub CalcBegin_Click()
Worksheets("ラベル印刷").Activate
ActiveSheet.PrintOut
DialogSheets("SokutyoDialog").Hide
End Sub

この状態でもエラー1004が発生します。
ワークシートにコマンドボタンを設置し、そこから
Call CalcBegin_Click()
を実行するとエラーは発生せず、印刷されました。

以上により、エクセル95のダイアログを経ることが原因と
思われます。また、上記Sub CalcBegin_Click()で、
ダイアログを閉じてからActiveSheet.PrintOutとしても
事態は変わりませんでした。

ダイアログもEXCEL2000のユーザーフォームに載せ替えないと
ダメなんでしょうかね.....

お礼日時:2003/04/19 19:46

参考になるかどうか判りませんが


私の場合エクセル2000で
Sub test01()
Sheets("ラベル印刷").Select
ActiveSheet.PageSetup.PrintArea = "$A$1:$B$2"
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
Worksheets("ラベル印刷").Activate
ActiveSheet.PrintOut
End Sub
でシート名「ラベル印刷」(名前変更前はSheet1)のA1:B2の内容をエラーがでず、印刷しました。
プリンタはC社の旧いバブルジェットのものです
実行はVBE画面の実行メニュによって実行しました。
「ラベル印刷」と言うシートのデータが揃った段階以後でページセットアップ以下のマクロの記録を取り、本番のプログラムのその(ページ設定の関連)部分に上書き貼りつけし、実行してエラーが出ずに印刷するか試して見られてはどうでしょう。
他に動く(正常に印刷する)コード部分を作り、部分的「置換え法」によって、不都合個所を絞るより他ないと思います。
    • good
    • 0
この回答へのお礼

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

簡略化したコードでエラーが再現した状況を下の方へのお礼文に記しておきました。
エクセル95から移行したダイアログから実行することでエラーが出る様です。
操作が2段階になってしまいますが、ダイアログの処理を終了した後で、
ワークシート中に設けたコマンドボタンから実行すると問題がないのでとりあえずそれでしのぎます。
元気があったら、エクセル2000のユーザーフォームに
作り替えようと思いますが...

お礼日時:2003/04/19 19:59

再びこんにちは。



Excel97ですがやはりダメでした。
どうやらダイアログシートがモーダル中はダメみたいですね。
UserFormだと問題なさそうですが。。。

代替案としてFLGで処理の有無を判断して、シートのボタン(フォームのボタン及びCommandButton)から SokutyoCalc を呼んだ場合はそれっぽくなりましたが。。。

Option Explicit
Dim flg As Boolean

Sub SokutyoCalc()
Dim msgResult
 flg = False
 DialogSheets("SokutyoDialog").Show
 If flg Then
   msgResult = MsgBox("このまま印刷も?", vbYesNo + vbQuestion, "印刷")
   If msgResult = vbYes Then Application.Dialogs(xlDialogPrint).Show
 End If
End Sub

Sub CalcBegin_Click()
 flg = True
 Worksheets("ラベル印刷").Activate
 Worksheets("ラベル印刷").Range("A1") = "なんかの処理"
 DialogSheets("SokutyoDialog").Hide
End Sub
    • good
    • 2
この回答へのお礼

なるほど発想の転換ですね。
ダイアログを呼んだ元のサブルーチンから、
ダイアログの処理終了後に印刷すれば良いのですね。
単純にワークシート印刷コマンドを付け足して試したらうまくいきました。
自分一人では思いつかなかったと思います。
ありがとうございました。

お礼日時:2003/04/22 22:15

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