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

このQ&Aのポイント
  • VBAを使用して、特定のフォルダ内の全てのcsvファイルからデータをコピーする方法について教えてください。
  • 元のcvsファイルのシート数が一つで、シート名には全てファイル名が付いています。つまり、全てのファイルのシート名が異なります。どのように対応するのか教えてください。
  • マクロを作りましたが、正しく動作しません。どなたか詳しい方、解決策を教えていただけないでしょうか。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.2

私なら、こんな感じで作ります。 Sub test() Const FolderPath As String = "C:\data" Dim Filename As String Dim Sh0 As Worksheet, Sh As Worksheet Dim c As Long Set Sh0 = ActiveSheet Filename = Dir(FolderPath & "\*.csv") Do Until Filename = "" c = c + 1 Set Sh = Workbooks.Open(FolderPath & "\" & Filename).Sheets(1) Sh.Columns(5).Copy Sh0.Columns(c) Application.DisplayAlerts = False Sh.Parent.Close Application.DisplayAlerts = True Filename = Dir() Loop End Sub

mareomareo
質問者

お礼

完璧に動作しました。どうもありがとうございます。 半日がかりの仕事がトイレに行ってる間に済んでしまい、猛烈に感動しています。 ただ、当方のスキルがなさ過ぎ、内容を理解したとまでは到底言えませんので 時間をかけてじっくり解読してみたいと思います。 半ば心折れ掛けておりましたが、マクロ習得のモチベーションも 一気にMAXに上がりました。 重ね重ねありがとうございました。 ちなみに今さらですが 下から7行目くらいののコードで「実行時エラー438、オブジェクトはこのプロパティまたはメソッドをサポートしていません」と出てました。どうも失礼しました。

その他の回答 (1)

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.1

どの命令で、どんなエラーが出たのか、くらいは書きましょうよ。

関連するQ&A

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

    以下マクロは一昨日まで問題なく使えていたのですが、 昨日から突然「データリンクプロパティ」が表示され、 「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」がでてきますが、 何か関係があるのでしょうか。 どなたかお知恵をお貸しくださいませ。

  • 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

  • 特定のワークシート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

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

    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

  • エクセルVBAの質問 開いているもう一つのブックのシート名をすべて取得する方法

    おはようございます。 現在マクロを実行しているブックのシート名を下のようなコードで取得していますが、これを 開いているもうひとつのブックのシート名を マクロ実行しているシート“しーと1”のJ3セル以降に並べる というように変更したいのですが、下のコードを少し変更して 対応できるでしょうか?教えていただけたら助かります。 Sub シート名() Dim i As Integer Dim mySheetCnt As Integer Dim mySheetNam As String Application.ScreenUpdating = False Columns("J:J").Select Selection.ClearContents Range("J2").Select ActiveCell.FormulaR1C1 = "項目名" mySheetCnt = ThisWorkbook.Sheets.Count For i = 2 To mySheetCnt mySheetNam = Sheets(i).Name Sheets("しーと1").Cells(i, 10) = mySheetNam Next i Application.ScreenUpdating = True MsgBox "シート名更新しました。" End Sub

  • VBAでも新規ファイル作成

    Excel2003です。 下記のコードであるシートを別ファイルにして保存するコードを書いています。ただ、このコードでは、コピー元のシートにExcel関数が入っているために、出来上がった新規ファイルを開くときに常に”リンクの更新”を聞かれてしまいます。リンクの更新をする必要はないのでファイルを開くたびに”更新しない”を選択してもよいのですが、初めからこの”リンクの更新”メッセージが出ないようにするには何か良い手立てはないでしょうか? ------------------------------------------------------------- Sub ファイル作成() '報告書を"名前を付けて保存" Sheets("Sheet1").Select Dim 既定ファイル名 As String Dim 保存ファイル名 As Variant 既定ファイル名 = "新規報告書" 保存ファイル名 = Application.GetSaveAsFilename(既定ファイル名, "Excel ブック(*.xls),*.xls") If 保存ファイル名 = False Then MsgBox "保存は中止されました。" Sheets("Sheet1").Select Else With ThisWorkbook.ActiveSheet Workbooks.Add .Copy After:=ActiveWorkbook.Sheets(1) Application.DisplayAlerts = False ActiveWorkbook.Sheets(1).Delete Application.DisplayAlerts = True ActiveWorkbook.SaveAs 保存ファイル名, xlNormal ActiveWorkbook.Close False End With Sheets("Sheet1").Select End If End Sub ---------------------------------------------------------------

  • VBA フォルダー内のファイル名・サイズの書き出し

    教えて下さい。 フォルダー名をダイアログを表示して選択する場合は、下記のコードを利用します。 Sub Test() Dim folderPath As Variant With Application.FileDialog(msoFileDialogFolderPicker) .Show folderPath = .SelectedItems(1) End With このfolderPathを利用して  フォルダー内のファイル名(B列)とサイズ(C列)をセルに書き出したいのです。 (ただし、ファイルサイズが2GBを超えるファイルも存在します。) -------------------------------------------------------------------- 下記が参考なりそうですが、フォルダー名の取得の仕方が  上記コードと異なるので思考が停止しています。 'Excel VBAでフォルダ内のファイルリストを作成 Private Sub ExGetFileList(strPath As String) Dim i As Long Dim tSfo As Object Dim tGf As Object Dim tFi As Object Dim tSub As Object Set tSfo = CreateObject("Scripting.FileSystemObject") Set tGf = tSfo.GetFolder(strPath) i = 4 For Each tFi In tGf.Files 'ファイル名 Cells(i, 2) = tFi.Name 'ファイルサイズ KByte Cells(i, 6) = Int(tFi.Size / 1024) i = i + 1 Next End Sub Private Sub CommandButton1_Click() ExGetFileList "e:\MyDir" End Sub どのように整合させれば良いですか ?

  • ExcelシートをCSVファイルにする

    Excel2000を使用してます。 Excelブックに3つのシートがあります。 シート1はメインシートとして「ボタン1」「ボタン2」が存在してます シート2はインプットデータ用シート シート3はアウトプットデータ用シートです シート1の「ボタン1」を押すとVBAが実行されシート2の情報を読み、 シート3に算出結果を出力する仕組みです。 次にシート1の「ボタン2」を押すとシート3の内容をCSVに出力したいのですが、 下記のロッジクではうまくいきません。 どこを修正すればよいのでしょうか? Sub CSV出力() Dim ONAME As String Dim しーと As Worksheet Dim 新しーと As Worksheet Dim PAS As String 'OUTパス名 PAS = ThisWorkbook.Path ONAME = PAS & "\" & "出力.CSV" '出力しーと Sheets("出力").Select Set しーと = ActiveSheet Set 新しーと = Worksheets.Add With 新しーと しーと.Copy .Move End With With ActiveWorkbook .SaveAs Filename:=ONAME, FileFormat:=xlCSV .Close False End With End Sub

  • ファイル名が原因?Excelのマクロについて質問!

    Excelのマクロ初心者です。 1つのフォルダ内の全ファイル(xlsのみ)を対象として、 印刷枚数をカウントし、記録したいと考えています。 ですが、以下のプログラムを実行すると・・・ ファイル名が同じ形式であれば、正しく処理されます。 ですが、ファイル名が日本語・アルファベット・アンダーバーなどの記号などが入り混じって、その数もファイルによってバラバラだと、 印刷枚数のカウントは上手くいくみたいなのですが、 表記が前のファイルのシート名の上に次のファイルのシート名が重なってしまい、上手くいきません。 自分で調べたり、考えたりしたのですが、未だに分かりません。 助けてください。 Sub 現在のフォルダを取得の上、全シートのシート単位の印刷枚数を数える() Dim myFolder As String '//フォルダパス Dim myFile As String '//フォルダパス + ファイル名 Dim mySheetNam As String '//シート名 Dim Sh_Co As Integer '//シート数 Dim i As Integer '//カウンタ変数 Dim y As Integer '//カウンタ変数 Dim Sh_Pz As Integer '//印刷枚数(シート単位) Dim Pr_kz As Integer '//印刷枚数(ファイル単位) Dim all_Pz As Integer '//総印刷枚数 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual y = 1 '//************** フォルダのパスの取得 ************ myFolder = ThisWorkbook.Path & "\" '//************** パスの転記 ********************** ThisWorkbook.Sheets(1).Cells(4, 1).Value = myFolder '//************** ファイル名の取得 **************** myFile = Dir(myFolder & "**.xls") '//******* 該当のファイル(エクセルファイル)が存在する限り続ける ****** Do While myFile <> "" '//**** 現在のブック以外の場合は処理を行う **** If ThisWorkbook.Name <> myFile Then '//**** ファイル名の転記**** ThisWorkbook.Sheets(1).Cells(y + 5, 1).Value = myFile '//**** ブックを開く**** Workbooks.Open myFolder & myFile '//*********************************************************************** '//**** 開いたブックに対しての処理 *************************************** '//*********************************************************************** '//*** アクティブなブックのシート数取得 *** Sh_Co = ActiveWorkbook.Worksheets.Count '//*** シートの枚数分処理を行う**** For i = 1 To Sh_Co mySheetNam = Sheets(i).Name '//**** シート名を転記**** ThisWorkbook.Sheets(1).Cells(y + 5, 2).Value = mySheetNam ActiveWorkbook.Sheets(i).Select '//*** 印刷枚数(シート単位)取得 *** Sh_Pz = Application.ExecuteExcel4Macro("GET.DOCUMENT(50)") '//印刷枚数(シート単位)の転記**** ThisWorkbook.Sheets(1).Cells(y + 5, 3).Value = Sh_Pz '//*** 印刷枚数(ブック単位)取得 *** Pr_kz = Pr_kz + Application.ExecuteExcel4Macro("GET.DOCUMENT(50)") y = y + 1 Next i '//****印刷枚数(ブック単位)の転記**** ThisWorkbook.Sheets(1).Cells(y + 5 - Sh_Co, 4).Value = Pr_kz '//****ファイルを閉じる**** Workbooks(myFile).Close '//****罫線を引く**** With Range(Cells(y + 5, 1), _ Cells(y + 5, 5)).Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With Else '//***現在のブックだった場合の処理(転記のずれを修正する為)*** y = y - 4 End If '// ****印刷数の累計計算**** all_Pz = all_Pz + Pr_kz '// ****データの初期化**** Sh_Co = 0 Pr_kz = 0 myFile = Dir() y = y + 1 Loop 'Do 位置までもどり繰り返す '// ****総印刷枚数の転記**** ThisWorkbook.Sheets(1).Cells(6, 5).Value = all_Pz Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub

  • ファイルが無いときにエラーメッセージを出すようにし

    フォルダ内のcsvファイルを[CSV貼り付け]というシートに インポートさせるVBAをつくったんですが、CSVファイルがないときに エラーメッセージを出すようにしたいのですがどうすればいいでしょうか。 ---------------- Sub 読み込み() Dim Bk As Workbook Dim Rw As Long, ERw As Long Const ShName = "CSV貼り付け" ' <-- 貼り付け先 PathN = ThisWorkbook.Path & " \ " Const FNCom = "" ' <-- ファイル名の先頭共通部分指定 Dim FileN As String Dim Cnt As Integer FileN = Dir(PathN & FNCom & "*.csv") ' <-- 拡張子を指定 sFileName = Dir(sCurDir & "\*.*", vbNormal) sCurDir = ThisWorkbook.Path & "\CSVファイル\" FileN = Dir(sCurDir & FNCom & "*.csv") ' <-- 拡張子を指定 Rw = 1 Application.ScreenUpdating = False Do Until FileN = "" Cnt = Cnt + 1 Set Bk = Workbooks.Open(sCurDir & FileN, ReadOnly:=True) Dim Rws As Long With ThisWorkbook.Sheets(ShName) .Cells.Clear Bk.Sheets(1).Cells.Copy .Range("a1") End With FileN = Dir Loop Bk.Close SaveChanges:=False Set Bk = Nothing Application.ScreenUpdating = True MsgBox " CSV読みこみ完了しました。", vbInformation End Sub

専門家に質問してみよう