• ベストアンサー

VBA Workbooks.open

ブックを開くコマンド × Workbooks("filename.xls").open ○ Workbooks.open filename:="filename.xls" 何故下なのですか?ワークブックコレクションの中から特定のブックを指定し開くなら、上の構文にした方がワークシートコレクション等と構文表現を統一出来ます。 現にブックを閉じるコマンドは Workbooks("filename.xls").close です。何故ブックを開くコマンドだけ別表現なのですか?

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 > ブックを開くコマンド > × Workbooks("filename.xls").open > ○ Workbooks.open filename:="filename.xls" > 何故下なのですか? > ワークブックコレクションの中から特定のブックを指定し開くなら、 > 上の構文にした方がワークシートコレクション等と構文表現を統一出来ます。 > 現にブックを閉じるコマンドは > Workbooks("filename.xls").close > です。何故ブックを開くコマンドだけ別表現なのですか? <以上、改行は筆者。> まず、ヘルプの引用ですが、 その前に、Parentを省略せずに書くと、 Excel.Application.Workbooks.Open Filename:="filename.xls" だという点を確認しておいてください。 |Application.Workbooks プロパティ |開かれているすべてのブックを表す Workbooks コレクションを返します。値の取得のみ可能です。 <以上、VBAのヘルプより。> 一般論として、コレクションというのは、実体を持ったオブジェクトの集合体です。 "filename.xls"はWorkbookの設計図を収めたファイルとしてのみ存在している訳ですから、 開いてこそ実体を持ったWorkbook オブジェクトとなり得ます。 つまりブックとして開くまではWorkbooks コレクションに加えることは出来ません。 また、 開いていないブック=Workbooks コレクションに存在しないブック を、Workbooks("filename.xls"). ...のように参照しようとしても当然実行時エラーになります。 Worksheets("sheetname"). ...のように存在しないワークシートを参照しようとしても同様です。 > 上の構文にした方がワークシートコレクション等と構文表現を統一出来ます。< 再掲 違いは、ブックを開いた時に連動して配下のシートは実体を持つ、ということです。 Worksheets には.Open メソッドはあり得ませんし、.Close メソッドもないですよね。 解り難い説明になってしまっていたらすみません。 結構な長文を用意したのですが、クドクなったので要約を上げました。 以上です。

High_Score
質問者

お礼

ありがとうございます。 まだ開いて無いファイルだからコレクションには入ってないという事ですね。 だからこそworksheetにはないopenやcloseメソッドがあると。

その他の回答 (2)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

#1、cjです。お礼欄拝見しました。 > まだ開いて無いファイルだからコレクションには入ってないという事ですね。 はい、その認識で合っています。 一般的なコレクション(コレクションオブジェクト)の扱いとしては、 一段階めで、新しいオブジェクトのインスタンス(実体)を生成してから 次の段階で collection.Add Key:="name", Item:=newobject のような書式でコレクションに追加します。 Workbooks.Open Filename:="filename.xls" の場合は、オブジェクトの実体を生成すると同時に、 コレクションへの追加をしています。 > だからこそworksheetにはないopenやcloseメソッドがあると。 誤解のないように補足しておきますが、 Workbooks.Open Filename:="filename.xls" これは、Workbooks コレクションのOpen メソッドです。 Workbooks("filename.xls").Close これは、Workbook オブジェクトのClose メソッドです。 (Workbooks コレクションには、すべてのブックを閉じるClose メソッドがありますが、  これは、現在ではほぼ使われることのないもの、いわばレガシーです。) Workbooks("filename.xls") は、 Workbooks.Item("filename.xls") の省略形ですが、 例外なくWorkbook オブジェクトを参照します。 「Workbooks」だけならWorkbooks コレクション、 「Workbooks()」と括弧が付いた部分を含めて、それは (Workbooks コレクションのItemとしての)Workbook オブジェクトであって、 必然的に、Workbooks コレクションのメソッドは使用できません。 Open メソッド、と、Close メソッドとでは、処理対象(Parent)が別物なのです。 以上、補足として追記しておきます。

High_Score
質問者

お礼

再回答ありがとうございます。 括弧ツキとなしではオブジェクトかコレクションかの違いがあるのですね。実は頭の中で不鮮明な理解だった部分です。スッキリしました。

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

> × Workbooks("filename.xls").open Workbooksコレクションオブジェクトは「現在このExcelアプリケーションの中で開かれているブックたち」が入っている。 で、filename.xlsはまだ開かれていない。今から開くんだから。 だから、Workbooks("filename.xls")ではアクセスできない。 なので、 > ○ Workbooks.open filename:="filename.xls" で開く。そこではじめてWorkbooksコレクションに追加されるわけだ。 開かれたので > Workbooks("filename.xls").close でアクセスでき、閉じる事もできる。開かれているからだ。 シートではWorksheets("newsheet1").Addみたいなのが使えるの? Set sht = Worksheets.Add sht.Name = "newsheet1" みたいにするのしか知らない・・・・。

High_Score
質問者

お礼

ありがとうございます。 最後の部分、まだ作成されてないシートなのでコレクションに入ってない為、この表現は使えない、でいいですよね。