たのしいみかんゼリーのブログ

VBAのTipsを発信しています。

VBAの公式な仕様の調べ方(例題:Bookを読み取り専用で開く,Bookを新規で開く)

導入

VBAを書く際に、
あのメソッドの引数はどう指定すればいいんだっけ?
こういうプロパティは持っていないかな?
等とふと思ったことはないでしょうか?(僕は結構あります。)

そのような時はMicrosoft社のVBAリファレンスを見ると、間違いのない公式な仕様なので手っ取り早いことがあります。

VBAの公式な仕様(Microsoft社のVBAリファレンス)

VBAの公式な仕様(Microsoft社のVBAリファレンス)のページは次の通りです。

上記のページを開くと、VBAを書く際に使用するオブジェクトと関数の仕様を調べることができます。

f:id:e0m0jelly:20210417223353p:plain
図01_ExcelVBAリファレンス
f:id:e0m0jelly:20210417223448p:plain
図02_VBA関数

例題:Bookを読み取り専用で開く

Bookを読み取り専用で開くには、

'変数filePathに代入したファイルパスのBookを読み取り専用で開き、そのWorkbookオブジェクトを変数openBookに代入。
Set openBook = Workbooks.Open(Filename:=filePath, ReadOnly:=True)

WorkbooksオブジェクトのOpenメソッドで、引数ReadOnlyにTrueを指定するとBookを読み取り専用で開くことができます。

データ抽出のみが目的だったり、共有がかかっていないExcelファイルをロックしたくない等、Bookを読み取り専用で開きたい場合があると思います。
以前、確かOpenメソッドで読み取り専用を指定できたと思うけどどうだったかな?
となった際に「Workbooksオブジェクト」、「VBAリファレンス」といったキーワードで検索し、公式な仕様を調べました。

f:id:e0m0jelly:20210417235430p:plain
図03_Workbooks.Openメソッド

例題:Bookを新規で開く

Bookを新規で開くには、

'変数filePathに代入したファイルパスのBookを新規で開き、そのWorkbookオブジェクトを変数openBookに代入。
Set openBook = Workbooks.Add(Template:=filePath)

WorkbooksオブジェクトのAddメソッドで、引数Templateに対象のファイルパスを指定するとBookを新規で開くことができます。

実は、Bookを新規で開く方法をVBAではどうすれば良いのか、今まで知りませんでした。
例題としてBookを読み取り専用で開く方法を挙げましたが、普段の仕事では右クリックから新規で開くことが多いので今回調べてみたわけです。

ググってみると、Yahoo知恵袋で同じ質問がされていました。 detail.chiebukuro.yahoo.co.jp

見てみると、2人目の回答者が以下の様に回答しています。

Workbooks.Add ファイルフルパス

確かにWorkbooksオブジェクトのAddメソッドでBookを新規作成できますから、引数に対象のファイルパスを指定することで右クリックの新規で開くと同じことができそうですし、VBAユーザーとしてはAddメソッドにその様な機能がオーバーロードされていたら嬉しいなと思います。
実際に公式な仕様を調べてみると、確かにその様なことがきちんと記載されていました。

f:id:e0m0jelly:20210418004417p:plain
図04_Workbooks.Addメソッド

ちなみに情報1(開いているBookは新規で開けない)

「図04_Workbooks.Addメソッド」に、"Excel ファイルの名前を指定する文字列を指定する"という記載が見えますが、素直にファイル名(Book名)を指定して新規で開くことができるのかが気になったので試してみました。
結果は右クリックから新規で開く場合の挙動と同様に、既に開いているBookと同じ名前のBookは開けないというエラーとなります。

f:id:e0m0jelly:20210418010220p:plain
図05_開いているBookは新規で開けない

ちなみに情報2(Book名指定時の挙動について)

「ちなみに情報1」では意識していなかったのですが、Book名(例:"VBAtest.xlsm")を指定すると勝手にWorkbooksコレクションからBookを取得してくれるんですね。
当然ながら、VBAのカレントディレクトリにBook名のファイルが存在すればそのBookが新規で開かれることとなります。
VBAのカレントディレクトリはCurDir関数で調べることができます。(Windowsの場合はドキュメントフォルダのようです。)

f:id:e0m0jelly:20210418012047p:plain
図06_カレントディレクトリのBookを新規で開く

ちなみに情報3(通常通り開いたBookは新規で開けないが逆は可能)

見出しの通り、通常通り開いたBookは新規で開けませんが逆は可能です。
「test.xlsx」を通常通り開くと、VBAは"test.xlsx"という名前のWorkbookオブジェクトとして扱います。
「test.xlsx」を新規で開くと、VBAは"test1"という名前のWorkbookオブジェクトとして扱います。
「test.xlsx」を新規で開いただけでは"test.xlsx"という名前のWorkbookオブジェクトは存在しないため、「test.xlsx」を通常通り開くことが可能となるわけです。
同様に、「test.xlsx」を新規で開いた状態では"test1"というファイルをExcelで開こうとすると、同じ名前のBookは開けないというエラーとなります。