別質問で教えて貰った方法(下記URLの#2)で、複数のCSVファイルを
読み込むマクロはわかったのですが、それらのファイルを一つに
まとめる方法がよくわかりません。
新しいシート(or結果保存用のブック)を用意して、ここに順に繋げて
いきたいのですが、どうしたら良いのでしょうか。
ちなみに、入力されるCSVファイルのデータの入っている列数は固定
なのですが、行数はファイル毎に異なります。
<大元の質問>
http://oshiete1.goo.ne.jp/kotaeru.php3?q=359726
No.3ベストアンサー
- 回答日時:
こんにちは。
#2さんの回答で解決かもしれませんが、元の質問からの流れで、、、
単純な、開く、コピー、貼付け、閉じるの繰り返し処理です。
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
どうもありがとうございました。
ただ、そのまま実行すると、1行ずつデータが短くなってしまったので、
下記の所を追加しました。
.Cells(.Range("A65536").End(xlUp).Row+1, 1). _
↑
こうしたら、うまくいきました。
No.4
- 回答日時:
こんにちは。
> ただ、そのまま実行すると、1行ずつデータが短くなってしまったので
確かにそうですね。
End(xlup).Row は最終データになるので、例のままでは最終データを上書きしちゃいますね。
No.2
- 回答日時:
準備:下のコードのdataFolderにCSVファイルのあるドライブ、フォルダを入力します。
10000件くらいで検証してみました。必要なら、Dt(10000, 5) As String の10000を増やして下さい。
ただし、限界はあります。(65536行を超えられないとか、メモリー具合です)
1.開始年月日を入力
2.終了年月日を入力
・・・指定したフォルダにある開始年月日.csv~終了年月日.csvのデータをSheet2につなげて書き出します。
データを統合した後、ソート等を行われると思い、期間中のファイルの処理順は考慮していません。
また、コードが長くなるので、入力ミス等に対するエラー処理等も省いています。
読み込むファイルを2次元配列に読み込んで、Sheet2(2行目から)にはきだしているだけです。
複数ファイルの読み込みにどのようなコードが書かれているか分からないので、自分なりに(勝手に)ループさせて読み込んでいます。
ただ、年月日を入力するとこが一番長い? ご参考に。
ここから
↓
Sub CSVfilesRead()
Const Kakucyoshi = ".csv"
Dim dataFolder As String
dataFolder = "D:\・・・\・・・\・・・"
If Right(dataFolder, 1) <> "\" Then dataFolder = dataFolder & "\"
Dim StartYMD As Date '開始年月日(日付)
Dim EndYMD As Date '開始年月日(文字)
Dim strStartYMD As String '終了年月日(日付)
Dim strEndYMD As String '終了年月日(文字)
'日付の入力
StartYMD = InputBox("開始年月日を入力して下さい。(yyyy/mm/dd)")
strStartYMD = Format(StartYMD, "yyyymmdd")
EndYMD = InputBox("終了年月日を入力して下さい。(yyyy/mm/dd)")
strEndYMD = Format(EndYMD, "yyyymmdd")
'ファイルの読み込み
Dim DataFile As String 'データファイル名
Dim fileNo As Integer 'ファイル番号
Dim Dt(10000, 5) As String '読み込み用配列
Dim c As Long 'データカウンタ
DataFile = Dir(dataFolder & "*" & Kakucyoshi)
While DataFile <> ""
If strStartYMD <= Left(DataFile, 8) And Left(DataFile, 8) <= strEndYMD Then
fileNo = FreeFile
Open dataFolder & DataFile For Input As #fileNo
Do Until EOF(fileNo)
Input #fileNo, Dt(c, 0), Dt(c, 1), Dt(c, 2), Dt(c, 3), Dt(c, 4)
c = c + 1
Loop
Close
End If
DataFile = Dir
Wend
Application.ScreenUpdating = False
'結果をSheet2に書き出す
With Worksheets("Sheet2")
.Activate
.Cells.Clear
.Range(.Cells(2, 1), .Cells(c + 1, 5)) = Dt
End With
Worksheets("Sheet1").Activate
Application.ScreenUpdating = True
End Sub
この回答への補足
どうもありがとうございます。
やってみたのですが、何故か、
Input #fileNo, Dt(c, 0), Dt(c, 1), Dt(c, 2),Dt(c, 3), Dt(c, 4)
のところで止まってしまいます。
原因は調査中なのですが、よくわかりません。
もし何かお気づきの点があれば、教えてください。
どうもありがとうございます。
やってみたのですが、何故か、
Input #fileNo, Dt(c, 0), Dt(c, 1), Dt(c, 2),Dt(c, 3), Dt(c, 4)
のところで止まってしまいます。
原因は調査中なのですが、よくわかりません。
もし何かお気づきの点があれば、教えてください。
No.1
- 回答日時:
csvは単純なテキストファイルですから、
copy a.csv+b.csv+c.csv d.csv
というようなコマンドで一発結合できますし、それさえ面倒ならunix系ツールのcatで
cat *.csv >all.csv
という処理をすれば、本当の一発結合が可能です。
マクロとは、また違う分野ですがご一考ください。
アドバイスどうもありがとうございます。
マクロで処理する前にデーターファイルを結合する訳ですね。
今考えている方法がどうしてもうまくいかないときには参考にさせて
頂きます。
ただ、できればそういう手間をかけずに、マクロを走らせるだけで
全ての処理ができるようにしたいと思ってるんです。
やっぱりそういうのは難しいのでしょうか。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのVBAについて とある...
-
Python CSVファイルについて
-
アクセスと同フォルダのCSVファ...
-
コマンドによるzip圧縮
-
フォルダに入っているCSVファイ...
-
複数エクセルファイルの合成
-
FTPコマンド mgetでとまってし...
-
コマンドプロンプトの「%1」と...
-
コマンドプロンプトのエラーに...
-
大量のフォルダからひとつのフ...
-
バッチでテキストファイルから...
-
.txtではなく.logの方が良いの...
-
ftp処理でmove(移動)を行いたい
-
バッチ終了時にDOS窓を閉じるコ...
-
make test って何をするための...
-
VBAでワークシートを引数として...
-
バッチファイルで昨日の日付を取得
-
テキストファイルで提出とは?
-
exeファイルを実行するとコマン...
-
.NETアプリを作ったときの .man...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルのVBAについて とある...
-
複数エクセルファイルの合成
-
Python CSVファイルについて
-
アクセスと同フォルダのCSVファ...
-
【Rコマンダー】データインポー...
-
FTPコマンド mgetでとまってし...
-
複数のcsvファイルを統合、でも...
-
エクセル 指定範囲をCSV出力
-
コマンドによるzip圧縮
-
csv形式からbmpを作成
-
MAC フォルダ内のPDF件数とペー...
-
yahooカレンダーのデータをICS...
-
EXCEL マクロが正常に動かなく...
-
マクロでA1のデータをB列の行数...
-
csvファイルを結合するバッ...
-
バッチ処理でcsvファイルの文字...
-
エクセルマクロ2003による、複...
-
ファイルパスの指定の仕方がわ...
-
エクセルマクロ、複数のCSVファ...
-
Windows3.1または、MS-DOSでCSV...
おすすめ情報