• ベストアンサー

Excel VBAでファイル オープン時のイベント

Excelファイルを開く際、イベントを発生したいのですが可能でしょうか? 通常だと、開くファイルにイベントを記述するとおもいますが、ExcelファイルAを 起動しておくと、ファイルB、ファイルCを開いた際に、ファイルB、ファイルCを 開いたイベントを取得したいのです。 イベントは、ファイルAに記述することになります。 Excel上にハイパーリンクで他のExcelファイルをリンクしています。 リンクを開くとハイパーリンクのあるファイルが下になってしまい、次のファイル が開きにくいため、開いたファイルのサイズ、位置を修正したいためです。 以上 よろしくお願いします。

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

  • ベストアンサー
  • eden3616
  • ベストアンサー率65% (267/405)
回答No.3

他サイト様へ回答を丸投げだと申し訳ないのでサンプルを用意しました。 最下のVBAコードをAブックの「ThisWorkbook」に記述してください。 Aブックのには以下の二つのファイルがリンクされています。(画像参照) 「test1ブック」として「U:\test1.xlsx」 →以下Bブックとします 「test2ブック」として「U:\test2.xlsx」 →以下Cブックとします (リンクの存在するシート及びセルの位置はどこでも構いません) リンクがクリックされると (1)1つ目に開かれたリンクは「Select Case」により   「Case 2」で記述しているサイズ及び位置に設定されます。 (2)2つ目に開かれたリンクは「Select Case」により   「Case 3」で記述しているサイズ及び位置に設定されます。 注) 「Select Case」で開かれているワークブックの数「Workbooks.Count」を条件分岐としていますので A.xlsmが開かれている時点で「Workbooks.Count」の値は1になりますので、 BやCが開かれると「2」や「3」になります。 このあたりは適当に対応してください。 ■VBAコード Private Sub Workbook_SheetFollowHyperlink(ByVal Sh As Object, ByVal Target As Hyperlink) Dim tar_book As Workbook Set tar_book = Workbooks(Dir(Target.Address)) ActiveWindow.WindowState = xlNormal With tar_book.Windows(1)   '現在のブックの数をチェック   Select Case Workbooks.Count   Case 2     '1つめに開かれたブックの処理     .Width = 200     .Height = 100     .Left = 0     .Top = 0   Case 3     '2つめに開かれたブックの処理     .Width = 200     .Height = 100     .Left = 0     .Top = 100   End Select End With End Sub

tate1943
質問者

お礼

丁寧にソースなどを記載頂き、ありがとうございます。 無事解決できそうです。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.2

No1です。 そもそも・・・・ Aブックのハイパーリンクでマクロを起動し、 http://www.excel-wing.com/study/jitumu/941 起動したマクロからB・Cブックを開いて http://officetanaka.net/excel/vba/file/file05.htm ウィンドウ位置を調整すればいいかと。 http://www.happy2-island.com/excelsmile/smile03/capter00307.shtml

tate1943
質問者

お礼

ありがとうございます。FollowHyperlinkでイベントとして取得できたのですね。 リンクをHyperlink関数を使っていたため、動作しないものと勘違いしていました。ハイパーリンク(関数でないほう)では使用できました。 ありがとうございます。

すると、全ての回答が全文表示されます。
  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

BやらCのOpenイベントに自身のウィンドウ位置を調整するコードを入れればいいだけなきがしますが。 どうしても管轄をAブックで統括したいのであれば、 BやらCやらのブックのOpenイベントに Aのブックに記述したプロシージャを呼びに行くようにしてから Aブック内のプロシージャでBやらCのウィンドを操作すればよいのでは? 以下でA.xlsmを開いた状態でB.xlsmを開けば、A.xlsmのa_testが実行されます。 ■「A.xlsm」ブックの標準モジュールに記述 Sub a_test() MsgBox "aが実行されました" End Sub ■「B.xlsm」ブックのThisWorkbookに記述 Private Sub Workbook_Open() Application.Run "A.xlsm!a_test" End Sub

tate1943
質問者

お礼

BやCのファイルには、マクロを導入したくないため、Aブックにのみの記載でできないか検討していました。 アドバイスありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A