6000を超えるcsvファイルを1つのcsvドキュメントにまとめる必要があります。現在のVBAプロセスは次のとおりです。1。個々のCSVデータファイルを開きます2.行数に基づいてファイルの内容を配列にロードします3.個々のCSVファイルを閉じます4.配列を処理します
コードと処理の効率を向上させるために、すべてのファイルを開いたり閉じたりせずに、個々のCSVファイルから配列にデータをロードする方法があるのではないかと期待していました。
私はExcel2011forMacを使用しています。
6000を超えるcsvファイルを1つのcsvドキュメントにまとめる必要があります。現在のVBAプロセスは次のとおりです。1。個々のCSVデータファイルを開きます2.行数に基づいてファイルの内容を配列にロードします3.個々のCSVファイルを閉じます4.配列を処理します
コードと処理の効率を向上させるために、すべてのファイルを開いたり閉じたりせずに、個々のCSVファイルから配列にデータをロードする方法があるのではないかと期待していました。
私はExcel2011forMacを使用しています。
6000 個のファイルはすべて同じ形式であると想定しています。
私の試験条件
以下のコードを実行したところ、わずか 4 秒で完了しました。
Option Explicit
Sub Sample()
Dim strFolder As String, strFile As String
Dim MyData As String, strData() As String
Dim FinalArray() As String
Dim StartTime As String, endTime As String
Dim n As Long, j As Long, i As Long
strFolder = "C:\Temp\"
strFile = Dir(strFolder & "*.csv")
n = 0
StartTime = Now
Do While strFile <> ""
Open strFolder & strFile For Binary As #1
MyData = Space$(LOF(1))
Get #1, , MyData
Close #1
strData() = Split(MyData, vbCrLf)
ReDim Preserve FinalArray(j + UBound(strData) + 1)
j = UBound(FinalArray)
For i = LBound(strData) To UBound(strData)
FinalArray(n) = strData(i)
n = n + 1
Next i
strFile = Dir
Loop
endTime = Now
Debug.Print "Process started at : " & StartTime
Debug.Print "Process ended at : " & endTime
Debug.Print UBound(FinalArray)
End Sub
フォルダのスクリーンショット
コード出力のスクリーンショット
アップデート
OK、MACでテストしました
私の試験条件
以下のコードを実行したところ、コードの所要時間は 1 秒未満でした (ファイルが 1024 個しかないため)。したがって、6kファイルがあった場合に備えて、再び4秒間実行されることを期待しています
Sub Sample()
Dim strFile As String
Dim MyData As String, strData() As String
Dim FinalArray() As String
Dim StartTime As String, endTime As String
Dim n As Long, j As Long, i As Long
StartTime = Now
MyDir = ActiveWorkbook.Path
strPath = MyDir & ":"
strFile = Dir(strPath, MacID("TEXT"))
'Loop through each file in the folder
Do While Len(strFile) > 0
If Right(strFile, 3) = "csv" Then
Open strFile For Binary As #1
MyData = Space$(LOF(1))
Get #1, , MyData
Close #1
strData() = Split(MyData, vbCrLf)
ReDim Preserve FinalArray(j + UBound(strData) + 1)
j = UBound(FinalArray)
For i = LBound(strData) To UBound(strData)
FinalArray(n) = strData(i)
n = n + 1
Next i
strFile = Dir
End If
strFile = Dir
Loop
endTime = Now
Debug.Print "Process started at : " & StartTime
Debug.Print "Process ended at : " & endTime
Debug.Print UBound(FinalArray)
End Sub
フォルダのスクリーンショット
コード出力のスクリーンショット
これを行うために Excel を使用する必要はありません。次のように入力して、コマンド プロンプトから Windows コピーを使用してマージできます。
copy *.csv mergedfilename.csv
私の意見では、あなたの問題に対するExcelの答えはありません.とにかく、通常の定義の範囲内ではありません.
それを解決する正しい方法は、タスクに適したプログラミング言語を使用することです。たとえば、perl、またはコマンド シェルでさえ、ファイルを結合します。Excel は一定のファイル I/O 用には作成されていませんが、perl は大量のファイルの処理に優れています。これと同様のプロジェクト (数百万のファイルを結合する) を、比較的小さな UNIX サーバーで数分で実行しました。
nneonneo がコメントで示唆しているように、コマンド シェルを使用してファイルをまとめて cat (cat=concatenate) することもできます。どちらが速いとは言えません。Perl は、特に最初に perl を学ばなければならない場合は特に、コーディングに時間がかかります (ただし、ネット上には多くの例があります)。