【VBA】ファイルを開く

目次

指定したExcelブックを開く
ファイルが存在しない場合のためのエラー対策
  エラー対策1:【エラーを無視する】
  エラー対策2:【ファイルが存在するかを調べる】
開いているブックと同じ名前のブックを開こうとした場合のためのエラー対策

ユーザーがファイルを指定して開く・・・GetOpenFilename
ユーザーがファイルを指定して開く(初期フォルダを指定する場合)
  特定の場所を参照させる場合
  ブックの置かれた場所を参照させる場合
ユーザーがファイルを指定して開く(複数ファイル)

指定したExcelブックを開く

開いているブックの操作はWorkbookオブジェクトとして行うことができます。
また、Excelでブックを開く操作は、同時に複数のブックに対して可能です。
そのため、「新しいブックを開く」ということは、
「Workbookオブジェクトの集合体(Workbooksコレクション)に新しいメンバーを加える」ということで、WorkbooksコレクションOpenメソッドを用います。

Workbooks.Open “C:\Book1.xlsx

または

Workbooks.Open Filename:=”C:\Book1.xlsx”

▲目次に戻る

ファイルが存在しない場合のためのエラー対策

開こうとしているファイルが存在しないときはエラーになってしまいます。

そこで、エラーを一旦無視し、
エラーが発生し得る操作が終わったら元通りエラー発生を復帰させることで、
エラーを回避することが可能です。

エラー対策1:【エラーを無視する】

On Error Resume Next     ’エラーを無視する
Workbooks.Open “C:\Book1.xlsx”
On Error Goto 0        ’エラー無視を解除する

また、Openメソッドの前にブックが存在するかどうかを調べ、
存在したら開き、存在しなかったら処理を中止することによって、
エラーを回避することもできます(推奨)。

エラー対策2:【ファイルが存在するかを調べる】

If Dir(“C:\Book1.xlsx”) <> “” Then    ‘ファイルが存在する場合は
 Workbooks.Open “C:\Book1.xlsx”  ’ファイル(Book1.xls)を開く
Else                ’ファイルが存在しない場合は
 MsgBox “ファイルが存在しません。”, vbExclamation
 Exit Sub              ‘終了する
End If

▲目次に戻る

開いているブックと同じ名前のブックを開こうとした場合のためのエラー対策

Excelは同時に複数のブックを開くことができますが、同じ名前のブックを開くことはできません。
開いているとしているブックと同じ名前のブックを開こうとすると、エラーになります。


そこでこれらエラーの対策を盛り込んだ形にします。

Dim buf As String, wb As Workbook
Const Target As String = “C:\Book1.xlsx”

‘— ファイルが存在しないかチェックする —
buf = Dir(Target)
If buf = “” Then
 MsgBox Target & vbCrLf & “は存在しません”, vbExclamation
 Exit Sub
End If

‘— 同じ名前のブックがないかチェックする —
For Each wb In Workbooks
 If wb.Name = buf Then
  MsgBox buf & vbCrLf & “はすでに開いています”, vbExclamation
  Exit Sub
 End If
Next wb

‘— ブックを開く —
Workbooks.Open Target

▲目次に戻る

ユーザーがファイルを指定して開く

[ファイルを開く]ダイアログボックスを表示し、ユーザーが名前を指定して開く方法です。
ダイアログにてキャンセルされた場合の処理も入れておきます。

Dim OpenFileName As String
OpenFileName = Application.GetOpenFilename(“Excelブック,*.xlsx”)

‘— ファイルを開く(キャンセルの場合は処理を終了) —
If OpenFileName <> “False” Then
 Workbooks.Open OpenFileName
Else
 MsgBox “キャンセルされました”
 Exit Sub
End If

ApplicationオブジェクトのGetOpenFilenameメソッドは、
ユーザーが選択したファイルのフルパスを返します。
(GetOpenFilenameだけではファイルを開くことはできないので
 戻り値のフルパスからWorkbooks.Openによって開きます)

変数 = GetOpenFilename (FileFilter, FilterIndex, Title, ButtonText, MultiSelect )

<引数の説明>
FileFilter:ファイルの種類(拡張子)の指定ができる
   ・表記方法・・・ “表示名 , *.拡張子” 
         (二つセットで指定し、ダブルクォーテーション( ” )でくくる)
      GetOpenFilename (Filefilter:=”Excelブック,.*.xlsx”)
   ・引数名が推定できる場合は、引数名を省略できる
      GetOpenFilename (“Excelブック,.*.xlsx”)
   ・複数の拡張子を表示したいときは、表示したい拡張子をセミコロン(;)で区切る
      GetOpenFilename (“資料ファイル, *.xlsx; *.xIsm; *.txt”)
   ・複数の拡張子を一度に表示ではなく、ウィンドウに複数登録するには、
    表示名と拡張子のセットを繰返す
      GetOpenFilename (“マクロ(.xIsm), *.xIsm, CSV ファイル(.csv),.csv”)
   ・引数FileFilter自体を省略すると、ファイルの種類は (“すべてのファイル (.),.“) と同じ

FilterIndex:FileFilterで指定したフィルタ文字列の中で、
      最初に表示するものを番号で指定することができる

Title:ダイアログボックスのタイトルを変更できる
   この引数を省略すると、”ファイルを開く” になる

ButtonText:Macintoshのみ指定可

MultiSelect:ファイルの複数選択可に変更ができる(Trueが複数選択可。後述)

▲目次に戻る

ユーザーがファイルを指定して開く(初期フォルダを指定する場合)

ダイアログボックスで最初に参照されるフォルダを指定したい場合です。

特定の場所を参照させる場合

特定のフォルダを初期参照させたい場合は、
ChDir を用いてカレントフォルダを変更します。

マクロ実行後にカレントフォルダが変更したままになるのを避けるため
あらかじめカレントフォルダのパスを取得しておき
実行後に元に戻すやり方を追加しておきます。

Dim OpenFileName As String

Dim FilePath0 As String    ’元のカレントフォルダのパス
FilePath0 = CurDir      ’元のカレントフォルダのパスを取得する

‘— 初期表示フォルダを変更 —
ChDir “C:\Documents”

‘— ファイル選択用のダイアログを表示 —
OpenFileName = Application.GetOpenFilename(“Excelブック,*.xlsx”)

‘— ファイルを開く(キャンセルの場合処理を終了) —
If OpenFileName <> “False” Then
 Workbooks.Open OpenFileName
Else
 MsgBox “キャンセルされました”
 Exit Sub
End If

‘— カレントフォルダを元に戻す —
ChDir FilePath0

ブックの置かれた場所を参照させる場合

このマクロのブックが置かれている場所を参照させたい場合です。

Dim OpenFileName As String
Dim FilePath0 As String    ’元のカレントフォルダのパス
Dim FilePath1 As String    ’ダイアログ表示時のカレントフォルダ

FilePath0 = CurDir      ’元のカレントフォルダのパスを取得する
FilePath1 = ThisWorkbook.Path & “¥”
  ’ダイアログ表示時のカレントフォルダは現在のブックの場所とする

‘— 現在のブックの場所にカレントフォルダを変更する —
ChDir FilePath1

‘— ファイルを開くダイアログ表示 —
OpenFileName = Application.GetOpenFilename(“Excelブック,*.xlsx”)

‘— ファイルを開く(キャンセルの場合処理を終了) —
If OpenFileName <> “False” Then
 Workbooks.Open OpenFileName
Else
 MsgBox “キャンセルされました”
 Exit Sub
End If

‘— カレントフォルダを元に戻す —
ChDir FilePath0

ただし、ドライブ文字を割り当てていないネットワークドライブへ変更する場合は、
ChDirは使用できないため、WSH(Windows Scripting Host)を使用します。

Dim OpenFileName As String
Dim FilePath0 As String    ’元のカレントフォルダのパス

FilePath0 = CurDir       ‘元のカレントフォルダのパスを取得する

‘— 現在のブックの場所にカレントフォルダを変更 —
With CreateObject(“WScript.Shell”)
 .CurrentDirectory = ThisWorkbook.Path
End With

‘— ファイル選択用のダイアログを表示 —
OpenFileName = Application.GetOpenFilename(“Excelブック,*.xlsx”)

‘— ファイルを開く(キャンセルの場合処理を終了) —
If OpenFileName <> “False” Then
 Workbooks.Open OpenFileName
Else
 MsgBox “キャンセルされました”
End If

‘— カレントフォルダを元に戻す —
ChDir FilePath0

▲目次に戻る

ユーザーがファイルを指定して開く(複数ファイル)

ダイアログボックスで複数のファイルを選択するには、
引数MultiSelectにて「True」を指定します。
 注意)複数ファイルを選択する場合は、戻り値の変数をVariant型で宣言必要
    (複数ファイルの戻り値は配列になるため)

ダイアログにてキャンセルされた場合の処理として、
「戻り値でファイルが選択された」 すなわち 「戻り値が配列型である」
かどうかによって判定します。
(キャンセルされた場合は、戻り値がFalse(論理値)となるため配列型にならない)

複数ファイルを選択して開く場合は、次のようになります。

Dim OpenFileName As Variant, Target As Variant
OpenFileName = Application.GetOpenFilename _
(FileFilter:=”Excelブック,*.xlsx”, MultiSelect:=True)

‘— ファイルを開く(キャンセルの場合は処理を終了) —
If IsArray(OpenFileName) Then    ‘ファイルが選択された(戻り値が配列の場合)
 ’— 選択されたファイルの処理 —
 For Each Target In OpenFileName ’それぞれのファイルについて
  Workbooks.Open Target     ’ファイルを開く
 Next Target
  ‘————————————————
Else
 MsgBox “キャンセルされました”
 Exit Sub
End If

▲目次に戻る