電子書籍の厳選無料作品が豊富!

1つのフォルダに入っている沢山のCSVファイルのデータを
一つのエクセルシートにまとめたいのですが、
エクセルシートに1列ごとにまとめることができません。
どのようにすればいいでしょうか?
因みにフォルダを開いて閉じるまではできました。



Sub GetDataFromExcels()







'ステップ1|変数定義



Dim path As String



Dim cmax1 As Long, cmax2 As Long



Dim i As Long, j As Long, n As Long



Dim wb1 As Workbook, wb2 As Workbook



Dim ws1 As Worksheet, ws2 As Worksheet







Dim fs As Scripting.FileSystemObject



Dim basefolder As Scripting.Folder



Dim mysubfiles As Scripting.Files



Dim mysubfile As Scripting.File











'ステップ2|集約用エクセルの変数設定



Set wb1 = ThisWorkbook



Set ws1 = wb1.Worksheets("集約用シート")



n = 0







'ステップ3|FileSystemObjectの変数設定



path = ThisWorkbook.path & "\CSV111"



Set fs = New Scripting.FileSystemObject



Set basefolder = fs.GetFolder(path)



Set mysubfiles = basefolder.Files







'ステップ4|指定フォルダ内のファイルを繰り返しを読み込む



For Each mysubfile In mysubfiles







'ステップ5|ファイル拡張子を取得し



'エクセル(xls, xlsx, xlsm)のみ選択する



If fs.GetExtensionName(mysubfile) Like "[csv]*" Then







'ステップ6|エクセルファイルを開く



Application.DisplayAlerts = False



Workbooks.Open FileName:=mysubfile.path



Application.DisplayAlerts = True







Dim sheetName As String



sheetName = Worksheets(1).Name ' 1番目のシート名を取得







'ステップ7|開いたエクセルファイル(子エクセル)の変数設定



Set wb2 = ActiveWorkbook



Set ws2 = wb2.Worksheets(Worksheets(1).Name)







'ステップ8|子エクセルの最終行の値を取得







'cmax2 = ws2.Range("A1").End(xlToRight).Column















'ステップ9|子エクセルのデータを集約用エクセルに書き込む





'ws1.Range("A" & 1 & ":A" & 50).Value = ws2.Range("A" & 1 & ":A" & 50).Value







'For j = 1 To 100








'cmax1 = Cells(4, 1).End(xlToRight).Column + 1



'cmax1 = ws1.Range("A1").End(xlToRight).Column + 1



'ws1.Range(Cells(4, cmax1).Cells(500, camx1)).Value = ws2.Range("A1:A500").Value



ws1.Range("A" & 1 & ": A" & 50).Value = ws2.Range("A" & 1 & ":C" & 50).Value



'Next j













'ステップ10|子エクセルを閉じる



Application.DisplayAlerts = False



wb2.Close



Application.DisplayAlerts = True



Set wb2 = Nothing



cmax1 = ws1.Range("A1").End(xlToRight).Column + 1



End If







Next






'ステップ11|集約用エクセルを上書き保存する



Application.DisplayAlerts = False



wb1.Save



Application.DisplayAlerts = True



Set wb1 = Nothing







End Sub

A 回答 (2件)

STEP9


ws1.Range("A" & 1 & ": A" & 50).Value = ws2.Range("A" & 1 & ":C" & 50).Value
右辺と左辺が同じ大きさでないといけません。上記は、左辺:縦50×横1に対して、右辺:縦50×横3なのでエラーになります。

STEP8~9にリマークにした文が多数ありますが、cmax1やcmax2は有効化しないと上書きするだけです。

改行がすごいです。この状態でコード書いてないですよね?
    • good
    • 0

行間を詰めないととても見にくくて解析が困難ですよ。


また、1列にまとめるというのはどういう事でしょう?
CSVデータなので恐らく複数項目のレコードが縦に並んでいるものと想定されますが、コードを見る限りでは3項目に対して複数行のデータがある様に見受けられます。
複数のCSVデータは一つのシートに続けて書き込んでも問題ありませんか?
現在のコードでは集約用シートのA1~A50に対象CSVのA1~C50を書き込むようになっていますが、これでは処理を繰り返してドンドン上書きされていきます。
現状プログラム的にエラー無く動いているのであればws1側の行を変数カウンタで設けて設定時に加算していくのが良いと判断します。
ただし張り付けるエリアはA~Cですね。
STEP8の最終行取得がコメントアウトされていますが、ここを生かして変数に設定し、現在のカウンタ+1~現在のカウンタ+取得した最終行でデータを設定後カウンタに加算して行けば良いと考えます。(未検証ですが・・・)
ご参考までに
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!