- ベストアンサー
ExcelVBAでフォルダ内の全csvを開き一行に
- ExcelVBAを使用して、指定フォルダ内にある全てのcsvファイルを開き、行列変換して一行に並べる方法について教えてください。
- ExcelVBAで指定フォルダ内の全csvファイルを開き、データを行列変換して一行に並べる方法を教えてください。
- ExcelVBAを使って、指定したフォルダ内の全csvファイルを開いて、データを行列変換して一行に並べる方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
出力先シート(dataシート)のB列、C列は、日付、時刻ではありますが 文字列という前提でコードを書いてみました。 違っている場合は指摘してください。 (日付として扱うには、年の情報が必要です) なお、対象としている文字コードは、ANSIまたは、UTF-8のBom付きです。 Sub sample() Const Path As String = "C:\test\" Dim buf As String, cnt As Long Dim GetBook As Workbook Dim GetSheet As Worksheet Dim PutSheet As Worksheet Dim PutRow As Long '出力先行番号 Dim ColCnt As Long Dim RowCnt As Long Dim GetCol As Long Dim PutCol As Long Set PutSheet = ThisWorkbook.Sheets("Data") PutSheet.Cells.ClearContents buf = Dir(Path & "*.csv") PutRow = 1 Do While buf <> "" Set GetBook = Workbooks.Open(Path & buf) Set GetSheet = GetBook.Sheets(1) PutSheet.Cells(PutRow, 1).Value = GetSheet.Cells(3, 2).Value PutSheet.Cells(PutRow, 2).NumberFormatLocal = "@" PutSheet.Cells(PutRow, 2).Value = _ Format(GetSheet.Cells(1, 2).Value, "MM/DD") PutSheet.Cells(PutRow, 3).NumberFormatLocal = "@" PutSheet.Cells(PutRow, 3).Value = _ Format(GetSheet.Cells(2, 2).Value, "hh:MM") RowCnt = 4 PutCol = 4 Do If GetSheet.Cells(RowCnt, 1).Value = "" Then Exit Do GetCol = GetSheet.Cells(RowCnt, Columns.Count).End(xlToLeft).Column PutSheet.Cells(PutRow, PutCol).Value = GetSheet.Cells(RowCnt, GetCol).Value PutCol = PutCol + 1 RowCnt = RowCnt + 1 Loop GetBook.Close buf = Dir() PutRow = PutRow + 1 Loop End Sub
その他の回答 (2)
- SI299792
- ベストアンサー率47% (772/1616)
文字コードは何でしょうか。メモ帳でcsv ファイルを開いて、ファイル、名前を付けて保存の画面を出せば、下の方に出てきます。 取りあえずANSI(シフトジス)専用で作りました。それ以外は文字化けします。 フォルダはこのワークブックと同じフォルダとしました。 Option Explicit ' Sub Macro1() Dim File As Variant Dim PtrS As Variant Dim FCount As Integer Dim CInp As Integer Dim COut As Integer Dim ROut As Long Dim FData As String ' File = Dir(ThisWorkbook.Path & "\*.CSV") PtrS = Array(2, 3, 1) Cells.ClearContents ' Do While File > "" Open ThisWorkbook.Path & "\" & File For Input As #1 ROut = ROut + 1 FCount = 0 ' Do While Not EOF(1) Line Input #1, File If File = "" Then Stop File = Split(File & ",", ",") CInp = 0 ' Do FData = File(CInp) CInp = CInp + 1 Loop While CInp <= UBound(File) And Val(FData) = 0 ' FCount = FCount + 1 COut = FCount On Error Resume Next COut = PtrS(COut - 1) On Error GoTo 0 Cells(ROut, COut) = FData Loop Close File = Dir Loop MsgBox "終了しました" End Sub
- imogasi
- ベストアンサー率27% (4737/17069)
最近2回も、フォルダ内のサブフォルダ内のフアイルの一覧を出したい、という質問があった。回答数ははかばかしくなかった。その人とは別人のようだが。 本件は、1つのフォルダ内で、サブフォルダ無し、ということで、ファイル名を表示したいのだろうか? >全csvファイルのデータを開き ファイルの名前などだけなら、ファイルを、実物を、開かなくても、リスト化できると思う。 ファイルを開かないと、そういうファイル名などの情報が取れないと、思っているなら、質問者は相当経験が浅い。 ーー 提案がある。下記2つのことを一緒の問題にするな。 (1)1指定フォルダ内のファイル名の探索 (2)行列変換して一行毎に並べていきたいのです。 ーー (2)は見た目のはなし。行と列を入れ替える操作(=VBAでもそれはある)、で済ませられないのか。 課題を複数盛り込むと、理解が難しくなるのは、心得るべき大原則。 >通しで回答いただけると、はそういう点から、欲張りすぎ。 回答者もそこまでやってくれないのが普通。 ーー 質問コーナーに質問する段階でない。質問コーナーの回答ならわかりやすいか?そういうことは期待できない。回答は、文章やVBAコードだけで、説明などほとんどない。コードだけ載せる回答がほとんど。また、質問者で、疑問点まで絞って、質問できる人が、現状ほとんどいない。ほしいことの文章でなく、やってみて行き詰まる、スモールな課題レベルに落とし込んで質問すべきだ。この能力がないと、VBAの勉強は進まない。いわば丸投げ的な質問だ。本当はそういう人は、VBSAのスクールでも行くか、友人を作るか、仲間を見つけるかしかない、と思う。 本件もわかりにくいと言っているだけで、読んだWEB記事のどの行の意味が分かりませんなどと、絞ればどうか。 「VBA ファルダ ファイル名」で照会すればコード例が見つかる。 その時 (1)Dir関数を使う (2)FSOを使う の2つの記事が出てくるが、(2)の方がエクセルVBA向きだとは思う。 DirはDosCommand時代からあるものだが、それだけにFSOのスクリプトの 方が、機能が(Dirでも深く勉強すればできるとしても)直截的に書けるものが多い。本件の前半の課題は、FSOの本を買って読めば、その中に例題として、似たものがでている。 >いくつか見比べるとコマンドが異なってると、混乱してしまい これを、主流の手法は同じ手法だなと、見通せるようになるのが、経験の力で、説明のせいではないだろう。同じ課題でも、2ー3通りのやり方があるのが普通で、両方 憶えておくことが、将来、別の課題で、役に立つ場合を良く経験する。 >通しで回答いただけると、理解もできるか 丸写しで動くVBAコードが欲しいという、殆どの質問者のパターンではないか。 それではVBAの進歩(勉強になる)はほとんどないよね。