VBAマクロでフォルダ内のファイルを開こうとするとエラーが発生する問題

このQ&Aのポイント
  • VBAマクロを使用してフォルダ内のファイルを開こうとすると、突然「データリンクプロパティ」が表示され、次に「実行時エラー1004 OPENメソッドは失敗しました Workbooksオブジェクト」というエラーが発生します。
  • この問題は、マクロが正常に動作していたにも関わらず、突然エラーが発生するようになったという状況です。
  • また、メッセージボックスに表示される「Tumbs.db」は関係なく、エラーの原因ではありません。
回答を見る
  • ベストアンサー

同フォルダ内のファイルすべて開きコピーするマクロ

以下マクロは一昨日まで問題なく使えていたのですが、 昨日から突然「データリンクプロパティ」が表示され、 「OK」ですすむと、 「実行時エラー1004 OPENメソッドは失敗しました Workbooksオブジェクト」で デバッグになります。 '------------------------------- ' 指定フォルダ内のファイルからコピー '------------------------------- Sub ALL_COPY() Const FolderPath As String = "\********************" ⇐ここにフォルダパスを入れています。 Dim objFSO As Object Dim objBook As Object Dim lngRow As Long '画面のちらつき制御設定 Application.ScreenUpdating = False 'FileSystemObjectを変数にセット Set objFSO = CreateObject("Scripting.FileSystemObject") 'フォルダ内のファイル全て繰り返し処理 For Each objBook In objFSO.GetFolder(FolderPath).Files '貼り付け行(最終行+1)取得 lngRow = ThisWorkbook.Sheets("■代表").Range("E" & Rows.Count).End(xlUp).Row + 1 MsgBox (objBook) 'ファイルを開く Workbooks.Open objBook.Path         ⇐ここがデバッグになります。 'コピー最終行へ貼り付け With ActiveWorkbook .Sheets("■代表").Rows("3:19").Copy ThisWorkbook.Sheets("■代表").Rows(lngRow) Application.DisplayAlerts = False .Close End With Next 'フォルダ内のファイル全て繰り返し処理 For Each objBook In objFSO.GetFolder(FolderPath).Files '貼り付け行(最終行+1)取得 lngRow = ThisWorkbook.Sheets("■投資家").Range("E" & Rows.Count).End(xlUp).Row + 1 'ファイルを開く Workbooks.Open objBook.Path 'コピー最終行へ貼り付け With ActiveWorkbook .Sheets("■投資家").Rows("3:19").Copy ThisWorkbook.Sheets("■投資家").Rows(lngRow) Application.DisplayAlerts = False .Close End With Next 'オブジェクト変数解放 Set objFSO = Nothing '画面のちらつき制御解除 Application.ScreenUpdating = True End Sub ---------------------------------------------------------- MsgBoxの表示では、「Tumbs.db」がでてきますが、 何か関係があるのでしょうか。 どなたかお知恵をお貸しくださいませ。

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

>OPENメソッドは失敗しました 原因はTumbs.dbファイルを開こうとした為だと思われますので エクセルファイルのみ開くようにしてみました。 Sheets("■投資家") と Sheets("■代表") からデーターを取得するため それぞれにファイルを開いているようなので1度にまとめました。 参考に Sub ALL_COPY()   Const FolderPath As String = "\********************"    Dim objFSO As Object   Dim objBook As Object   Dim lngRow As Long   Application.ScreenUpdating = False   Set objFSO = CreateObject("Scripting.FileSystemObject")   For Each objBook In objFSO.GetFolder(FolderPath).Files     Select Case objFSO.GetExtensionName(objBook)       Case "xls", "xlsx", "xlsm"         Workbooks.Open objBook.Path         With ActiveWorkbook           lngRow = ThisWorkbook.Sheets("■代表").Range("E" & Rows.Count).End(xlUp).Row + 1           .Sheets("■代表").Rows("3:19").Copy ThisWorkbook.Sheets("■代表").Rows(lngRow)           lngRow = ThisWorkbook.Sheets("■投資家").Range("E" & Rows.Count).End(xlUp).Row + 1           .Sheets("■投資家").Rows("3:19").Copy ThisWorkbook.Sheets("■投資家").Rows(lngRow)           .Close         End With     End Select   Next   Set objFSO = Nothing   Application.ScreenUpdating = True End Sub

その他の回答 (1)

  • HohoPapa
  • ベストアンサー率65% (454/692)
回答No.1

課題フォルダーに画像を保存した、 あるいは保存したことがあったために、 Tumbs.dbが作成され このマクロが、このファイルを開こうとしてしまう。 という事態が起きているものと思います。 そもそも、 エクセルファイル以外を開こうとしてしまう という問題があるわけですが、 それはさておき https://www.qam-web.com/?p=12022 を参考に、削除してしまい 再作成されないようにするのが吉と思います。

関連するQ&A

  • VBAでフォルダ内の全てのcsvファイルからコピペ

    マクロ超初心者です。 フォルダ内のすべてのcvsファイル(500程度)の5列目(500行程度)を新規ファイルの1列目から順にコピーしていきたいのです。 ちなみに元のcvsファイルのシート数は一つだけでシート名には全てファイル名が付いています。 (つまり全てのファイルのシート名が異なる) 見よう見真似で似たようなマクロから意味もわからないまま つぎはぎして下記作りましたが やっぱり動きません。 どなたか詳しい方どうかよろしくお願いします。 Sub Sample() Const FolderPath As String = "C:\data" Dim objFSO As Object Dim objBook As Object Dim lngRow As Long Application.ScreenUpdating = False Set objFSO = CreateObject("Scripting.FileSystemObject") For Each objBook In objFSO.GetFolder(FolderPath).Files lngcolumn = ThisWorkbook.Sheets("sheet1").Range("A" & Columns.Count).End(xlToRight).Column + 1 Workbooks.Open objBook.Path With ActiveWorkbook .Worksheets(1).Column("5").Copy ThisWorkbook.Sheets("sheet1").End(xlToRight).Offset(0, 1) .Close End With Next Set objFSO = Nothing Application.ScreenUpdating = True End Sub

  • VBAでのサブフォルダ内のエクセル集約について

    VBAを使って所定のフォルダ内のデータを集計するプログラムをネットで調べ、 以下のように作ってみたのですが、 サブフォルダ内のデータも同じように集計することはできないでしょうか? 以下のプログラムは正常に機能していて、「データフォルダ」直下にあるエクセルは 集計できています。 ※「データフォルダ」内に、都道府県別のフォルダが用意され、その中に市区町村別のエクセルが配置されている感じです。 ※EXCEL2013環境です。 Sub 全国集計() Const FolderPath As String = "\\C:\データフォルダ" Application.ScreenUpdating = False Range("6:1048576").Delete Dim objFSO As Object Dim objBook As Object Dim lngRow As Long Set objFSO = CreateObject("Scripting.FileSystemObject") For Each objBook In objFSO.GetFolder(FolderPath).Files lngRow = ThisWorkbook.Sheets("data").Range("A" & Rows.Count).End(xlUp).Row + 1 Workbooks.Open objBook.Path With ActiveWorkbook .Sheets("data").Rows("5:105").Copy ThisWorkbook.Sheets("data").Rows(lngRow) .Close End With Next Set objFSO = Nothing ActiveWindow.ScrollRow = 1 ActiveWindow.ActiveSheet.Range("A1").Select Application.ScreenUpdating = True End Sub

  • 大量のエクセルの共通項目を一つのエクセルにまとめる

    Windows10のoffice2016を使用しています。 マクロ初心者です。 仕事でエクセルファイルのデータ整理をしなければいけないのですが、コピー元のエクセルファイルが千単位であり、手作業だと時間がかかりすぎるため、VBAでマクロが動かなくて困っています。調べながら書いておりますが、なぜ動かないかわかっておりません。 コピー元の多くのエクセルファイルと貼付先の一つのエクセルファイルがあります。 コピー元のエクセルファイルは、”計算フォルダ”というフォルダに入っており、 その各々のファイルには、“仕様””日時””用途”とその右隣には値が入力されています。 行いたいことは、 コピー元のファイル内の”仕様””日時””用途”をFindで探して、その隣の値をコピーして、貼付先のエクセルファイルの”貼付先1”というシートに、順に貼付けすることです。 皆さまのお知恵をどうか貸してください。よろしくお願いします。 Sub 取り込みマクロ() Dim objFSO As Object Dim objBook As Object Dim n As Long Dim rngSearch1, rngSearch2, rngSearch3, varSearch Dim myRange As Range Dim FolderPath As String FolderPath = ThisWorkbook.Path & "\計算フォルダ" Set objFSO = CreateObject("Scripting.FileSystemObject") For Each objBook In objFSO.GetFolder(FolderPath).Files n = ThisWorkbook.Sheets("貼付先1").Cells(Rows.Count, "A").End(xlUp).Row + 1 Workbooks.Open objBook.Path Worksheets("コピー元").Activate Set rngSearch1 = .Worksheets("コピー元").Find("仕様") Set rngSearch2 = .Worksheets("コピー元").Find("日時") Set rngSearch3 = .Worksheets("コピー元").Find("用途") If rngSearch1 Is Nothing Then Else rngSearch1.Offset(0, 1).Value.Copy.Sheets("貼付先1").Range ("B" & 1 + n) End If If rngSearch2 Is Nothing Then Else rngSearch2.Offset(0, 1).Value.Copy.Sheets("貼付先1").Range ("C" & 1 + n) End If If rngSearch3 Is Nothing Then Else rngSearch3.Offset(0, 1).Value.Copy.Sheets("貼付先1").Range ("D" & 1 + n) End If With Rows("185").Copy ThisWorkbook.Sheets("貼付先1").Rows(n).PasteSpecial Application.CutCopyMode = False ActiveWorkbook.Close SaveChanges:=False End With On Error Resume Next Next Set objFSO = Nothing MsgBox "完了!" End Sub

  • 特定のワークシートcsvファイル書き出しほか

    エクセルブックの中身が、 1番目 graphシート 2番目から19番目 ワークシート で構成されているエクセルファイルが100個 AAAというフォルダに入っています。 それぞれのエクセルブックにあるシートを、ブックのファイル名にしたフォルダを作成し、その中にcsvで書き出すプログラムを作りました。 また、AAAのフォルダの1つ上のフォルダ(VBA実行するカレントフォルダ)には、テキストファイルもあり、作成されたフォルダに合わせてコピーするようにしています。 一応、期待通りの動作をしましたが、スッキリとしたプログラムとするために、アドバイスをいただけないでしょうか? また、できれば、それぞれのブックの2番目から7番目のワークシートのみをcsvファイルで書き出したいと思い、シートを2番目から順にアクティブにして書き出すように変更しても1番目のグラフシートからcsvになってしまいました。 特定のワークシートのみをcsvファイルで書き出すにはどのように書いたら良いでしょうか? よろしくおねがいしむす Sub ファイル一括作成()     Application.ScreenUpdating = False         '対象ブックの選択     'フォルダ内のブックを順次選択     Dim FolderPath As String     Dim objFSO As Object     Dim objBook As Object     Dim objFiles As Object     Dim objFile As Object     Dim mysma4 As Object     Set objFSO = CreateObject("Scripting.FileSystemObject")     FolderPath = ActiveWorkbook.Path & "\AAA"     Set objBook = objFSO.GetFolder(FolderPath)     Set objFiles = objFSO.GetFolder(FolderPath).Files     Set mysma4 = objFSO.GetFile(ActiveWorkbook.Path & "\fig_all.TXT")     For Each objFile In objFiles      If objFSO.GetExtensionName(Path:=objFile) Like "xlsx" Then     'ベースファイル名フォルダ作成&sma4ファイルコピー       objFSO.CreateFolder Path:=FolderPath & "\" & objFSO.GetBaseName(objFile)       mysma4.Copy Destination:=FolderPath & "\" & objFSO.GetBaseName(objFile) & "\fig_all.TXT"     '各ファイルcsv書き出し      Workbooks.Open objFile.Path       For Each ws In Worksheets '各シートに対して処理を繰り返す           ws.Activate           'ベースファイルと同じ階層に出力           ActiveWorkbook.SaveAs _           Filename:=FolderPath & "\" & objFSO.GetBaseName(objFile) & "\" & ws.Name & ".csv", _           FileFormat:=xlCSV       Next ws       ActiveWorkbook.Close SaveChanges:=False      Else      End If     Next     MsgBox "ファイル作成が完了しました。"     Set objFSO = Nothing     Set objBook = Nothing     Set objFiles = Nothing     Set mysma4 = Nothing     Application.ScreenUpdating = True End Sub

  • フォルダ内全ファイルからデータを取得する方法

    お力をお貸しください。 下記のようなコードを書きました。*ドライブにあるフォルダ内全ファイルからデータを取得して、一つの表にまとめようとしています。 が、Workbooks.Open sFileで、「ファイルが存在しません」というエラーがでます。 変数を確認しましたが、きちっと呼び込んでいるのに、ファイルが存在しないとなるのが分かりません。 ここで、データの最終行を取得するのに、ややっこしいコードを書いているのは、データが虫食い状態で、全部のセルが埋まっているのはC列しかないため、このようなことになっています。 よろしくお願いします。 Sub Macro1() Dim FName As String, FPath As String, cnt As Long, r As Long, m As Long, MyMonth As String Dim LastRows As Long Set Wsh = CreateObject("Wscript.Shell") Set Wsh = Nothing m = Range("A1").Value - 1 MyMonth = m & "月" FPath = "*:\" & MyMonth & "\" ChDir FPath FName = FPath & "*.xls" sFile = Dir(FPath  & "*") ' 画面更新オフ Application.ScreenUpdating = False With ThisWorkbook.Sheets(1) LastRows = Cells(Rows.Count, 1).End(xlUp).Row + 1 Do While sFile <> "" If sFile <> ThisWorkbook.Name Then Workbooks.Open sFile cnt = Cells(Rows.Count, 3).End(xlUp).Row + 1 ActiveSheet.Range("A1:" & "M" & cnt).Copy Destination:=ThisWorkbook.Sheets(1).Cells(LastRows, 1) ActiveWorkbook.Close SaveChanges:=False sFile = Dir() End If Loop End With '画面更新オン Application.ScreenUpdating = True ''名前をつけて保存 ' ' Application.DisplayAlerts = False ' Filedate = Format(Date, "yyyymm") ' ActiveWorkbook.SaveAs Filename:=FPath & "\" & Filedate & ".xls" ' Application.DisplayAlerts = True ' ''画面更新オン 'Application.ScreenUpdating = True ' ' End Sub

  • VBA フォルダ内ファイルにマクロ一括処理

    フォルダ内ファイルのマクロを一括実行したいです。 フォルダ内ファイル全てに下記のマクロを登録 Sub 値貼り付け() 'シート4番目を選択 Sheets(4).Select 'シート名1文字目が「★」以外のシートを選択 For Each i In ThisWorkbook.Sheets If Not i.Name Like "★*" Then i.Select Replace:=False End If Next i '全セル選択 Cells.Select 'コピー Selection.Copy '値貼り付け Selection.PasteSpecial Paste:=xlPasteValues Cells(1, 1).Select Sheets(1).Select '「.xlsx」で保存 Application.DisplayAlerts = False Dim fso, f Set fso = CreateObject("Scripting.FileSystemObject") With ActiveWorkbook f = fso.GetBaseName(.Name) .SaveAs .Path & "\" & f & "保存.xlsx", FileFormat:=xlWorkbookDefault .Close End With Set fso = Nothing End Sub 一括でマクロを実行する用のファイルに下記マクロを登録 Sub 一括処理() Dim Fpath As String Dim Fname As String Dim Wb As Workbook Fpath = ThisWorkbook.Path & "\" Fname = Dir(Fpath & "*.xlsm") Do Until Fname = "" If Fname = ThisWorkbook.Name Then Else Application.DisplayAlerts = False 'ブックを開く Set Wb = Workbooks.Open(Fpath & Fname) 'マクロ実行 Application.Run "'" & Fname & "'!値貼り付け" Wb.Close SaveChanges:=True Application.DisplayAlerts = True End If Fname = Dir() Loop End Sub 一括処理の実行をすると、フォルダ内の一つのファイルだけ マクロ実行されると終了してしまいます。 各々のファイルには他にもマクロを登録していて、そちらは 'マクロ実行 Application.Run "'" & Fname & "'!値貼り付け" のマクロの名前部分を変更して、同様に一括処理していますが 問題なく動きます。 なぜかこの「値貼り付け」のマクロだけ全ファイルに動作して くれません。 色々自分なりに調べているのですが、どうしても原因不明で 今回投稿させて頂きました

  • ワークシートをコピーしたい

    下記載のサンプルマクロは「ワークシートをコピーして、追加したワークブックにコピペする」マクロなんですが、これを「ワークシートをコピーして、追加したワークシートにコピペする」にできないでしょうか? 出来るのであれば、値と書式の他に関数もそのまま貼り付けたいので御教授お願いします。 ただマクロは削除してマクロ抜きのコピペが理想です。 宜しくお願い致します。 Sub サンプル() Dim sc As Integer sc = Application.SheetsInNewWorkbook Application.SheetsInNewWorkbook = 1 ThisWorkbook.Sheets("オリジナル").Cells.Copy 'コピー Workbooks.Add 'ブック追加 Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlValues '値貼り付け Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlFormats '書式貼り付け Sheets("Sheet1").Name = "コピー" Application.CutCopyMode = False Application.SheetsInNewWorkbook = sc ActiveWorkbook.Close ThisWorkbook.Activate End Sub

  • オートフィルター後の見出し以外をコピー

    お世話になっております。Excel2003を使ってます。 オートフィルター後の、見出し以外をコピーしようと考えています。 現在は With ThisWorkbook.Worksheets("テスト") .Range("B2:B" & Cells(Rows.Count, 2).End(xlUp).Row).SpecialCells(xlCellTypeVisible).Select '可視セルの選択 Selection.Copy '可視セルコピー ThisWorkbook.Worksheets("フィルタ用").Range("A" & m).PasteSpecial 'A列に貼り付け! Excel.Application.CutCopyMode = False 'クリップボードの内容クリア End with この内容で上手くいっていましたが、 見出し+1行しかない場合、 全範囲選択になってしまい、上手くいかない状況です。 どうやったら、見出し以外のB列をコピーできるのでしょうか? Offset とか、 Resize を使えばいけるのでしょうか…? 見出し以外の行、 B列、C列、D列 F列 を 「TEST」シートにコピーしたいです。 With ThisWorkbook.Worksheets("テスト").Range("A1").CurrentRegion .Offset(1, 1).Resize(.Rows.Count - 1, 3).Copy _ Destination:=Thisworkbook.worksheets("TEST").Range("A" & m) .Offset(1, 4).Resize(.Rows.Count - 1, 1).Copy _ Destination:=Thisworkbook.worksheets("TEST").Range("D" & m) End With 考えたのですが、良く分からなくなってしまいました。 回答をお願い致します!

  • エクセルVBAで書式と値の貼付けにつて

    エクセル2007VBAで新規ファイルを作る場合のコピー、貼り付けで質問しましたが 式も全て貼り付けになるとUSBメモリーで持ち出した場合、エラーとなります。 それで値と書式のみ貼り付けする様下記の様に書き直しましたが、.PasteSpecialでメソッドまたはデータメンバーが見つかりませんとなります。 ぐぐっててヘルプを見ますが解決出来ません。どなたがご教授お願いします。 元の式 Sub DGCopy() Workbooks.Add With ThisWorkbook .Sheets(5).Cells.Copy Sheets(1).Cells Sheets(1).Select Sheets("Sheet1").Name = "電気代" .Sheets(6).Cells.Copy Sheets(2).Cells Sheets(2).Select Sheets("Sheet2").Name = "ガス代" F = Application.GetSaveAsFilename(FileFilter:="Excelブック (*.xls),*.xls)") If F = "False" Then Exit Sub ' ダイアログでCancelをクリックした場合 ActiveWorkbook.SaveAs Filename:=CStr(F) End With End Sub 書き直した式 Sub DGCopy() Workbooks.Add With ThisWorkbook Sheets(5).Select Cells.Selection.Copy Sheets(1).Selection .PasteSpecial Paste:=xlPasteFormats ←エラー部分 .PasteSpecial Paste:=xlPasteValues Sheets("sheets1").Name = "電気代" Sheets(6).Select Cells.Selection.Copy Sheets(2).Selection .PasteSpecial Paste:=xlPasteFormats .PasteSpecial Paste:=xlPasteValues Sheets("sheets2").Name = "ガス代" F = Application.GetSaveAsFilename(FileFilter:="Excelブック (*.xls),*.xls)") If F = "False" Then Exit Sub ActiveWorkbook.SaveAs Filename:=CStr(F) End With End Sub

  • 最終セルまでデータを反映させるマクロ

    あるサイトからの利用コードです。 それをアレンジしようとしましたが、つまずきました。 マクロコードをご教示ください。 あるフォルダに複数のエクセルファイルがあります。 構成が同じシート(名前は同じ。仮に "各シート")を、 別ブック(仮に "まとめ")の一つのシートに纏めます。 その時、複数ファイルの D4のデータだけは "まとめ"ブックのL列に反映させたいのですが、 下記コードを使用すると、どこにどのようなコードを入れたら良いのでしょうか? 因みに複数ファイルの8行目からコピーされ、 複数ファイルのCからM列は まとめブックのAからK列に反映されるようになってます。 (まとめブックの1行目は見出し) Dim i As Integer Dim strPath As String Dim strFileName As String Dim WB1 As Workbook Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRowCount As Long Set WS2 = Sheets("まとめ") strPath = ThisWorkbook.Path strFileName = Dir(strPath & "\*.xls*") Do While strFileName <> "" If strFileName <> ThisWorkbook.Name Then Set WB1 = Workbooks.Open(strPath & "\" & strFileName) Set WS1 = WB1.Sheets("各シート") With WS1.Range("C7") lngRowCount = .Worksheet.Cells(.Worksheet.Rows.Count, .Column).End(xlUp).Row - .Row If lngRowCount >= 1 Then With .Resize(lngRowCount, 11).Offset(1) .Copy WS2.Range("A" & WS2.Rows.Count).End(xlUp).Offset(1) End With End If End With _____ここで つまずく_____    With WS1.Range("D4")     .Copy WS2.Range("L" & WS2.Rows.Count).End(xlUp).Offset(1)     WS2.Range("L" & WS2.Rows.Count).End(xlUp).AutoFill Destination = Range("E1048576").End(xlUp).Row _____ここまで つまずく_____ WB1.Close False End If strFileName = Dir Loop End Sub エクセル2013です。 宜しくお願い致します。

専門家に質問してみよう