エラー内容
実行時エラー1004はいろんな種類のエラーで表示される「その他雑多エラー」のエラー番号です。エラーメッセージを見ないと何のエラーなのか分かりません。
その実行時エラー1004の中で、ブックを開くコードで「Workbook.Open()」メソッドを使った際に「申し訳ございません。が見つかりません。名前が変更されたか、移動や削除がおこなわれた可能性があります。」のようなメッセージが表示されることがあります。
原因はエラーメッセージの通りで、そのブックが存在しないため開くことが出来ない、というエラーです。
でも、ちゃんとコード書いてるのになー、ってことでハマることがあります。その解決方法を紹介します。
解決方法
まず、エラーメッセージのファイル名部分を見ます。そこにファイル名がどのように書いてあるかどうかで解決方法は少し変わります。
- ファイル名が何も書いてない場合
「申し訳ございません。が見つかりません。名前が変更されたか、移動や削除がおこなわれた可能性があります。」 - ファイル名だけが書いてある場合
「申し訳ございません。aaa.xlsxが見つかりません。名前が変更されたか、移動や削除がおこなわれた可能性があります。」 - ファイルパスが書いてある場合
「申し訳ございません。C:\test\aaa.xlsxが見つかりません。名前が変更されたか、移動や削除がおこなわれた可能性があります。」
1. エラーメッセージにファイル名が無い場合
エラーメッセージにファイル名が書いていない、ということは、ほとんどの場合はファイル名がOpenメソッドに渡されていないためです。
以下のようなコードを書いている場合に起こります。
1 2 3 4 5 6 7 8 |
Sub Err1004_BookOpenError() Dim wb As Workbook '// ブック Dim sPath As String '// ブックパス 'sPath = "C:\aaaa.xlsx" Set wb = Workbooks.Open(Filename:=sPath) End Sub |
原因は、ファイルパスを設定する変数であるsPathが5行目でコメントアウトされていて、Workbooks.Openメソッドに渡す時点では空になっているため、エラーになります。
コメントアウトを外せばファイルパスは指定されているため、そのファイルが存在していればブックが開きます。
あとは、Workbooks.Openで使うべき変数を別の変数に間違えていることもよくあります。
2. エラーメッセージにファイル名だけが表示されている場合
エラーメッセージにファイル名だけが書いてある場合は、ほとんどの場合はフォルダパスの書き忘れが原因です。
以下のようなコードを書いている場合に起こります。
1 2 3 4 5 6 7 8 9 |
Sub Err1004_BookOpenError() Dim wb As Workbook '// ブック Dim sPath As String '// ブックパス sPath = "aaaa.xlsx" '// パスを指定しない場合はカレントフォルダのaaaa.xlsxを開こうとする '// sPath = "C:\test\aaaa.xlsx" '// パスを指定した方がよい Set wb = Workbooks.Open(Filename:=sPath) End Sub |
フォルダパスを書かない場合は、カレントフォルダにある対象の名前のブックが開く対象になります。ただ、ほとんどの場合は「カレントフォルダにあるブックを開く」なんてことはしないので、エクスプローラでブックのパスを確認してパスをちゃんと付けてあげれば解決します。
パスをくっつける場合の注意点として、フォルダパスとファイル名の間に「\」のパス区切りを付けるのを忘れないようにする必要があります。後述する「ActiveWorkbook.Path」は右端に「\」が付かないので、対応が必要になります。
なお、カレントフォルダを知りたい場合は「CurDir関数」で取得できます。
1 2 3 4 5 6 |
Sub GetCurDir() Dim sDir As String sDir = CurDir '// C:\Users\user\Documents など、その時点のカレントフォルダを返す Debug.Print sDir End Sub |
また、マクロを動かしているブックのパスであれば「ActiveWorkbook.Path」で取得できます。「ActiveWorkbook.Path」で取得したパスの右端にはパス区切りの「\」が付いていないので、手で付けてあげる必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub GetActiveWorkbookPath() Dim sBookName As String '// ブック名(ファイル名) Dim sDir As String '// フォルダパス Dim sPath As String '// ファイルパス Dim wb As Workbook '// ワークブックオブジェクト '// ブック名を指定 sBookName = "abc.xlsx" '// アクティブブックのパスをフォルダパスとして指定 sDir = ActiveWorkbook.Parent '// フォルダパスとファイル名を\でつなげる sPath = sDir & "\" & sBookName '// \\を\に変換 sPath = Replace(sPath, "\\", "\") End Sub |
3. エラーメッセージにファイルパスとファイル名が表示されている場合
エラーメッセージにファイルパスが書いてある場合は、2通り考えられます。1つ目はフォルダパスとファイル名がつながっていること(\が付いてない)、2つ目はフォルダパスかファイル名のどちらかがやはり間違っていることです。どちらもよくあります。
どちらの場合も「パスは合ってる!」という思い込みでちゃんと確認しないで発見が遅れがちですが、ちゃんと見てみると「あ、やっちゃってた」というのが大体オチです。
まず、エクスプローラーでパスをコピペしてメモ帳でもテキストエディタでもいいので貼ってみてください。そして、VBAのパスも同様にテキストエディタに貼り付けて、比較してみてください。ほとんど場合はこれで間違いが発見できます。
ActiveWorkbook.Pathでフォルダパスを取得したり、他からフォルダパスを渡されている場合に、右端に「\」のパス区切りがついていないことがあります。こういう場合はちゃんと付けてあげる必要があります。
なお、「\」が付いているかどうかわからない場合は以下のようにフォルダパスとファイル名を連結させる方法もあります。やってることは強制的にフォルダパスに「\」を付けて、「\\」のように重複していれば「\」に変換する方法です。上のサンプルコードのReplace関数での方法がそれになります。
sPath = Replace(sPath, “\\”, “\”)