エクセルVBAのプリンタ制御で困っています

このQ&Aのポイント
  • エクセル2003を使用しています。Sheet1での印刷を禁止し、Sheet2での印刷はネットワーク上のどのプリンタでも許可する方法を教えてください。
  • 現在、Sheet1で印刷禁止を出されると、Sheet2の印刷ダイアログで従前のプリンタのプロパティが呼ばれてしまいます。この現象の回避策を教えてください。
  • エクセルVBAのプリンタ制御についての回避策をお教えください。
回答を見る
  • ベストアンサー

エクセルVBAのプリンタ制御で困っています

エクセル2003を使用しています。 質問が少し長くなってしまうことをご容赦下さい。 行いたいことは、Sheet1での印刷を禁止し、Sheet2での印刷はネットワーク上のどのプリンタでも許可するということです。 これを行う為に、次のコードを書きました。 Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name = "Sheet1" Then Cancel = True MsgBox "印刷は禁止されています。" End If End Sub これで良いと思っていたのですが、次の問題が発生してしまいました。 このコードが実行され、印刷禁止のメッセージがでた後でSheet2に移動し、 その後Sheet2の印刷ダイアログで現在アクティブになっているPrinter1からPrinter2に変更してプロパティボタンを押すと、 何故か従前にアクティブだったPrinter1のプロパティが呼ばれてしまいます。 印刷の都合上Printer2のプロパティを変更する必要があるのですが、 Sheet1で印刷禁止を出されてしまうとPrinter2のプロパティを変更することができません。 発生頻度は少ないと思いますが、出来れば回避したいと思っています。 この現象は私の環境でのみ発生してしまう現象なのか? ということも含めて何か回避策をお教え頂けないでしょうか。 何方か助けていただければ幸いです。 宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

No2です。 それではこうしたらどうでしょう? 該当BOOKのSheet1だけ、Ctrl+Pも無効にします。 ThisworkbookモジュールとSheet1のシートモジュールを使います。 Thisworkbookモジュールに Private Sub Workbook_Open() If ActiveSheet.Name = "Sheet1" Then Application.OnKey "^{p}", "" For Each myCB In Application.CommandBars myCB.Enabled = False Next myCB Else Application.OnKey "^{p}" For Each myCB In Application.CommandBars myCB.Enabled = True Next myCB End If End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.OnKey "^{p}" For Each myCB In Application.CommandBars myCB.Enabled = True Next myCB End Sub Private Sub Workbook_Activate() If ActiveSheet.Name = "Sheet1" Then Application.OnKey "^{p}", "" For Each myCB In Application.CommandBars myCB.Enabled = False Next myCB Else Application.OnKey "^{p}" For Each myCB In Application.CommandBars myCB.Enabled = True Next myCB End If End Sub Private Sub Workbook_Deactivate() Application.OnKey "^{p}" For Each myCB In Application.CommandBars myCB.Enabled = True Next myCB End Sub Sheet1のモジュールに Private Sub Worksheet_Activate() Application.OnKey "^{p}", "" For Each myCB In Application.CommandBars myCB.Enabled = False Next myCB End Sub Private Sub Worksheet_Deactivate() Application.OnKey "^{p}" For Each myCB In Application.CommandBars myCB.Enabled = True Next myCB End Sub

naitake
質問者

お礼

merlionXXさん、有難うございました。

naitake
質問者

補足

merlionXXさん、有難うございます。 Application.OnKeyメソッドのことは知りませんでした。 キーボードの押下を制御できるのですね。 勉強になりました。 頂いた回答で今回の症状は回避できそうです。 大変助かりました。 ただ、皆さんWorkbook_BeforePrintのCancelを使っていて私のような症状は出ていないのでしょうか? また、別の機会に今度はこの症状の事を質問してみようと思います。 本当に有難うございました。

その他の回答 (2)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

乱暴ですがいっそのこと、Sheet1ではメニューを消してしまうというのはどうでしょうか?(印刷だけでなく、書式等も変更できなくなってしまいますが。) Sheet1のシートモジュールに以下をコピペしてみて試してください。 Sheet1がアクティブになるとメニューが隠れ、他シートに移動すればメニューは戻ります。 Private Sub Worksheet_Activate() For Each myCB In Application.CommandBars myCB.Enabled = False Next myCB End Sub Private Sub Worksheet_Deactivate() For Each myCB In Application.CommandBars myCB.Enabled = True Next myCB End Sub

naitake
質問者

お礼

merlionXXさん、どうも有難うございました。

naitake
質問者

補足

アドバイスをありがとうございます。 有効な手段だと思います。 しかし、Sheet1でショートカットキー(ctrl + P)が押された場合も Sheet2が同様の症状になってしまい、症状回避が不十分なままとなってしまいます。 アドバイス頂いた点は埋め込んでおくつもりですが、 症状回避の不十分な部分の改善か、若しくは、何故この症状が出てしまうのか? と言う原因なども、もしお分かりになりましたらお教え頂ければ幸いです。 細かい事を言って申し訳ありませんが、宜しくお願いいたします。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name = "Sheet1" Then Cancel = True MsgBox "印刷は禁止されています。" else cancel=false End If End Sub 上の2行を追加してみてください ヘルプにイベント終了後も、制御が保持されるようなことが書いてあるので この場合は「sheet1」以外は、falseにしないと印刷関係の操作ができないのではと思います

naitake
質問者

お礼

hige_082さん、どうもありがとうございました。

naitake
質問者

補足

早速のご解答どうもありがとうございます。 ご教示の通り修正して試してみましたが、やはり状況は改善されず、 Sheet2でアクティブプリンタをPrinter2に変更しても従前のアクティブプリンタだった Printer1のプロパティが表示されてしまいます。 Sheet1で禁止メッセージを出さなければこの現象は発生しないのですが、 不思議です。 質問に記載をし忘れてしまいましたが、 Printer1、Printer2共にネットワーク共有されているプリンタです。 もし、他に回避策を思いつくようでしたら、是非ご教示下さい。 宜しくお願いいたします。

関連するQ&A

  • エクセルVBAのBeforePrintで

    ThisWorkbookモジュールで Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name <> "Sheet1" Then Exit Sub MsgBox "BeforePrintイベント発生" End Sub を使って、Sheet1での印刷のイベントを取得できます。 ただ、指示がPrintなのかPrintPreviewなのかが取得できません。 印刷またはプレビューされる前にどちらの指示なのかを取得する方法がありますか?

  • 印刷制御について

    VBA全くの初心者です Private Sub Workbook_BeforePrint(Cancel As Boolean) If Range("A1").Value = 文字 Then Cancel = True End If End Sub 上記ではA1に文字が入ってないと印刷が出来ないのは分かりますが 例えばsheet1を印刷する時は、A1とA3とB5に文字が入ってないと印刷出来ない様にして、Sheet2を印刷する時は、A2とA4とB6に文字が入ってないと出来ない様にする事は可能でしょうか?

  • エクセルのsheet1つだけの印刷制御について

    win xp office2003を使用しています。 全てのsheetの印刷制御は、下記の方法でできるのはわかっているのですが..... ************************************************* Private Sub Workbook_BeforePrint(Cancel As Boolean) MsgBox "このExcelシートは、印刷できません", vbExclamation Cancel = True End Sub ************************************************* 1つのシートだけを印刷できないようにするにはどうしたら良いでしょうか?

  • VBA

    下記に、ツールバーにある印刷ボタンを押すとチェックBOXがチェックされていない時印刷できないようにするというVBAですが下のVBAのような感じで 例えばセルA1にFALSEという文字が入っていたら印刷不可で印刷するかしないかを選択。もし、セルA1にTRUEという文字が入っていたら印刷可。 というのをVBA教えて下さい。 よろしくお願いします。 Private Sub Workbook_BeforePrint(Cancel As Boolean)   With Worksheets("sheet1").CheckBoxes("チェック 1")     If .Value <> 1 Then      If MsgBox("印刷しますか?", vbYesNo) <> 6 Then Cancel = True      End If     End With End Sub

  • エクセルの特定シート(複数)を印刷不可にするVBA

    教えてください。VBA超初心者です。 エクセルで、特定の複数のシート(指定シート)を印刷不可にする方法はありますでしょうか? いろいろと調べてみたところ、特定シート(一つ)を指定する場合はわかりました。 BBシート印刷不可。 ========================== Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name <> "BB" Then Exit Sub MsgBox "印刷できません" Cancel = True End Sub '========================== できれば、3つあるシートのうち、 AAシートは印刷可能。 BBシートとCCシートは、印刷不可。 としたいのです。 ご伝授いただけると助かります。よろしくお願いします。

  • Excelのシートを印刷不可(禁止)にするにはどうしたら?

    同様の質問があると思うのですが、どうもうまくいきません。 Windows2000 Excel2000 で下記をコピーして入れてみたのですが、 印刷禁止にならないのです。 もしかすると、マクロを使えていないのかも知れません。 誰か、“猿”でもわかるぐらい、Excelシートの印刷禁止の方法を 優しく解説して頂けないでしょうか? 宜しくお願い致します。 (特にマクロをどう使ったらいいのかわかっていないです) Private Sub Workbook_BeforePrint(Cancel As Boolean) MsgBox "このExcelシートは、印刷できません", vbExclamation Cancel = True End Sub

  • エクセルVBA設定 パスワード入力しても印刷不可

    エクセルVBAでパスワードを入力しないと印刷できない設定にしました。 Private Sub Workbook_BeforePrint(Cancel As Boolean) Password = "1111" x = InputBox("印刷注意 パスワード") If x = Password Then Else Cancel = True End If End Sub パスワード【1111】を入力しても印刷できないのですが、なぜでしょう?

  • エクセルVBAの不思議な挙動?

    エクセル2003です。 ThisWorkbookには以下の記述があります。 Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name <> "Sheet1" Then Exit Sub If Range("A1").Value = "" Then MsgBox "A1が未入力です" Range("A1").Select Cancel = True End If Application.OnTime Now(), "ページ移動" End Sub 標準モジュールには以下の記述があります。 Sub ページ移動() Sheets("Sheet2").Select Range("A1").Select End Sub Sub プリント() ActiveWindow.SelectedSheets.PrintPreview End Sub これでSheet1を開いた状態でツールバーから印刷プレビュー指示をすると、A1セルが入力済みであればプレビュー画面を出し、プレビューを閉じればSheet2が表示されます。 ところが、同じ状態でツールバーからではなく、マクロ Sub プリント を実行すると、プレビュー画面にはなりますが、プレビューを閉じてもSheet1のままです。 なぜ、 Application.OnTime Now(), "ページ移動" が、有効にならないのでしょうか?

  • Excel 印刷禁止 マクロの作り方

    毎年の期末で担当者が変わるため、 3/31で印刷を禁止するマクロを作りましたが、 これを応用して初めての使用後、30日で印刷が出来なくなるように しようと思いましたが、なかなか出来ません。どなたか力を貸してください。 Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim D As Integer D = (Now+30) - Now If D <= 0 Then Cancel = True MsgBox "30日経過しましたので、担当者へ連絡してして下さい。印刷できません", 48, " Else Cancel = False Exit Sub End If End Sub 以上 よろしくお願いします。

  • どこが間違ってますか? (エクセルVBAです)

    質問をご覧くださりありがとうございます。 どなたか助けていただけないでしょうか。 以下のコードの場合、B2セルをダブルクリックすればシート(1)が開くと思っていたのですが、B2以外のセルをダブルクリックしてもシート(1)が開いてしまいます。 どこが悪いのでしょうか。 詳しい方がいらっしゃいましたら、どうか教えてください。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, cancel As Boolean) If Target = Range("B2") Then cancel = True Worksheets("シート(1)").Activate End If End Sub どうか、宜しくお願いいたします。

専門家に質問してみよう