- ベストアンサー
EXCELのマクロでBook1立ち上げ時に自動で別のBookを起動するには
あるアプリケーションでEXCEL型式での出力処理をすると自動的にEXCELが起動し、「Book1」として出力されます。 このときに、自動的に別の.xlsファイルが起動するマクロを組みたいと考えています。 他のEXCELファイルから起動する際にはこの機能は必要ないため、「Book1」が開いたときにのみ有効にしたいのです。 どうぞ、お知恵をお貸しください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
VBAProject(PERSONAL.XLS) に、クラスモジュールを追加 クラスモジュールのプロパティを下記に設定 (オブジェクト名) EventClassModule Instancing 1-Private EventClassModule クラスに下記のコードを追加 '------------------------------------------- Public WithEvents App As Application Private Sub App_WorkbookOpen(ByVal Wb As Workbook) If (Wb.Name = "Book1.xls") Then '---------------------------- '実際には開きたいブックに変更 Call Application.Workbooks.Open(C:\abc.xls") End If End Sub '------------------------------------------- ANo.2 さんの回答で記載した Sub Auto_Open() Workbooks.Open "C:\abc.xls" ←フルパスで End Sub の部分を下記に変更 Dim X As New EventClassModule Sub Auto_Open() Set X.App = Application End Sub ここで、一旦ブックを保存 → PERSONAL.XLS 再立ち上げして Book1を読み込んでみてください。
その他の回答 (6)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #4 の回答者です。 >「あるアプリ」はオリジナルのシステムプログラム オプションなどを付けるようにして、そのソフト側で処理できませんか?そちら側の方が早いです。 >EXCELを立ち上げてデフォルトで生成されるBook1に貼り付けているようです。 もちろん、Book1 (これをインスタンスといいます)が生成されたときに、その内容の判定というもので、別のブックを立ち上げることも可能なのですが、おっしゃっているより難しいのです。 なお、Book1 が作られるときのイベントは、"NewWorkbook" ですが、お話の様子では、起動時に、Book# (←数字が、「1」とは限らない)と、その出来た内容を探すようにすればよいはずです。例えば、Sheet1の A1 に、必ず、「日付」という文字が入り、B1 には、「項目」という文字が入るという、キーを目印に検索させます。 >これを担当するのが主婦や高齢者などPCを苦手とする方が多いのです。 ユーザーさんの技術力の問題にも依存してきます。あまり、凝ったものを作ると、逆に、トラブった時に回復に手間が掛かります。 今まで、私も高齢者用のExcel用のアンプロテクト・オープンのお話などは納得して作ったことがありますが、今回の場合は、ある限度を越えているような気がします。 ユーザーさんのPCを手配側で設定できるような場合なら、そのまま話を進めても可能ですが、そうでないとアドイン型にします。 ユーザーさんのご自宅の場合などでは、アドインスタイルで、インストーラーを付けるなどしなくてはなりません。クリック・インストールという手法を取らなくてはいけません。 9x系の方はいらっしゃらないかもしれませんが、アンチウィルスの対策の処理までしなくてはなりません。ただし、そこまでいくと、公の掲示板では書き込むことは出来ません。 '============================================= 以下は、ほんのお遊びにしか過ぎませんが、こんなことが可能です。 なお、Book1... のような名称というのは、仮の名称であって、特に、それ自体が存在しているとはいえません。 Book1... のSheet1 のA1 に、hirakegoma と入ったときにだけ、別のファイルが開きますが、以下の「待ち時間」の4秒後を過ぎると、何も起こりません。4秒後に入れたものには何も起こりません。開いたと同時では、場合によってはマクロの検索は利かないはずです。 以下のマクロは、カプセル化もしておりませんし、本格的な内容ではありませんが、このようなことが可能です。また、別のソフトのインスタンス生成自体では、Excelのアプリケーションがどのような反応をするかは分かりません。 個人の場合は、"PERSONAL.XLS" ですが、他人に配布する場合は、アドインになると思います。 また、Excelが起動したときに、ブックの中身やブックの名称を全部調べるという方法も可能だと思います。 ループで、 For Each wb In Workbooks If wb.Name Like "Book#*" Then Workbooks.Open "Abc.xls" End If Next '------------------------------------- 'Class1 '------------------------------------- Public WithEvents App As Application Private Sub App_NewWorkbook(ByVal Wb As Workbook) '待ち時間 Const TIMELAG As Integer = 4 Set NewWb = Wb Application.OnTime Now + TimeValue("00:00:" & CStr(TIMELAG)), "OpenSesame" End Sub '-------------------------------------- '標準モジュール '-------------------------------------- Public myClass As New Class1 Public NewWb As Workbook Public Sub OpenSesame() '添付用のブック Const MYBOOK As String = "Test1.xls" With NewWb.Worksheets(1) If StrComp(.Range("A1").Value, "HirakeGoma", 1) = 0 Then If Dir(MYBOOK) <> "" Then Workbooks.Open "Test1.xls" Else MsgBox MYBOOK & "のワークブックが見当たりません。", 48 End If End If End With Set NewWb = Nothing End Sub '-------------------------------------- 'ThisWorkbookモジュール '-------------------------------------- Private Sub Workbook_Open() Set myClass.App = Application End Sub '標準モジュールのAuto_Openの場合は、オートメーションでは、そこを通らない可能性があるから、ThisWorkbook モジュールに入れたほうがよいです。Auto_Open は、あくまで、Excelを単独に開いたときだけです。
お礼
とても丁寧な回答をいただき有難うございます。 ちょうどANo.6で解決し、締め切り処理を行っている最中に投稿いただいたようで申し訳ございませんでした。 ご教示いただいた方法ですが、ファイル名に依存することなくセルの内容で判別していますので、同じく私の希望どおりの動作が得られると思います。確かに吐き出される特定のセルには必ず同じ内容があります。この方法ですとさらに細かい条件に対応した自動実行ができそうです。 Wendy02様のように希望を聞いただけでサッとコードを提示できるなんて私にとっては神業です。本当に有難うございました。またの機会がございましたらご回答いただけますと幸いです。
- nak777r
- ベストアンサー率36% (49/136)
すみません、最初の質問が、 >「Book1」が開いたときにのみ有効にしたい でしたので、そういうプログラムを回答しただけです。 EXCEL は一番大元のクラスとして、Application オブジェクトがあります この Application オブジェクトにはイベントとして、 NewWorkbook イベント 新しいブックを作成した時に発生 WorkbookOpen イベント ブックを開く時に発生 というイベントがそれぞれあります。 ヘルプで、NewWorkbook、WorkbookOpen イベントで検索 すればわかると思いますが、 新しいブックを作成した時に発生 のイベントを使用するのであれば、先に提示した Private Sub App_WorkbookOpen(ByVal Wb As Workbook) のイベントモジュールではなく Private Sub App_NewWorkbook(ByVal Wb As Workbook) のイベントモジュールを作成すればできます
お礼
説明が悪く申し訳ございませんでした。 教えていただいたとおり修正しましたところ、希望どおりの動作を得ることができました。nak777r様、最後までお付き合いいただき有難うございました。 今回の質問で、多くの方々に教えていただき大変勉強になりました。 お忙しい中、時間を割いていただいた皆様に心よりお礼申し上げます。
- nak777r
- ベストアンサー率36% (49/136)
Call Application.Workbooks.Open(C:\abc.xls") すみません ファイル名の先頭の " が抜けてました Call Application.Workbooks.Open("C:\abc.xls") です
お礼
早速のご回答、有難うございます。 上記の点を修正したところ、動作いたしました。 ただ、Book1.xlsという「ファイル」を開いたときには動作するのですが、EXCEL起動時にデフォルトで立ち上がるBook1には無効でした。教えていただいたコードの"Book1.xls"の部分を"Book1"に書き換えてみてもダメです。 しかし、今回教えていただいた方法はとても便利で、今後活用させていただきたいと思います。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >あるアプリから「EXCEL型式で出力」を選択した際に「Book1」(ファイルとして保存されていない状態のもの)としてEXCELが立ち上がるため、Book1そのものにマクロを埋め込むのはムリかと思うのですが。 「あるアプリ」というのが、非Excelなのでしょうか? ご自身がおっしゃっているとおりだと思いますが、インスタンス生成時に、「あるアプリ」で生成されたものか、判定をさせるのは面倒でしょうがないです。言い換えれば、通常時のExcel起動時の際も、そういう判定をさせるということを意味しています。 単純に、"Book1" ("Book1.xls"というファイルではありません)というインスタンスに対して、「別の.xls」ファイルが立ち上げるというのなら、Excelを起動するたびに起動してしまいます。「別の.xls」が何をするか、ということにも関係してくると思います。 それは、アドインや参照設定の呼び出しと同じことだと思います。「あるアプリ」側に設定させられなければ、そのように、受け手側のイベントで操作するのは、出来ないというわけではないのですが、ひじょうに面倒です。 例えば、起動しているすべてのソフトウェアのハンドルを判定して、それがあったら、NewWorkbook イベントとかで、インスタンス生成時に、別ブックを呼び出しとかいうのでしたら、可能なような気がしますが、ただ、かなり大仕掛けで、単にブックの呼び出しOpenで、そこまでする必要があるのか、疑問が残ります。(今は、私の想像の範囲で、違っているかもしれません) 単純に、コマンド・ボタンで呼び出すぐらいではいけないのでしょうか?
お礼
ご回答いただき有難うございます。 「あるアプリ」はオリジナルのシステムプログラムで集計データをEXCEL型式で吐き出す機能を持っているのです。この時、ファイルとして吐き出すのではなく、EXCELを立ち上げてデフォルトで生成されるBook1に貼り付けているようです。 業務上、このEXCELデータを色々加工しなければならないのですが、これを担当するのが主婦や高齢者などPCを苦手とする方が多いのです。ボタン操作で加工可能なマクロを含んだEXCELファイルは作成したのですが、これが立ち上がり時に自動で開けばより分かりやすいだろうと考えた次第です。 大変勉強になりました。
- suz83238
- ベストアンサー率30% (197/656)
標準モジュールに Sub Auto_Open() Workbooks.Open "C:\abc.xls" ←フルパスで End Sub
お礼
早速のご回答、有難うございます。 VBAProject(PERSONAL.XLS)の標準モジュールに上記内容を記載したところ、自動で開くようにはなりました。 しかし、このままですと他のEXCELファイルを開いたときにもabc.xlsが開いてしまいます。 あるアプリから「EXCEL型式で出力」を選択した際に「Book1」(ファイルとして保存されていない状態のもの)としてEXCELが立ち上がるため、Book1そのものにマクロを埋め込むのはムリかと思うのですが。 それでもBook1として開いたときにのみabc.xlsが開くようにしたいのです。 わかりにくい説明になってしまいますが、宜しくお願い申し上げます。
- Nabehi
- ベストアンサー率49% (25/51)
WorkBooks.Add のことでしょうか?
お礼
早々に有難うございます。 WorkBooks.Addについて調べてみましたが難しくてよくわかりません。 EXCELの初期ブックであるBook1が立ち上がる際に自動的にabc.xlsも立ち上がるようにしたいのです。
お礼
詳細なご回答をいただき、有難うございます。 早速試してみたのですが、コンパイルエラー(構文エラー)が出てしまいました。 '------------------------------------------- Public WithEvents App As Application Private Sub App_WorkbookOpen(ByVal Wb As Workbook) If (Wb.Name = "Book1.xls") Then '---------------------------- '実際には開きたいブックに変更 Call Application.Workbooks.Open(C:\abc.xls") End If End Sub '------------------------------------------- 上記を貼り付けた際に Call Application.Workbooks.Open(C:\abc.xls") の部分が赤くなりコンパイルエラーとして:が修正候補にあがっています。