質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

1974閲覧

エクセルVBAにて、A.xlsxが既に開いている状態でB.xlsmを開こうとした時に、別ウインドウでB.xlsmを開きたい

yuYU_YUyu

総合スコア13

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/10/08 13:41

前提・実現したいこと

エクセルVBAにて、下記を実現したい。
A.xlsxが既に開いている状態で、B.xlsmを開こうとした時に、別ウインドウでB.xlsmを開きたい。

発生している問題・エラーメッセージ

別ウインドウでB.xlsmを開くことができない。
詳細は下の「試したこと」を参照下さい。
エラーメッセージは無し。

該当のソースコード

ExcelVBA

1Private Sub Workbook_Open() 2 Dim filePath As String 3 Dim APP As Object 4 5 filePath = ThisWorkbook.FullName 6 ThisWorkbook.Close 7 8 Set APP = CreateObject("Excel.Application") 9 APP.Visible = True 10 APP.Workbooks.Open filePath 11 Set APP = Nothing 12End Sub

試したこと

A.xlsxを開いた状態で、上記コードをThisWorkbookモジュールに記述したB.xlsmを実行すると、
ThisWorkbook.Close
にてファイルが閉じてしまうため、
Set APP = CreateObject("Excel.Application")
を含む以降のコード(実現したいことが記述されたコード)が実行されない。

補足情報(FW/ツールのバージョンなど)

Windows 10 Home Build 17134
Microsoft Excel 2010 Ver: 14.0.7212.5000(32bit)
Microsoft Visual Basic for Applications 7.0
Version 1643
VBA: Retail 7.0.1643
Forms3: 14.0.7153.5001

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

質問文に書いてある通りに解釈すると(不足している部分は想像で補って)、

A.xlsxが既に開いている状態で、
ユーザーがB.xlsmを開こうとしたとき、
別ウィンドウ(別インスタンスのExcelアプリケーション)で開く。
A.xlsxが開いていない状態なら、普通に開く。

Excel2013以降なら何もしなくても別ウィンドウで開くのですが、
Excel2010はMDIなので一つのExcelアプリケーションウィンドウ内に
複数のブックウィンドウが開くことになるので、それを強制的に
別ウィンドウで開きたいということでしょうか。

とりあえず下記のコードで上記のことは実現できます。

B.xlsmのThisWorkbookモジュール

Private Sub Workbook_Open() Const ABook = "C:\test\A.xlsx" Const BBook = "C:\test\B.xlsm" 'A.xlsxが開いていない場合は何もしない If Not IsBookOpened(ABook) Then Exit Sub 'A.xlsxが既に開いている場合は別インスタンスのExcelでB.xlmsを開く Dim APP As Excel.Application Set APP = CreateObject("Excel.Application") APP.Visible = True APP.EnableEvents = False 'これがないと無限ループに陥る APP.Workbooks.Open BBook APP.EnableEvents = True Set APP = Nothing 'ブックを閉じる ThisWorkbook.Close End Sub '指定のブックが開いているかチェックする関数 Function IsBookOpened(a_sFilePath) As Boolean On Error Resume Next '// 保存済みのブックか判定 Open a_sFilePath For Append As #1 Close #1 If Err.Number > 0 Then '// 既に開かれている場合 IsBookOpened = True Else '// 開かれていない場合 IsBookOpened = False End If End Function

ThisWorkbook.Closeしてしまうとそれ以降のコードは実行されないので、
最後にThisWorkbook.Closeするようにする。
これだけだと、開いたときに Workbook_Open が実行されるので、
永遠にB.xlsmが開かれ続けることになる(検証実験中にそうなって焦った(;^ω^)。
APP.EnableEvents = FalseWorkbook_Open が発生しないようにする必要あり。

ただし、これだと読み取り専用モードで開きます(しばらくすると解除できますが。)
また、へたすると無限ループに陥るなどの危険性のある方法なのでお勧めしません。

下記に紹介してあるようなユーザー操作で開く方法にするか、

Excelを別ウィンドウで複数同時に操作する(Windows編) (1/2):Tech TIPS - @IT

Excel2013以降にバージョンアップすることを推奨します。

投稿2018/10/09 05:39

hatena19

総合スコア33610

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuYU_YUyu

2018/10/10 10:18

説明不足な部分を補って解釈頂き、また丁寧にご回答下さいましてありがとうございました。 行いたいことが実現できました。 hatena19 さんがおっしゃるように、 閉じる前に開くとどうしても 読み取り専用 として開いてしまうため、 閉じてから開く方法がないものかと考えておりました。 が、しばらくすると編集可能となる、ということで行いたいことが実現しました。 上記エクセルの特性を完全に忘れておりました。 > Excel2013以降なら何もしなくても別ウィンドウで開くのですが エクセルのバージョンにより、SDI,MDIの特性があることは承知しておりましたが、 こちらの環境ではエクセル2010を使用することが義務付けられております。 また、ご提示頂きましたリンク先の解決策(エクセルを予め別ウインドウで開いて そこにドラッグする方法やレジストリを変更する方法)についても、 承知はしておりましたが、ユーザに強制することができない状況です。 このような状況下でどうしたものかと考えたのですが、行き詰まってしまい、 質問させて頂いた次第です。 この度はどうもありがとうございました。
guest

0

A.xlsxではなく、A.xlsmではありませんか?

コードを見ると自分自身を開いて閉じてと意味不明なことをしていますが、質問文通りのことを実現するならこうなりますね。
※A.xlsmとB.xlsmが同じフォルダにあると仮定

VBA

1Private Sub Workbook_Open() 2 Dim filePath As String 3 Dim APP As Object 4 5 filePath = ThisWorkbook.Path & "\B.xlsx" 6 7 Set APP = CreateObject("Excel.Application") 8 APP.Visible = True 9 APP.Workbooks.Open filePath 10 Set APP = Nothing 11 12 ThisWorkbook.Close False 13End Sub

ただ、Openイベントの中でCloseすると思わぬエラーにつながるので、一旦Open時のイベントが全て処理されてから閉じるように、OnTimeで遅延させたほうが良いかもしれません。

VBA

1Private Sub Workbook_Open() 23 Application.OnTime [Now() + "00:00:01"], "ThisClose" 4End Sub 5 6Sub ThisClose() 7 ThisWorkbook.Close False 8End Sub

このような書き方をしてしまうと(マクロのセキュリティ設定が最低の時)A.xlsmが編集出来なくなるのでご注意下さい。

投稿2018/10/09 01:22

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/09 05:58

質問の意味を正確に捉えていなかったようです。 私の回答は無視して下さい。
yuYU_YUyu

2018/10/10 10:22

情報不足な質問に対してご回答下さいましてありがとうございました。 行いたかったことは、ttyp03 さんと hatena19 さんへの回答に記載をさせて頂きました。
guest

0

情報が曖昧です。
A.xlsxとの関連性は?
提示コードが登録されているのはB.xlsm?
ThisWorkbook=B.xlsm?
提示コードは単に自分自身を開きなおしているように思えるがその認識で正しいですか?
質問タイトルの「別ウィンドウで開きたい」という件はどこにかかっているのですか?

ThisWorkbook.Closeにてファイルが閉じてしまうため

原因がわかっているなら閉じなければ?と思いますが…。
ただ前述したように自身を開きなおしているだけのように思えるコードなので、もう少し登場人物を整理していただけるとよりよい回答が得られるかと思います。

投稿2018/10/09 00:26

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuYU_YUyu

2018/10/10 10:03

説明が不足しており申し訳ありません。 hatena19 さんがご理解、ご提示下さった内容が実現したかったことです。 > A.xlsxとの関連性は? 何らかのエクセルファイル(.xls, .xlsx, .xlsm, .xlsb,,,)が 開かれている状態で B.xlsm を開く場合は、 既に開かれているエクセルファイルのウインドウとは 別のウインドウ内で B.xlsm を開きたい、 エクセルファイルが何も開かれていない状態で B.xlsm を開く場合は、そのまま普通に開く というのが実現したい動作です。 > 提示コードが登録されているのはB.xlsm? A2. おっしゃる通りです。 > 原因がわかっているなら閉じなければ?と思いますが…。 B.xlsm を開くと、エクセル2010を使用しているため、 既存のエクセル(A.xlsx)と同一のウインドウで開かれてしまいます。 よって、一度閉じて、再度開くときに別ウインドウで開く、 という回りくどいことをしようとしておりました。 初めて質問を本サイトでさせて頂いたのですが、 なかなか説明が上手くできませんでした。 次回以降、もう少し説明を詳細にしたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問