
No.3ベストアンサー
- 回答日時:
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を読み込んでみてください。
詳細なご回答をいただき、有難うございます。
早速試してみたのですが、コンパイルエラー(構文エラー)が出てしまいました。
'-------------------------------------------
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")
の部分が赤くなりコンパイルエラーとして:が修正候補にあがっています。
No.7
- 回答日時:
こんにちは。
#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様のように希望を聞いただけでサッとコードを提示できるなんて私にとっては神業です。本当に有難うございました。またの機会がございましたらご回答いただけますと幸いです。
No.6
- 回答日時:
すみません、最初の質問が、
>「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様、最後までお付き合いいただき有難うございました。
今回の質問で、多くの方々に教えていただき大変勉強になりました。
お忙しい中、時間を割いていただいた皆様に心よりお礼申し上げます。
No.5
- 回答日時:
Call Application.Workbooks.Open(C:\abc.xls")
すみません ファイル名の先頭の " が抜けてました
Call Application.Workbooks.Open("C:\abc.xls")
です
早速のご回答、有難うございます。
上記の点を修正したところ、動作いたしました。
ただ、Book1.xlsという「ファイル」を開いたときには動作するのですが、EXCEL起動時にデフォルトで立ち上がるBook1には無効でした。教えていただいたコードの"Book1.xls"の部分を"Book1"に書き換えてみてもダメです。
しかし、今回教えていただいた方法はとても便利で、今後活用させていただきたいと思います。
No.4
- 回答日時:
こんばんは。
>あるアプリから「EXCEL型式で出力」を選択した際に「Book1」(ファイルとして保存されていない状態のもの)としてEXCELが立ち上がるため、Book1そのものにマクロを埋め込むのはムリかと思うのですが。
「あるアプリ」というのが、非Excelなのでしょうか?
ご自身がおっしゃっているとおりだと思いますが、インスタンス生成時に、「あるアプリ」で生成されたものか、判定をさせるのは面倒でしょうがないです。言い換えれば、通常時のExcel起動時の際も、そういう判定をさせるということを意味しています。
単純に、"Book1" ("Book1.xls"というファイルではありません)というインスタンスに対して、「別の.xls」ファイルが立ち上げるというのなら、Excelを起動するたびに起動してしまいます。「別の.xls」が何をするか、ということにも関係してくると思います。
それは、アドインや参照設定の呼び出しと同じことだと思います。「あるアプリ」側に設定させられなければ、そのように、受け手側のイベントで操作するのは、出来ないというわけではないのですが、ひじょうに面倒です。
例えば、起動しているすべてのソフトウェアのハンドルを判定して、それがあったら、NewWorkbook イベントとかで、インスタンス生成時に、別ブックを呼び出しとかいうのでしたら、可能なような気がしますが、ただ、かなり大仕掛けで、単にブックの呼び出しOpenで、そこまでする必要があるのか、疑問が残ります。(今は、私の想像の範囲で、違っているかもしれません)
単純に、コマンド・ボタンで呼び出すぐらいではいけないのでしょうか?
ご回答いただき有難うございます。
「あるアプリ」はオリジナルのシステムプログラムで集計データをEXCEL型式で吐き出す機能を持っているのです。この時、ファイルとして吐き出すのではなく、EXCELを立ち上げてデフォルトで生成されるBook1に貼り付けているようです。
業務上、このEXCELデータを色々加工しなければならないのですが、これを担当するのが主婦や高齢者などPCを苦手とする方が多いのです。ボタン操作で加工可能なマクロを含んだEXCELファイルは作成したのですが、これが立ち上がり時に自動で開けばより分かりやすいだろうと考えた次第です。
大変勉強になりました。
No.2
- 回答日時:
標準モジュールに
Sub Auto_Open()
Workbooks.Open "C:\abc.xls" ←フルパスで
End Sub
早速のご回答、有難うございます。
VBAProject(PERSONAL.XLS)の標準モジュールに上記内容を記載したところ、自動で開くようにはなりました。
しかし、このままですと他のEXCELファイルを開いたときにもabc.xlsが開いてしまいます。
あるアプリから「EXCEL型式で出力」を選択した際に「Book1」(ファイルとして保存されていない状態のもの)としてEXCELが立ち上がるため、Book1そのものにマクロを埋め込むのはムリかと思うのですが。
それでもBook1として開いたときにのみabc.xlsが開くようにしたいのです。
わかりにくい説明になってしまいますが、宜しくお願い申し上げます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルVBA 4 2022/05/14 00:51
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/06/04 09:39
- Visual Basic(VBA) tatsumaru77様 昨日回答して頂いたものです。 すみませんが、昨日の質問で1つ補足があります 1 2022/05/15 15:06
- Visual Basic(VBA) Excelマクロ Application.Run 5 2023/06/17 15:16
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- ノートパソコン EXCEL のドキュメントの回復について 2 2023/03/19 17:16
- Excel(エクセル) Excel起動時にエラーダイアログが表示される 3 2022/07/28 19:52
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- その他(Microsoft Office) office2010とoffice365の共存でoffice365を優先で起草させたい 3 2023/01/24 10:47
- Excel(エクセル) 同じExcelのBOOK内で 1枚目のシートのA1のセルにデータを 入れると2枚目のシートのC1のセ 1 2022/10/25 09:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】元データと同じお客...
-
VBAで保存しないで閉じると空の...
-
【Excel VBA】マクロでExcel自...
-
エクセル関数>参照ファイル名...
-
エクセルのvbaにて thisworkboo...
-
マクロの保存先、開いてるすべ...
-
EXcelのマクロで相対パスでファ...
-
【Excel】マクロの保存先について
-
【マクロ】マクロが保存されて...
-
エクセル;相対パスを絶対パスへ...
-
エクセルで上書き保存できない
-
エクセルで使用期限付きのブッ...
-
複数のExcelファイルの印刷設定...
-
EXCELブックが勝手に開いて困っ...
-
[フィルターオプションの設定]...
-
ファイル名変更後も、マクロを...
-
エクセルVBA 個人用マクロブッ...
-
Excel2013でのPersonal.xls
-
エクセルで未保存に対するメッ...
-
エクセル タスクスケジューラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで保存しないで閉じると空の...
-
エクセル関数>参照ファイル名...
-
【Excel VBA】マクロでExcel自...
-
マクロの保存先、開いてるすべ...
-
エクセルのvbaにて thisworkboo...
-
EXcelのマクロで相対パスでファ...
-
【Excel】マクロの保存先について
-
エクセル;相対パスを絶対パスへ...
-
EXCELブックが勝手に開いて困っ...
-
エクセルで未保存に対するメッ...
-
excelで直前に参照していたブッ...
-
EXCELのボタンによるマクロの登...
-
ファイル名変更後も、マクロを...
-
エクセルで使用期限付きのブッ...
-
【Excel】特定セルの内容をテキ...
-
複数のExcelファイルの印刷設定...
-
エクセルを開いて文字を打つ際...
-
EXCELマクロで、開いてはいるが...
-
エクセルで複数ファイルのセル...
-
[フィルターオプションの設定]...
おすすめ情報