Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5105 / 13644 ツリー ←次へ | 前へ→

【52592】マクロで新規作成したブックのWorkBook_BeforePrintイベントへのマクロの埋... まつ 07/11/20(火) 17:28 質問[未読]
【52593】Re:マクロで新規作成したブックのWorkBook... ichinose 07/11/20(火) 18:10 発言[未読]
【52595】Re:マクロで新規作成したブックのWorkBook... まつ 07/11/20(火) 19:38 発言[未読]
【52596】Re:マクロで新規作成したブックのWorkBook... ichinose 07/11/20(火) 20:38 発言[未読]
【52597】追伸 ichinose 07/11/20(火) 20:53 発言[未読]
【52598】Re:マクロで新規作成したブックのWorkBook... まつ 07/11/20(火) 22:25 お礼[未読]

【52592】マクロで新規作成したブックのWorkBook_...
質問  まつ  - 07/11/20(火) 17:28 -

引用なし
パスワード
   いろいろ探してみたのですが、自分ではうまく探すことができず、ここで質問させてください。

マクロで新規作成したブックで、ある条件のとき印刷不可にしたいと思っています。
WorkBookのBeforePrintイベントに以下のようにマクロが組んであるブックに対しては
印刷不可にできるのはわかりました。

Private Sub WorkBook_BeforePrint(cancel As Boolean)
  Dim Sheet_Name As String
  Dim w_str As String
  
  Sheet_Name = ActiveSheet.Name
  If Sheet_Name = "伝票" Then
    If Range("B5") = "" Then        '/*---セル"B5":日付
      cancel = True
      w_str = "日付が未入力なので印刷できません。"
      MsgBox w_str, vbExclamation, "印刷"
    End If
  End If
End Sub

マクロで新規作成したブックのBeforePrintイベントに上記のコードを埋め込む方法は
ないものでしょうか?
ブックの新規作成をするマクロが含まれるプロジェクトのWorkBook_BeforePrintイベントに
上記のコードを書いておいてコピーする方法とかあるのでしょうか?

【52593】Re:マクロで新規作成したブックのWorkBo...
発言  ichinose  - 07/11/20(火) 18:10 -

引用なし
パスワード
   ▼まつ さん:
こんばんは。

>マクロで新規作成したブックのBeforePrintイベントに上記のコードを埋め込む方法は
>ないものでしょうか?
そういう方法もないわけではありませんが、この事象ではそれが適当かどうかは
詳しい仕様の記述がないと何ともいえませんねえ!!

>ブックの新規作成をするマクロが含まれるプロジェクトのWorkBook_BeforePrintイベント

このマクロを含むプロジェクトのthisworkbookのモジュールに
'=============================================================
Option Explicit
Dim WithEvents new_bk As Workbook
'=============================================================
Sub 新規作成()
  Set new_bk = Workbooks.Add
End Sub
'=============================================================
Private Sub new_bk_BeforePrint(Cancel As Boolean)
  Dim Sheet_Name As String
  Dim w_str As String
 
  Sheet_Name = new_bk.ActiveSheet.Name
  If Sheet_Name = "伝票" Then
    If new_bk.ActiveSheet.Range("B5") = "" Then        '/*---セル"B5":日付
      Cancel = True
      w_str = "日付が未入力なので印刷できません。"
      MsgBox w_str, vbExclamation, "印刷"
    End If
  End If
'このイベントプロシジャー中身は吟味していません
End Sub

とし、プロシジャー「新規作成」で作成された新規ブックは、
上記の「new_bk_BeforePrint」というイベントプロシジャーが作動します。

ユーザーが通常オペレーティングで新規作成したブックに対してもイベントを適応したいなら、Applicationレベルのイベントを拾う方法を取らなければなりません。


まずは、上記を試してみてください

【52595】Re:マクロで新規作成したブックのWorkBo...
発言  まつ  - 07/11/20(火) 19:38 -

引用なし
パスワード
   ichinoseさん、返答ありがとうございます。
試してみましたが、うまくいきませんでした。
VBA初心者なのでやり方が違っているかもしれませんが・・・。

前述では、詳細がわかりにくかったのでもう一度内容を記述します。
新規作成は以下のように行われます。

 A.xlsに組み込まれたマクロで、
 ユーザーフォーム上に配置されたコマンドボタンのクリックイベントにより、
  ・新規ブック作成
  ・新規作成されたBook1.xlsに、C.xlsの"伝票"シートをコピー

このBook1.xlsに対してある条件のとき印刷不可にしたいのです。

それで最初の書き込みで記述したWorkBook_BeforePrintイベントのソースを
A.xlsのどこかに組み込んでおき、それを新規ブック作成のタイミングで
Book1.xlsのWorkBook_BeforePrintイベントにコピーできないものかと思ったのです。

【52596】Re:マクロで新規作成したブックのWorkBo...
発言  ichinose  - 07/11/20(火) 20:38 -

引用なし
パスワード
   ▼まつ さん:
>試してみましたが、うまくいきませんでした。
ここの記述を詳細にする事が肝心なんですよ!!
「うまくいかない」の一言ではなく、
投稿したコードから試したオペレーションを事細かく
記述してください。それがフィードバックですよね!!


私も再度、投稿します。
まつ さんが問題を抱えているブックではなく、新規ブックの
Thisworkbookのモジュールに

'===============================================================
Option Explicit
Dim WithEvents new_bk As Workbook
'===============================================================
Sub 新規作成()
  Set new_bk = Workbooks.Add
End Sub
'===============================================================
Private Sub new_bk_BeforePrint(Cancel As Boolean)
  MsgBox "印刷できないよ"
  Cancel = True
End Sub


まず、上記のプロシジャー「新規作成」を実行してください。

すると、
上記マクロを記述した以外に新しく作成されたブックが確認できるはずです

この新たに作成されたブックに対して、セルA1に適当な文字列(例えば、abc)と
入力後、印刷を実行してください。

「印刷できないよ」というメーセージが表示されるはずです。

いかがですか?

上記のマクロのあるブックは開いている状態でなければなりませんよ!!

だって、このイベントプロシジャーは
「新規作成」というプロシジャーによって作成されたブックに存在するわけではないのですからね!!


これが私が提案した方法です。
で、追加された投稿を拝見しましたが、
上記のサンプルが確認できたら、
上記を元に応用・工夫するような仕様にすることを提案します。


>
>前述では、詳細がわかりにくかったのでもう一度内容を記述します。
>新規作成は以下のように行われます。
>
> A.xlsに組み込まれたマクロで、
> ユーザーフォーム上に配置されたコマンドボタンのクリックイベントにより、
>  ・新規ブック作成
>  ・新規作成されたBook1.xlsに、C.xlsの"伝票"シートをコピー
>
>このBook1.xlsに対してある条件のとき印刷不可にしたいのです。
>
>それで最初の書き込みで記述したWorkBook_BeforePrintイベントのソースを
>A.xlsのどこかに組み込んでおき、それを新規ブック作成のタイミングで
>Book1.xlsのWorkBook_BeforePrintイベントにコピーできないものかと思ったのです。
やはり、本当の意味のコードのコピーはこの事象では不向きです。

こいうことは、VbProjectを操作することで可能です。
が、Excel2002からは、セキュリティの設定が必要ですし、既定値では
使用できません。

VbProjectを操作するようなコードは、VBAプログラマのためのツールとして使われるようなプログラムなら、よいのですがねえ

つまり、使う側(ユーザー)もこのセキュリティをはずす事の危険性などを
知っているような特殊な場合です。


まずは、上記の記述から動作を確認することから始めてください。

【52597】追伸
発言  ichinose  - 07/11/20(火) 20:53 -

引用なし
パスワード
   VBProjectを操作することを学ぶのは
決して悪いことだとは思いません。

ここのサイトの検索で
VBProject VBComponents 等をキーに調べてみてください。
いくつもサンプルがあると思います。
勉強されてVBAプログラマにとっての便利なツールを作成するときには
役に立つかもしれません

【52598】Re:マクロで新規作成したブックのWorkBo...
お礼  まつ  - 07/11/20(火) 22:25 -

引用なし
パスワード
   ichinoseさん、ありがとうございます。

ichinoseさんより教えていただいた方法で、もう少し時間をかけてじっくりやってみます。

5105 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free