Excelブックを開くコードの基本的な書き方
Excelブックを開くには、WorkbooksコレクションのOpenメソッドを使います。開いたあとのブックを操作するために戻り値としてWorkbookオブジェクトを取得します。
1 2 |
Dim wb As Workbook '// 開いたブックのWorkbookオブジェクト Set wb = Workbooks.Open("C:\a.xlsx") |
ブックを開いて、閉じる単純なコードは以下のようになります。Openメソッドの引数に開きたいブックのパスを渡せばそのブックが開きます。Openメソッドの戻り値のWorkbookオブジェクトの利用例として、ブックを開いたあとにブック名をイミディエイトウィンドウに出力しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub WorkbooksOpenSample() Dim wb As Workbook '// 開いたブックのWorkbookオブジェクト Dim sBookPath As String '// 開くブックのパス sBookPath = "C:\abc\a.xlsx" '// ブックを開く Set wb = Workbooks.Open(sBookPath) '// ブック名を参照 Debug.Print wb.Name '// ブックを閉じる Call wb.Close End Sub |
このように、正しくブックを開くことが出来ると、Openメソッドの戻り値として対象のブックのWorkbookオブジェクトが返却され、そのWorkbookオブジェクトの各種プロパティやメソッドを使うことでシートやセルの内容を編集したり参照したりすることが可能になります。
他にも読み取り専用で開く方法や、読み取り専用推奨ダイアログを非表示で開く方法など、引数の使い方でブックの開き方があります。それらの詳細は後述しています。
Workbooks.Openメソッドの構文
Workbooks.Openメソッドには引数が15個あります。戻り値として開いたWorkbookオブジェクトを返します。
1 |
Function Workbooks.Open(Filename As String, [UpdateLinks], [ReadOnly], [Format], [Password], [WriteResPassword], [IgnoreReadOnlyRecommended], [Origin], [Delimiter], [Editable], [Notify], [Converter], [AddToMru], [Local], [CorruptLoad]) As Workbook |
必須なのはFilenameで指定するブックパスの1つだけです。
他の引数で使うものは、読み取り専用で開きたい場合に「ReadOnly:=True」を指定する場合と、読み取り推奨ダイアログを非表示にしたい場合に「IgnoreReadOnlyRecommended:=True」を指定する場合の2つぐらいです。他の引数はまず使うことはありません。
色を付けている引数は使う可能性がありますが、色無しのものは、まず使いません。私はほとんど使ったことありません。
Workbooksオブジェクト | Workbooksオブジェクトを指定します。通常は「Workbooks」と書きます。 | |||||||||||||||
1. Filename (必須) |
開くExcelブック名を指定します。通常はフルパスを”C:\abc\a.xlsx”のように指定します。ブック名のみを”a.xlsx”のように指定することも可能ですが、その場合はカレントフォルダにあるブックが対象になります。 | |||||||||||||||
2. UpdateLinks (省略可能) |
ブック内の外部参照(他のブックへの参照)とリモート参照(他のアプリケーションデータへの参照)の更新方法を数値で指定します。
|
|||||||||||||||
3. ReadOnly (省略可能) |
読み取り専用で開く場合はTrueを指定します。省略時はFalse扱いになります。 | |||||||||||||||
4. Format (省略可能) |
ブックではなくテキストファイルを開く場合に、ファイル行の文字列の区切り文字の種類を数字で指定します。
|
|||||||||||||||
5. Password (省略可能) |
読み取りパスワードで保護されているブックを開く場合の読み取りパスワードを指定します。 | |||||||||||||||
6. WriteResPassword (省略可能) |
書き込み保護されているブックへの書き込みを可能にする書き込みパスワードを指定します。 | |||||||||||||||
7. IgnoreReadOnlyRecommended (省略可能) |
読み取り専用を推奨するメッセージダイアログを非表示にする場合はTrueを指定します。省略時はFalse扱いになります。 | |||||||||||||||
8. Origin (省略可能) |
ブックではなくテキストファイルを開く際に、テキストファイルが作成されたプラットフォームをXlPlatform列挙型で指定します。
|
|||||||||||||||
9. Delimiter (省略可能) |
テキストファイルのファイル行の文字列の区切り文字を指定します。引数Formatで6の場合のみ機能します。 | |||||||||||||||
10. Editable (省略可能) |
開くファイルがExcelテンプレートの場合に、テンプレートを編集する場合はTrueを指定します。Falseを指定した場合はそのテンプレートを基にした新しいブックが開きます。省略時はFalse扱いになります。
Excel 4.0(1992年)のアドインをウィンドウに表示する場合もTrueを指定しますが、、そんな古いものは使わないでしょう。 |
|||||||||||||||
11. Notify (省略可能) |
ファイルが既に開かれており、開くことができない場合に、ファイルが編集可能になった時点で通知する場合はTrueを指定します。Falseの場合は通知を行わずにオープンエラーになります。省略時はFalse扱いになります。 | |||||||||||||||
12. Converter (省略可能) |
使わないので省略。 | |||||||||||||||
13. AddToMru (省略可能) |
開くブックを最近使用したファイルに追加する場合はTrueを指定します。Falseの場合は追加しません。省略時はFalse扱いになります。 | |||||||||||||||
14. Local (省略可能) |
使わないので省略。 | |||||||||||||||
15. CorruptLoad (省略可能) |
ブックをどのように開くかをXlCorruptLoad列挙型で指定します。省略時はxlNormalLoad扱いになります。
|
|||||||||||||||
戻り値 Workbook | 開いたブックのWorkbookオブジェクトを返します。 |
使い方1. ブックを開いて編集して保存する方法
通常のExcelブックを編集可能な状態で開きたい場合は、ファイルパスさえ指定すればOKです。これはエクスプローラでExcelブックをダブルクリックして開く場合と同じ動作になります。
その後、ブックの内容を編集したあとに上書き保存する場合は、Saveメソッドを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub WorkbooksOpenSave() Dim wb As Workbook '// 開いたブックのWorkbookオブジェクト '// ブックを開く Set wb = Workbooks.Open("C:\abc\a.xlsx") '// 1番目のシートのA1セルに入力 wb.Sheets(1).Range("A1").Value = "abcdefg" '// ブックを保存 Call wb.Save '// ブックを閉じる Call wb.Close End Sub |
使い方2. ブックを開いて保存無しでデータを参照する方法
保存はせずにExcelブックに書いてあるデータを参照する場合は、ファイルパスだけ指定すればOKです。
ただし、開いたブックのセルで「=NOW()」のようなブックを開くたびに値が変わる数式が入っていると、ブックの内容が変わってしまい、ブックを閉じる際に「’a.xlsx’への変更を保存しますか?」という保存確認のダイアログが表示され、マクロの実行が止まってしまいます。
ダイアログが表示したくない場合は「Application.DisplayAlerts = False」で非表示にすることが出来ます。Saveメソッドを実行しない限り保存はされないため、非表示にしてブックを閉じた場合は保存されません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub WorkbooksOpenRefer() Dim wb As Workbook '// 開いたブックのWorkbookオブジェクト Dim s '// 保存確認ダイアログを出さないようにする Application.DisplayAlerts = False '// ブックを開く Set wb = Workbooks.Open("C:\abc\read.xlsx") '// 1番目のシートのA1セルの値を取得 s = wb.Sheets(1).Range("A1").Value Debug.Print s '// ブックを閉じる Call wb.Close Application.DisplayAlerts = True End Sub |
使い方3. 読み取り専用でブックを開いてデータを参照する方法
やりたいことは上の方法と似ていますが、ブックを保存せずにデータを参照する場合に、ブックを読み取り専用で開く方法があります。
読み取り専用で開く利点として、同じブックを複数の利用者が編集するような場合に、参照さえできればOK、という場合に他の利用者の編集の邪魔をせずに済む、という点があります。
読み取り専用で開く場合には、Workbooks.OpenメソッドのReadOnly引数にTrueを指定します。
書き方には引数名を指定する場合としない場合の2通りがあります。どちらで書いても構いませんが、引数名を指定した方が何をしているのかはわかりやすくなります。
引数名を指定しない場合
Workbooks.Openメソッドの引数の1番目のFilename引数の位置にブックパス、2番目を省略、3番目のReadOnly引数の位置に読み取り専用のTrueを指定します。引数名を省略する場合は何番目の引数なのかを判断できるようにするためにカンマで引数を区切ります。
1 2 3 4 5 6 7 8 9 |
Sub WorkbooksOpenReadOnly() Dim wb As Workbook '// 開いたブックのWorkbookオブジェクト '// ブックを開く Set wb = Workbooks.Open("C:\abc\a.xlsx", , True) '// ブックを閉じる Call wb.Close End Sub |
引数名を指定する場合
Workbooks.Openメソッドの引数名を指定する場合は、「引数名:=値」の形式でコロンとイコールを使って指定します。引数名を指定するため、カンマ区切りで引数の位置を判別できるようにする必要はありません。
1 2 3 4 5 6 7 8 9 |
Sub WorkbooksOpenReadOnly2() Dim wb As Workbook '// 開いたブックのWorkbookオブジェクト '// ブックを開く Set wb = Workbooks.Open(Filename:="C:\abc\a.xlsx", ReadOnly:=True) '// ブックを閉じる Call wb.Close End Sub |
使い方4. 読み取り専用推奨ダイアログを表示せずにブックを開く方法
ブックの保存オプションで読み取り専用を推奨するように設定されているブックを開く場合、開く前に「作成者は’a.xlsx’を変更する必要がなければ、読み取り専用で開くように指定しています。読み取り専用で開きますか?」とダイアログが表示されます。
マクロでブックの操作を行う場合には、このダイアログは邪魔な場合が多いため、Workbooks.OpenメソッドのIgnoreReadOnlyRecommended引数にTrueを指定して読み取り専用推奨ダイアログを非表示にすることが出来ます。
書き方には引数名を指定する場合としない場合の2通りがあります。どちらで書いても構いませんが、引数名を指定した方が何をしているのかはわかりやすくなります。
引数名を指定する場合
Workbooks.Openメソッドの引数の1番目のFilename引数の位置にブックパス、2~6番目をカンマのみで省略、7番目のIgnoreReadOnlyRecommended引数の位置にダイアログを非表示にするTrueを指定します。
1 2 3 4 5 6 7 8 9 |
Sub WorkbooksOpenIgnoreReadOnlyRecommended() Dim wb As Workbook '// 開いたブックのWorkbookオブジェクト '// ブックを開く Set wb = Workbooks.Open("C:\abc\b.xlsx", , , , , , True) '// ブックを閉じる Call wb.Close End Sub |
引数名を指定しない場合
Workbooks.Openメソッドの引数名を指定する場合は、「引数名:=値」の形式でコロンとイコールを使って指定します。引数名を指定するため、カンマ区切りで引数の位置を判別できるようにする必要はありません。
1 2 3 4 5 6 7 8 9 |
Sub WorkbooksOpenIgnoreReadOnlyRecommended2() Dim wb As Workbook '// 開いたブックのWorkbookオブジェクト '// ブックを開く Set wb = Workbooks.Open(Filename:="C:\abc\b.xlsx", IgnoreReadOnlyRecommended:=True) '// ブックを閉じる Call wb.Close End Sub |
ブックが存在しない場合
開く予定のブックが存在しない場合、Workbooks.Openメソッドは失敗し、エラーが返されます。エラーが発生するとそこでマクロは止まってしまいます。
それを回避するには、エラーが起きたら処理を終了するように「On Error GoTo」を使うか、事前にブックの存在チェックを行い、無ければブックを開かないようにします。
エラーを回避する方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub WorkbooksOpenError1() On Error GoTo ERR_LABEL Dim wb As Workbook '// 開いたブックのWorkbookオブジェクト '// エラーダイアログを出さないようにする Application.DisplayAlerts = False '// ブックを開く Set wb = Workbooks.Open("C:\abc\c.xlsx") '// ブックを閉じる Call wb.Close Application.DisplayAlerts = True ERR_LABEL: End Sub |
ファイル存在チェックを行う方法
ファイル存在チェックにはDir関数を使う方法とFileSystemObjectのFileExistsメソッドを使う方法の2通りがあります。どちらを使っても構いませんが、少し用途が異なる点があります。
ファイル存在チェックについての詳細は「VBAでファイルの存在をチェックする」をご参照ください。
ここではDir関数を使うファイル存在チェックを行った方法を紹介します。使用しているIsExistFileDir関数は上記リンク先のコードをそのまま持ってきています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Sub WorkbooksOpenIsExist() Dim wb As Workbook '// 開いたブックのWorkbookオブジェクト Dim sPath As String '// ブックパス sPath = "C:\abc\a.xlsx" '// ファイル存在チェック If IsExistFileDir(sPath) = False Then Exit Sub End If '// ブックを開く Set wb = Workbooks.Open(sPath) '// ブックを閉じる Call wb.Close End Sub '// ファイル存在チェック関数 Public Function IsExistFileDir(a_sFilePath) As Boolean Dim a a = Dir(a_sFilePath) If (a <> "") Then IsExistFileDir = True Else IsExistFileDir = False End If End Function |