Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Home : Excel 2007)
Workbooks.Open について
投稿日時: 17/02/08 17:11:42
投稿者: sys-t-nw

こんばんは。素朴な質問で申し訳ありません。
 
Workbooks.Open = ○○○ とは、別ブックから○○○のブックのシートにあるデータを
引用したい時などに使うものだと思うのですが(それ以外にもたくさんある?)
 
例えば、○○○がブック1だとした際に、このブックで作業を行っています。
 
その時に、ブック2を新規でExcelを開き、ブック2をオープンし、マクロを動かす。
ブック2で動かしたマクロで、ブック1のデータを呼び出す。
 
 
手順としては、
1・ ブック1で作業中
2・ 新規Excelを開きブック2を開く
3・ ブック2のマクロを動かす。
4・ ブック1からデータを読み込んでブック2で処理
 
のような感じです。
 
 
素朴な疑問ですが、
ブック1は開いて作業しているので、ブック2でWorkbooks.Open = ブック1をすると2重に
開いてしまいます。
 
Workbooks.Open をせずにデータを取得しようとした場合には
どのような方法があるのでしょうか?
 
 

回答
投稿日時: 17/02/08 17:56:55
投稿者: sk

引用:
Workbooks.Open = ○○○ とは、別ブックから○○○のブックのシートにあるデータを
引用したい時などに使うものだと思うのですが(それ以外にもたくさんある?)

Workbooks オブジェクトの Open メソッドは
「(まだ開かれていない)ブックを開く」命令であり、
それ以上でもそれ以下でもありません。
 
開かれたブックをどのような目的/形で利用するかは、
そのブックが開かれた後に実行するコードの問題です。
 
引用:
素朴な疑問ですが、
ブック1は開いて作業しているので、
ブック2でWorkbooks.Open = ブック1
をすると2重に開いてしまいます。
  
Workbooks.Open をせずにデータを取得しようとした場合には
どのような方法があるのでしょうか?

既に開かれているブックを参照したいのであれば、
対象となる Workbook オブジェクトを
Workbooks オブジェクトから参照なさればよいでしょう。
 
--------------------------------------------------------------
 
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
 
Set wb = Application.Workbooks("ブック1.xlsx")
Set ws = wb.Worksheets(1)
 
MsgBox "ブック[" & wb.Name & "]の1つめのワークシートの名前は[" & ws.Name & "]です。"
 
Set ws = Nothing
Set wb = Nothing
 
--------------------------------------------------------------
 
もし "ブック1.xlsx" に該当するブックが
その時点で開かれていなければ
実行時エラーが発生することになります。

回答
投稿日時: 17/02/08 18:01:29
投稿者: WinArrow
投稿者のウェブサイトに移動

「ブック1」から「ブック2」を開くとき
>新規Excelを開き
(=インスタンスを生成して・・・という意味)
この必要はありません。
インスタンスを生成しなくても、単純に開けばよい。
 
>「ブック2」から「ブック1」を参照できます。
1つの例
For Each wbk In Application.Workbooks
    If wbk.Name = "ブック1" then Exit for
Next
If Not wbk Is Nothing Then
 
 

投稿日時: 17/02/08 18:08:54
投稿者: sys-t-nw

sk様 返信ありがとうございます。
 
 
説明がへたくそで申し訳ありません。
 
 
考えていたことは、
1. ブック1をダブルクリックで開く(作業する)
2・ Excelを新規で開き、2つ目を用意する。
3・ ブック2を2つ目のエクセルで開く
4・ ブック2のマクロを実行し、ブック1のデータを取得する
 
 
です。なので、Excel本体は、2つ開いていることになります。
 
ここで、ブック1をダブルクリックして開く、
「開く」からブック2を選んで開くと、一つのエクセルで
ブック1もブック2も開くことになります。
 
ではなく、Excelも2つ開く。ブック1とブック2を別々のエクセルで開いて処理させた時ということです。
 
 
説明がへたくそで大変申し訳ありません。

投稿日時: 17/02/08 18:11:48
投稿者: sys-t-nw

補足すると、ブック1ではメインの処理をして、ブック2で別の処理をさせるのですが、
ブック1内ですべては完結してるのですが、シートを切り替える手間を省くために
 
Excelを2つ開き処理を分け、2画面で作業できればと思い、
この方法を考えました。
 

投稿日時: 17/02/08 18:33:57
投稿者: sys-t-nw

ブックを二つ開くということは
こういうことです。
 
https://webkikaku.co.jp/blog/software/excel1/
 
 
この状態で作業gあできればと思って質問いたしました。

回答
投稿日時: 17/02/08 18:49:20
投稿者: sk

引用:
考えていたことは、
1. ブック1をダブルクリックで開く(作業する)
2・ Excelを新規で開き、2つ目を用意する
3・ ブック2を2つ目のエクセルで開く
4・ ブック2のマクロを実行し、ブック1のデータを取得する
  
  
です。なので、Excel本体は、2つ開いていることになります

引用:
補足すると、ブック1ではメインの処理をして、ブック2で別の処理をさせるのですが、
ブック1内ですべては完結してるのですが、シートを切り替える手間を省くために
  
Excelを2つ開き処理を分け、2画面で作業できればと思い、
この方法を考えました。

「ブックを切り替える」?
 
引用:
ブックを二つ開くということは
こういうことです。
  
https://webkikaku.co.jp/blog/software/excel1/
  
  
この状態で作業ができればと思って質問いたしました。

[ウィンドウの整列]コマンドにより、
両者のウィンドウを左右に並べればよいのではないでしょうか。
 
もしくは Excel 2013 以降の環境に移行された方がよいです。
(MDI 方式から SDI 方式になったので)
 
いずれにせよ、[ブック1]が既に開かれている状況で
別のインスタンスから同じファイル([ブック1])を
開こうとすること自体に無理があります。
 
どうしてもなさりたいならば、既に開かれている[ブック1]を
先に閉じてから、別のインスタンスから[ブック1]を
開き直された方が良いでしょう。

回答
投稿日時: 17/02/08 19:00:10
投稿者: sk

追記:

引用:
Workbooks.Open をせずにデータを取得しようとした場合には
どのような方法があるのでしょうか?

「[ブック1]が開かれているインスタンス」
「[ブック2]が開かれているインスタンス」の
2 つがあり、後者から前者のインスタンスを参照したいのであれば、
GetObject 関数を使用して下さい。

回答
投稿日時: 17/02/09 12:30:25
投稿者: Suzu

こんにちは。
 

引用:
補足すると、ブック1ではメインの処理をして、ブック2で別の処理をさせるのですが、
ブック1内ですべては完結してるのですが、シートを切り替える手間を省くために
  
Excelを2つ開き処理を分け、2画面で作業できればと思い

 
 
1. ブック2 には、 ブック1を参照するマクロが書かれている。
2. 画面上、「ブック1-シート1」と「ブック1-シート2」を 並べて表示したい
 
と言う意図でしょうか。
 
シート1 / シート2 を並べて表示したいが為にExcel の別インスタンスを生成しているのであれば
その必要はありません。
 
ブック1のみを開いた状態で、
ファイルメニュー
1) 「表示」-「新しいウィンドウを開く」
2) 「表示」-「整列」-「並べて表示」
とすれば、 ブック1のウィンドが2つ表示されますので、
  どちらかのウィンドウをシート1
  もう片方のウィンドウをシート2
が表示される様にすれば良いです。
 
その上で、ブック2を開いて マクロ処理を行うなら行いましょう。
 (その時は、ブック2は最小化しておけば良いですよね)

回答
投稿日時: 17/02/09 15:16:36
投稿者: WinArrow
投稿者のウェブサイトに移動

ブックを2つ開くために、各々のExcelインスタンスを生成する
という発想は、わからんでもないが、
べ別のインスタンスの生成はナンセンス
 
1つのインスタンスでブックはいくつでも開けます。
余りにもインスタンスにこだわるばかりに、解決を遅くしています。
 
と、感じています。
 

回答
投稿日時: 17/02/09 19:33:06
投稿者: UO3

失礼します。
 

sys-t-nw さんの引用:
ブックを二つ開くということは
こういうことです。
 
https://webkikaku.co.jp/blog/software/excel1/

 
大変に申し訳ないのですが参照されたページが、いささか・・・
ということだろうと思います。
 
皆さん指摘しておられるように ブックの整列を行えば
それでOK,なんでもないことですので。

回答
投稿日時: 17/02/15 22:14:22
投稿者: iori_y

横からすみません。
 
Excel2010の環境に慣れてしまったので記憶が確かではないのですが、
他のバージョンでも別インスタンスのファイルにコピーは出来なかったような気がしたので調べてみました。
 
■Excel VBA で自ブックのシートを別のブックへコピーができない
https://answers.microsoft.com/ja-jp/msoffice/forum/msoffice_excel-mso_winother/excel-vba/f05abd5d-5410-4615-b9d7-c13b0b41cd34
 
ブック2での操作がどのような操作か判りませんが、
別インスタンスに拘っているような感じがしましたので、
弊害(?)があることを念頭においていただければと思います。
 

引用:

考えていたことは、
1. ブック1をダブルクリックで開く(作業する)
2・ Excelを新規で開き、2つ目を用意する。
3・ ブック2を2つ目のエクセルで開く
4・ ブック2のマクロを実行し、ブック1のデータを取得する

 
あらかじめ2つのファイルを開いておく必要がないのであれば、
 ・ブック1を開き作業終了後に、ブック1に記載のコード(Workbook.Open)を使用して
  新規ブック(または指定ファイル)を開く ⇒ このタイミングでブック名取得可能
 ・ブックの整列をして左右に並べる
 ・ブック1から必要データをブック2へデータを移動(コピペや抽出など)をする
 (・ブック2での処理はブック2にコードを記載する)
ということでもいけると思います。

回答
投稿日時: 17/02/16 22:17:19
投稿者: simple

UO3 さんの引用:
失礼します。
sys-t-nw さんの引用:
ブックを二つ開くということは
こういうことです。
 
https://webkikaku.co.jp/blog/software/excel1/

大変に申し訳ないのですが参照されたページが、いささか・・・
ということだろうと思います。
 
皆さん指摘しておられるように ブックの整列を行えば
それでOK,なんでもないことですので。

既にご指摘があるように、ネット上の記事にも色々とあります。
玉石混淆です。全てを玉と考えないほうがよろしいでしょう。
もっと定評のあるサイトを参考にしたほうがよいと思います。
(失礼ながら、Webプログラムを中心に活動されている方が、
  思いつきで書かれた記事(その他にExcel関連の記事は一つもありません)のようです。
  残念ながら、混乱を招くだけのものです。
  この記事のことはキッパリ忘れたほうがよいです。)
 
既に皆さんから指摘があるように、
普通のことは普通にするほうが良いです。

回答
投稿日時: 17/02/17 23:22:23
投稿者: ChemiPhys
投稿者のウェブサイトに移動

こんにちは。もし間違っていたらすみません。
ブックを二つ開いているということですが,ブックの名前がわかっていれば,次のようにどうでしょう。
 
仮に1つめを Book1.xlsm
2つめを Book2.xlsmというファイル名にします。
 
それらは,Workbooks("Book1.xlsm") や Workbooks("Book2.xlsm")というふうに,表現することができますので,
 
例えば Book1のSheet1のセルA1からデータを取得したいという場合は
 
Workbooks("Book1.xlsm").worksheets("Sheet1").Range("A1").Value
 
というように表現すればたどり着けます。
 
ただ,とてもコードが長くなるので,おすすめとしては,Withを使って書いていくか,
Dim TargetSheet as Worksheet
Set TargetSheet=Workbooks("Book1.xlsm").worksheets("Sheet1")
 
Debug.Print TargetSheet.Range("A1").Value
Debug.Print TargetSheet.Range("B1").Value
 
のように書いていくと,すっきり書けていくと思います。
もし意を汲み取れていれば幸いです。
 
ちなみに,コードが動いているブックについては,ThisWorkbookという表現が便利ですので,おすすめします。

回答
投稿日時: 17/02/18 06:42:16
投稿者: simple

おはようございます。
ChemiPhys さんのご指摘は、ご尤もな内容です。Excelがひとつならば、ですね。
 
しかし、質問者さんは、Excelアプリケーションを二つ立ち上げているのです。
 
そのことに殆ど益が無いばかりか、
それに伴い色々な困難が発生するので、そんな苦労することは無いですよ、
普通に一つのExcelで二つのブックを開いて、
整列機能を使って並べれば済むことですよ、
という議論をしているところです。

回答
投稿日時: 17/02/20 21:25:00
投稿者: simple

新しい質問をされるなら、こちらを片付けてからにしてください。

トピックに返信