知りたいこと
事前バインディングにて、「すでに開いているブック」を取得する方法は存在するのでしょうか?
もし存在するなら、「New」キーワードや「Open」「Add」メソッドなどのほかに、何かがあるのでしょうか?
無ければ、やはりGetObject関数を使うしかなく、その際「特に問題は無い。トラブルは起こらない。2重のバインディングになる?とかは考えなくていい。」、という理解でよろしいのでしょうか?
どうかお教えください。
質問した理由
ExcelVBA初心者なので、まだ事前バインディングと実行時バインディングの細かい動きなどを理解できていないのですが、例えば、Word等からExcelファイルを操作したい場合で考えてみますと・・・、
(01)例えば事前バインディングをしたときには・・・、
a:新規ファイルを作る→NewやAddメソッドで。
b:既存ファイルを開く→NewやOpenメソッドで。
・・・といったような形でWordなどからExcelファイルを操作できると理解しています。
(02)それに対して、実行時バインディングにしたときは・・・
c:新規ファイルを作る→CreateObject関数で。
d:既存ファイルを開く→GetObject関数で。
・・・というような認識でいます。
実行時バインディングでしたら、既存ファイルのうち、「すでに開いているブック」は、「GetObject関数」で取得できます。
そこで、「そういえば、事前バインディングのほうで ”すでに開いているブックを取得する ” っていう話は聞かないな。なぜだろう? もしGetObject関数でしかやれないなら、事前バインディングと実行時バインディングで2重にバインディングする、みたいなことになるのかしら?特にトラブったりがないなら別にそれでもいいのだけど・・・」と、ふと思ったので質問させていただきました。
もし『事前バインディングで ” すでに開いているブックを取得する ” 方法』があるなら知りたいです。
Webを色々と調べたり、ヘルプを探したりもしてみたのですが、自分にはわかりませんでした。
WordとExcelのファイルを1つずつ開いて、Wordから・・・、
VBA
1Dim bk01 As Object 2Set bk01 = Excel.Application.Workbooks.Open("Book1") 3bk01.Application.Visible = True 4
・・・のようにしてみましたら、マイドキュメントの「Book1.xlsx 」がさらに、開いただけでした。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
ベストアンサー
「CreateObject、GetObject は実行時バインディング、New が実行時バインディング」という理解がそもそも勘違いだと思います。
また、参照設定がしてあるかどうかも、事前バインディングと実行時バインディングとは関係ありません。
変数宣言時にオブジェクトの型が決まっているか、なんでも代入できるObject型で宣言しているかの違いです。
例えば、Excelに参照設定してあった場合、下記は実行時バインディングです。
vba
1 Dim app As Object 2 3 Set app = New Excel.Application 4 app.Visible = True 5 app.Workbooks.Open "C:\TEST\test.xlsx"
逆に、下記は事前バインディングです。(ただし、推奨できる書き方ではないらしい。)
vba
1 Dim app As Excel.Application 2 3 Set app = CreateObject(,"Excel.Application") 4 app.Visible = True 5 app.Workbooks.Open "C:\TEST\test.xlsx"
下記を読まれるといいかと思います。
4.4 アーリーバインディングとレイトバインディング - EXCEL-VBA開発講座
既に開いている Excel あるいは、WorkBook を取得する場合は、GetObject しかないと思います。
ただし、複数の Excel が開かれている場合、どの Excel を取得するかは不確定なので、やはり、あまり推奨できません。
私は以上のように理解しているのですが、深いところまで理解しているわけではないので、外している部分があるかもしれません。その場合は、ご指摘ください。
投稿2019/04/22 07:04
総合スコア34345
0
VBA
1Option Explicit 2 3'★ツール→参照設定でMicrosoft Excel *.* ObjectLibraryに 4' チェックを入れておいて下さい。 5Sub test() 6 Dim AppExcel As Excel.Application 7 Dim b As Excel.Workbook 8 9 If GetExcel(AppExcel) = False Then 10 MsgBox "エクセルが開いていません。" 11 Exit Sub 12 End If 13 14 15 For Each b In AppExcel.Workbooks 16 Debug.Print b.Name 17 Next 18End Sub 19 20Function GetExcel(ByRef xlApp As Excel.Application) As Boolean 21 On Error Resume Next 22 Set xlApp = GetObject(, "Excel.Application") 23 On Error GoTo 0 24 If xlApp Is Nothing Then Exit Function 25 GetExcel = True 26End Function
こんな感じですかね?
----------<追記>------------
VBA
1Sub test() 2 Const cBName As String = "Book1" '開いているブック名 3 Dim wb As Excel.Workbook 4 5 If Word.Application.Tasks.Exists(cBName) Then 6 'Set wb = Excel.Workbooks(cBName) 7 Set wb = GetObject(, "Excel.Application").Workbooks(cBName) 8 End If 9End Sub
Word VBA だと、指定のブックが開いているかどうかは簡単に確認出来ますが、
Set wb = Excel.Workbooks(cBName)
とやっても新しくエクセルが起動しますね^^;
WindowsのAPI関数でウィンドウのハンドルを探したらよさそうですが、
GetObject関数を使うのが簡単そうですかね。。。。。
投稿2019/04/22 04:41
編集2019/04/24 13:27総合スコア2167
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
事前バインディングとやらは何の話をしているのかはわかりませんが、Workbooksコレクションには開いているブックが含まれています。
例えば次のようなコードを実行すると、開いているブックの一覧が取得できます。
VBA
1For Each wb In Workbooks 2 Debug.Print wb.Name 3Next
取得の仕方はSetです。
hoge.xlsxというブックが存在していたとしたら、
VBA
1Set bk = Workbooks("hoge.xlsx")
投稿2019/04/21 23:42
総合スコア17000
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
(01)オブジェクトの種類を明確に型の宣言をすると事前バインディング(=アーリーバインディング:ある意味、「コンパイル時」バインディング?)
(02)Object型で宣言すると実行時バインディング(=レイトバインディング:文字通り、実行時バインディング?)
バインディングの話は、別アプリケーションやそのオブジェクトの操作の話ではなく、変数の宣言の仕方やコンパイル時か実行時かの違いの話、ということで、『Web情報や書籍などの情報を、私が勝手に「勘違い」して理解していたことが、今回の疑問の原因というか、質問の答え 』という結論に達することができ、とてもすっきりしました。
まだ完全には理解できていないかもしれませんが「2重のバインディング」ということも考えずに済み、CreateObject関数なども今までどおり使えることがわかり、ありがたいです。
皆さんからたくさん、コードも教えていただき、全部、1行ずつ、実行して色々と考えることができました。ありがとうございました。
みなさん全員に、自分にとってはとってもよいことをたくさん教えていただいたので、全員にベストアンサーを送りたい気持ちですが、考え方の過ちを教えてくださった hatena19さんをベストアンサーにさせて頂きたいと思います。
皆さま、ほんとうにありがとうございました。
投稿2019/04/22 12:06
総合スコア94
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/22 11:42
2019/04/22 13:17
2019/04/22 13:57
2019/04/22 22:56
2019/04/23 02:37