[[20141018210439]] 『個人用マクロブックのThisWorkbook』(mickey) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『個人用マクロブックのThisWorkbook』(mickey)

ThisWorkbookのコードを個人用のマクロブックのThisWorkbookに記入したいのですが、
どのような書き方で記入したらよいでしょうか?

個人用マクロブックに登録しなくても、
ある特定のフォルダに保存している複数のBOOK(ファイル名はそれぞれ異なります)にのみ
有効になるようにしたいのですが、個人用マクロブックに登録する以外に
良い方法がありますか?よろしくお願いします。

次のようなコードです。

 Private Sub Workbook_BeforePrint(Cancel As Boolean)
  
   Worksheets("印刷用").Range("D3").Value = Format(Now(), yymmddhhmm)

      Application.OnTime Now(), "ThisWorkbook.AfterPrint"

 End Sub

 Sub AfterPrint()

    'ここに印刷後の処理コードを記述
     Sheets(Array("入力設計", "印刷用")).Select
    Sheets("印刷用").Activate
    Sheets(Array("入力設計", "印刷用")).Copy
    ActiveWorkbook.SaveAs fileName:= _
        "C:\Users\keike_000\Documents\システム練習\" & 
  Sheets("印刷用").Range ("D4").Value & Sheets("入力設計").Range("D5").Value
  & ".xlsm", FileFormat:= _
        xlOpenXMLWorkbookMacroEnabled, WriteResPassword:="", 
    CreateBackup:=False
    ActiveWindow.Close
    Sheets("印刷用").Select

  End Sub

< 使用 Excel:Excel2013、使用 OS:Windows8 >


 ほかのブックのイベントを取得する、ということですよね?
http://hpcgi1.nifty.com/kenzo30/b_cbbs/cbbs.cgi?mode=al2&namber=20518&rev=&no=0&P=R&KLOG=133

 こちらにサンプルがありそうですが、参考になりますか?
(稲葉) 2014/10/18(土) 23:27

ありがとうございます。
はい、そうですね。
ご案内いただいたURLのコードは、個人用マクロブックのThisWorkbookに記入ですか?
それとも、ExcelのBOOKのほうでしょうか?

すみません。VBAがまだよく理解できてなくて…
なんとなく、自分で調べた時もこんな感じのコードを入れてみたけど、書き方が悪いみたいで
うまくできませんでした。

他のBOOKでも使えるようにしたいのは、最初に書いた上記のコードですが、
その下に下記のようなコードもThisWorkbookに記入しています。
この処理は、このコードを書いてあるBOOKのみで有効になるように
したいのです。この部分はそのままでいいのでしょうか?
よろしくお願いします。

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    ThisWorkbook.Saved = True '保存させない
    End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

    If SaveAsUI = True Then '別名保存は許可します
        ElseIf IsAdmin = False Then '上書き保存にはパスワードを要求します
        Cancel = True
    End If
End Sub

(mickey) 2014/10/20(月) 07:57


 少しは自分で考えてみたらいかがでしょう?

 個人用マクロブックのThisWorkBookモジュールに
 Private WithEvents xApp As Application 'Applicationオブジェクトのイベントをキャッチする。
 Private Sub xApp_WorkbookBeforePrint(ByVal Wb As Workbook, Cancel As Boolean)
     MsgBox Wb.Path & vbNewLine & "テスト"
 End Sub
 一度エクセルをすべて閉じて(アプリケーションも)
 再度立ち上げてから適当なブックを印刷しようとしてみてください。

 >ある特定のフォルダに保存している複数のBOOK
 >次のようなコードです。 
 のコードも見ましたが、特定のブックがどこに保存されているのか、具体的に何をしたいのか
 分からないのでご自身で記述頂くか、詳細に説明してください。

 >Application.OnTime Now(), "ThisWorkbook.AfterPrint"
 こちらもなぜわざわざOnTimeメソッド?

 即実行ならそのまま続けてコードを記述すればよいのでは?

 やってみて出来なかったことを「なぜ出来ないのか」という聞き方でお願いします。
(稲葉) 2014/10/20(月) 15:34

詳しくありがとうございます。
サンプルコードをもとに、動きを確認することができました。

今、個人用マクロブックに入れているので、
これを"C:\Users\keike_000\Documents\システム練習\"にある「.xlsm」のファイルを開いた時のみ、
印刷前の処理を有効にしたいのですが…

それから、変数の定義みたいなエラーメッセージがでるようになったので、今、「'Option Explicit」にしています。
必要ないでしょうか?

個人用マクロブックに記入しているコードは次のものです。
練習したものや確認したものが表示されてて見にくいと思いますが、申し訳ありません。
よろしくお願いします。

'Option Explicit

Private WithEvents xApp As Application 'Applicationオブジェクトのイベントをキャッチする。

Private Sub Workbook_Open()

    Set xApp = Application
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Set xApp = Nothing
End Sub

 Private Sub xApp_WorkbookBeforePrint(ByVal Wb As Workbook, Cancel As Boolean)
       'MsgBox Wb.Path & vbNewLine & "テスト"
      Wb.Worksheets("印刷用").Range("D3").Value = Format(now(), yymmddhhmm)

        ' Dim A
        ' A = Wb.Worksheets("印刷用").Range("D3").Value
          'A = Format(now(), yymmddhhmm)
        'Application.OnTime Now(), "ThisWorkbook.AfterPrint"
       
    Wb.Worksheets(Array("入力設計", "印刷用")).Select
    Wb.Worksheets("印刷用").Activate
    Wb.Worksheets(Array("入力設計", "印刷用")).Copy
    ActiveWorkbook.SaveAs Filename:= _
        "C:\Users\keike_000\Documents\システム練習\" &
 Wb.Worksheets("印刷用").Range("D4").Value & Wb.Worksheets("入力設計").Range("D5").Value & ".xlsm", FileFormat:= _
        xlOpenXMLWorkbookMacroEnabled, WriteResPassword:="", CreateBackup:=False

 End Sub
(mickey) 2014/10/21(火) 14:59

 ただ貼り付けただけじゃないか!
 何のためにMsgBoxにWb.Pathを入れておいたと思うんですか。

 IfでWb.Pathを比較して処理を分岐するだけじゃないですか。

(稲葉) 2014/10/21(火) 15:24


 こんにちは。

 > Private Sub Workbook_BeforePrint(Cancel As Boolean) 
 > Worksheets("印刷用").Range("D3").Value = Format(Now(), yymmddhhmm) 
 素朴な疑問、これってどうしても印刷直前にマクロで入れないとダメですか。
 印刷用シートのD3セルにtoday関数でも入れておけば済むのではないでしょうか。

 > それから、変数の定義みたいなエラーメッセージがでるようになったので、今、「'Option Explicit」にしています。 
 あ、そういうことは絶対にやっちゃダメです。
 「Option Explicit」に戻してください。
 エクセルさんがわざわざ「コードがおかしいですよ、直したほうがいいですよ」と
 教えてくれているんです。「黙れ!」って対応はまずいです。
 変数名は入力ミスしてないですか?

( 佳 ) 2014/10/21(火) 20:39


コードの意味は何となく想像つきますよね。

 Private Sub xApp_WorkbookBeforePrint(ByVal Wb As Workbook, Cancel As Boolean)
    Const myFn = "C:\Users\keike_000\Documents\システム練習\*xlsm"
    If Not Wb.FullName Like myFn Then Exit Sub
    MsgBox Wb.FullName & vbNewLine & "テスト"
 End Sub

(マナ) 2014/10/22(水) 22:21


稲葉さん、ありがとうございます。
意味が分かってなくて、すみません。
条件入れて、確認することができました。

佳さん、ありがとうございます。
いろいろ勉強になりました。

 >素朴な疑問、これってどうしても印刷直前にマクロで入れないとダメですか。
 >印刷用シートのD3セルにtoday関数でも入れておけば済むのではないでしょうか。
 印刷データを日付と時刻の番号で毎回自動保存するので、印刷直前がいいかと思いまして…
Format関数は使わず、エクセルの書式設定で大丈夫でした。

マナさん、ありがとうございます。
動作確認できました。
このような方法があるんですね。意味も調べてみました。

(mickey) 2014/10/23(木) 20:41


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.