マクロを使用してCSVファイルの結合を行いたい

このQ&Aのポイント
  • 過去の質問の中から、素晴らしい結合のマクロを見つけましたが、パソコンをwindows7にエクセルをエクセル2010に変更した後、マクロが使えなくなりました。どなたか修正して頂けないでしょうか?
  • 列の項目は定形で、10~200行のデータが書かれたCSVファイルが1つのフォルダに多数あります。新しいファイルに、NO.1のファイルのデータの続きにNO.2、NO.3・・・と続けてデータが下の行に連続して並ぶようにマクロで結合させたいと思っていますので、宜しくお願いします。
  • Sub Test1() Dim files As FileSearch, FilesCnt As Integer, i As Integer Dim cBook As Workbook, pBook As Workbook  FilesCnt = mySearch(files, ThisWorkbook.Path)  If FilesCnt = 0 Then Exit Sub  Set pBook = Workbooks.Add(xlWBATWorksheet)   For i = 1 To FilesCnt    Workbooks.Open files.FoundFiles(i)    Set cBook = ActiveWorkbook    cBook.ActiveSheet.UsedRange.Copy    With pBook.ActiveSheet     If i > 1 Then      .Cells(.Range("A65536").End(xlUp).Row + 1, 1). _       PasteSpecial (xlPasteAll)     Else      .Cells(.Range("A65536").End(xlUp).Row, 1). _       PasteSpecial (xlPasteAll)     End If    End With    Application.CutCopyMode = False    cBook.Close   Next i  Set cBook = Nothing: Set pBook = Nothing End Sub '******************************************************************** Function mySearch(files As FileSearch, myDir As String) As Integer  mySearch = 0  Set files = Application.FileSearch  With files    .NewSearch    .LookIn = myDir    .SearchSubFolders = True    .Filename = "*.csv"    If .Execute() > 0 Then mySearch = .FoundFiles.Count  End With End Function
回答を見る
  • ベストアンサー

マクロを使用してCSVファイルの結合を行いたい

過去の質問の中から、素晴らしい結合のマクロを見つけましたが、パソコンをwindows7にエクセルを エクセル2010に変更した後、マクロが使えなくなりました。 どなたか修正して頂けないでしょうか? 列の項目は定形で、10~200行のデータが書かれたCSVファイルが1つのフォルダに多数あります。 新しいファイルに、NO.1のファイルのデータの続きにNO.2、NO.3・・・と続けてデータが下の行に連続 して並ぶようにマクロで結合させたいと思っていますので、宜しくお願いします。 Sub Test1() Dim files As FileSearch, FilesCnt As Integer, i As Integer Dim cBook As Workbook, pBook As Workbook  FilesCnt = mySearch(files, ThisWorkbook.Path)  If FilesCnt = 0 Then Exit Sub  Set pBook = Workbooks.Add(xlWBATWorksheet)   For i = 1 To FilesCnt    Workbooks.Open files.FoundFiles(i)    Set cBook = ActiveWorkbook    cBook.ActiveSheet.UsedRange.Copy    With pBook.ActiveSheet     If i > 1 Then      .Cells(.Range("A65536").End(xlUp).Row + 1, 1). _       PasteSpecial (xlPasteAll)     Else      .Cells(.Range("A65536").End(xlUp).Row, 1). _       PasteSpecial (xlPasteAll)     End If    End With    Application.CutCopyMode = False    cBook.Close   Next i  Set cBook = Nothing: Set pBook = Nothing End Sub '******************************************************************** Function mySearch(files As FileSearch, myDir As String) As Integer  mySearch = 0  Set files = Application.FileSearch  With files    .NewSearch    .LookIn = myDir    .SearchSubFolders = True    .Filename = "*.csv"    If .Execute() > 0 Then mySearch = .FoundFiles.Count  End With End Function

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

こちらのような質問相談掲示板でも非常に良く寄せられるご質問の一種ですが、あなたが発見したマクロでやってるようにCSVファイルをエクセルで開いて操作すると、しばしばデータが変わってしまいます。今まで全く問題が無かったのでそこは絶対心配無いという事なら、勿論構いませんが。 既出回答にあるようにエクセルとか使わずにバッチで処理してしまう方が私も簡単とは思いますが、そこはまぁご質問なので、とりあえずベタなマクロでやらせてみると… sub macro1()  dim myPath as string  dim myFile as string  dim s as string  mypath = thisworkbook.path & "\"  on error resume next  kill mypath & "out.csv"  on error goto 0  myfile = dir(mypath & "*.csv")  if myfile = "" then exit sub  open mypath & "out.csv" for output as #1  do until myfile = ""   open mypath & myfile for input as #2   do until eof(2)    line input #2, s    print #1, s   loop   close #2   myfile = dir()  loop  close #1 end sub 結果はout.csvというファイルに書き出しています。 ブックをCSVファイルが保存してあるフォルダに放り込んでマクロを実行します。 やはり既出回答でも指摘されているように、勿論マクロ有効で開いてマクロをキチンと実行する必要があります。

shika1963
質問者

お礼

ありがとうございました。 とても簡単で、以前より早く作業ができました。 初心者なので、バッチで処理とかが良くわからなくて 申し訳ありませんでした。 とても助かりました。

その他の回答 (2)

  • f272
  • ベストアンサー率46% (8021/17145)
回答No.2

フォルダ内のテキストファイルを全て結合するだけなのに何故そんな大層なことをするの? そのフォルダ内に copy *.csv output.csv という内容のbatファイルを作って実行するだけでいいんじゃないの?

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

どこでエラーが出るのでしょうか エラーではなく、まったく動かないということでしたらリボンの下に最初に出るコンテンツの有効化ボタンを押さないと実行できません。 参照: http://officetanaka.net/excel/excel2010/008.htm

関連するQ&A

  • マクロを使用してCSVファイルの結合を行いたいのですが・・・

    エクセル2000を使用している初級者です。過去の質問の中から、素晴らしい結合のマクロを見つ けました。同一フォルダ内にあるファイルは見事に結合されました。ただ私が結合したいものは、 1時間で1ファイル、1日で1フォルダが作られており、フォルダが31個有ります。手作業で31個の フォルダをまとめるのも辛いので、1月分をまとめて結合するために、マクロの冒頭部分を私なり に色々手は加えてみたのですが、悲しいかな動きません。以下にコピーしますので、よろしくお願 い致します。又明日より出張のため、お礼が遅くなると思います。ご容赦下さい。 Sub Test() Dim Files, FilesCnt As Integer, i As Integer Dim cBook As Workbook, pBook As Workbook Files = Application.GetOpenFilename _ (FileFilter:="CsVFile(*.csv), *.csv", MultiSelect:=True) If IsArray(Files) Then Set pBook = Workbooks.Add(xlWBATWorksheet) FilesCnt = UBound(Files) For i = 1 To FilesCnt Workbooks.Open Files(i) Set cBook = ActiveWorkbook cBook.ActiveSheet.UsedRange.Copy With pBook.ActiveSheet .Cells(.Range("A65536").End(xlUp).Row, 1). _ PasteSpecial (xlPasteAll) End With Application.CutCopyMode = False cBook.Close Next i End If Set cBook = Nothing: Set pBook = Nothing End Sub

  • サンプルプログラムでエラーが出てしまいます、対処法を教えて下さい。

    Sub test写真の連続挿入()   Dim myDir As String   Dim myFile As String   Dim i As Integer   Dim n As Integer   n = 10   myDir = "D:\写真\" myFile = Dir(myDir, vbNormal)   Application.ScreenUpdating = False   Do Until myFile = ""   If myFile <> "." And myFile <> ".." Then   If (GetAttr(myDir & myFile) And 16) <> 16 Then   i = i + 1   With ActiveSheet.OLEObjects("Image" & i)    .Object.PictureSizeMode = 3    .Object.Picture = LoadPicture(myDir &myFile)   End With   If i = n Then Exit Do   End If   End If   myFile = Dir   Loop   Application.ScreenUpdating = True End Sub このWith ActiveSheet.OLEObjects("Image" & i)の行でエラーが出てしまいます、対処法を教えて下さい。( 実行時エラー'1004'OLEObjects プロパティを取得できません)

  • 【ファイルサーチ】指定のフォルダーではなく自分で選択したフォルダー内のファイルの総数をカウントしたい

    お世話になります。指定のフォルダーではなく自分で選択したフォルダー内の"csvファイル"の総数をカウントしたいのですがうまくいきません。アドバイスお願いいたします。 With Application.FileSearch .LookIn = Application.GetOpenFilename .Filename = "*.csv" If .Execute > 0 Then MsgBox .FoundFiles.Count & "個" End If For i = 1 To .FoundFiles.Count MsgBox .FoundFiles(i) Next i End With

  • Excel VBAのFileSearch機能

    初めて投稿します。助けてください。 以下のVBAを使用して業務を行っているのですが このマクロが動かなくなってしまいました。 ネット等で調べてわかったのですが XP問題で社内PCがすべて変わりExcelも2013になってしまい 2013では、下記に記載されているFileSearch機能が使用できないようです。 出来れば下記の分をExcel2013でも 動くようにどの部分を変更すればいいいか教えていただけないでしょうか? ---------------------<VBA文>------------------------- Sub 作成() Dim i, j, no As Integer Dim Mpath, Mname, Mfull As String Mpath = ActiveWorkbook.Path Mname = ActiveWorkbook.Name Mfull = Mpath & "\" & Mname Worksheets("一覧").Select Range("A2:A200").Clear With Application.FileSearch .NewSearch .LookIn = Mpath .Filename = "*.xls" .FileType = msoFileTypeExcelWorkbooks If .Execute > 0 Then For i = 1 To .Execute If .FoundFiles(i) <> Mfull Then Cells(i + 1, 1).Value = .FoundFiles(i) j = Len(Cells(i + 1, 1)) If j > 218 Then MsgBox ("218文字を超えてます。") Exit Sub End If End If Next i Else MsgBox ("見つかりませんでした。") End If End With   Range("A2").Select Range("A2:A1000").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal End Sub

  • 複数のCSVファイルを一つのブックに

    エクセルvbaの達人の皆様、どうか助けてください。 フォルダ内の複数のCSVファイルを一つのブックにシートを分けて取り込むvbaが知りたいです。問題は、 ・複数のcsvを一気に取り組みたい ・一つのブックに、csvファイル別にシートを分けたい ・文字化けを何とかしたい!!(文字コードをutf8にしたい) この3つをクリアすることですが、、 ネットで調べてみたところ、あるページに載っている以下のマクロを試してみたのですが、やはり文字化けしてしまいます。文字コードの設定をどこかで指定しなければならないと思いますが、どう改良すればよろしいでしょうか。(ちなみに、VBAは全くの初心者です) Sub test() Dim myObj As Object Dim myDir As String Dim myFileName As String Dim myc As Long Application.ScreenUpdating = False Set myObj = CreateObject("Shell.Application"). _ BrowseForFolder(0, "取り込むフォルダを選択してください", 0) If myObj Is Nothing Then Exit Sub myDir = myObj.Items.Item.Path If Right(myDir, 1) <> "\" Then myDir = myDir & "\" 'フォルダ内のExcelファイルを確認 myFileName = Dir(myDir & "*.csv") myc = 0 Do While myFileName <> "" Workbooks.Open (myDir & myFileName) myc = myc + 1 Workbooks(myFileName).Worksheets(1).Move ThisWorkbook.Worksheets(1) myFileName = Dir() Loop If myc = 0 Then MsgBox "CSVファイルがありません。" End If Application.ScreenUpdating = True End Sub (上記のマクロはhttp://www.excel.studio-kazu.jp/kw/20110705155353.html#commentから引用しました。)

  • エクセルのマクロについて

    Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "ア") = 0 Then If InStr(.Cells(i, "D"), "ア(半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub このエクセルマクロはC列に「ア」があって、D列に「ア(半角)」の文字がない場合はメッセージというマクロなのですが、このマクロをア~ンまで同じ作業をしたいのですが、ひとまとめにマクロを組む事はできるのでしょうか?できる場合どのようにすれば良いでしょうか? 下記のようにして見たのですができませんでした。 Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "[ア-ン]") = 0 Then If InStr(.Cells(i, "D"), "[ア-ン](半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub

  • FileSearchがエクセル2007で使えなくなって困っています。

    2003では普通に使えたのですが、2007で使うためにはどのように変えればいいのでしょうか?途方にくれているのでVBAに詳しい方ご教授ください。処理文で回答頂けるとうれしいです。 Public Sub p_更新() For i = 1 To 100: gwKillFL(i) = "": Next i With Application.FileSearch .LookIn = gAAFLD .SearchSubFolders = True .Filename = "*T" & Format(gBB, "00") & ".txt" .FileType = msoFileTypeAllFiles If .Execute(SortBy:=msoSortByFileName, _ SortOrder:=msoSortOrderAscending) > 0 Then For i = 1 To .FoundFiles.Count gwKillFL(i) = .FoundFiles(i) Call p_ReadData(.FoundFiles(i)) Next i For i = 1 To .FoundFiles.Count If gwKillFL(i) <> "" Then Kill gwKillFL(i) End If Next i If gMenu1 > 0 Then Range("A2").Select MsgBox "更新", vbOKOnly, "確認" End If Else If gMenu1 > 0 Then MsgBox "更新ファイルなし。", vbOKOnly, "確認" End If End If End With End Sub

  • マクロエラー処理

    下記のマクロを実行すると、If (.Range のところでコンパイルエラー参照が不正または不完全です。というメッセージが出るのですが、どこを修正すればよいのでしょうか 教えてください。 Sub 再表示1() Dim SheetName As String Dim i As Integer Dim LastRow As Integer Dim rng As Range LastRow = 3000 '最終行の番号 Sheets("ACT").Select For i = 6 To LastRow If (.Range("D" & i) = "A310" Or .Range("D" & i) = "A505") And .Range("V" & i) < 0 Then .Cells(i, "W").Resize(1, 3).ClearContents End If Next Stop End With End Sub

  • VBAで、[.FoundFiles.count]で取得した値の変数Cへの渡し方

    VBAで、[.FoundFiles.count]で取得した値を C=.FoundFiles.count(理想) としたいです。そして以下のコードのFor文の.FoundFiles.countをCとしたいのですが、思うようにいきません。その方法を教えて頂きたいのです。宜しくお願い致します。 With Application.FileSearch .LookIn = largept .Filename = "*.txt" If .Execute > 0 Then   For i = 1 to .FoundFiles.Count     ...     処理     ...   Next i Else End If End With

  • VBAのFileSearchでFoundFiles(i)の作成日時を取得したい

    タイトルどおりですが、Fileオブジェクトには DateCreatedプロパティーがあるようですが、 どこでこれを使用していいのかわかりません。 したのはHELPのサンプルですが、どうしたらいい ものでしょうか? With Application.FileSearch If .Execute() > 0 Then MsgBox .FoundFiles.Count & _" 個のファイルが見つかりました。" For i = 1 To .FoundFiles.Count Debug.Print .FoundFiles(i) Next i Else MsgBox "検索条件を満たすファイルはありません。" End If End With

専門家に質問してみよう