Sửa code gộp file csv khi chạy xong lỗi

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

thang_nguyen1

Thành viên hoạt động
Tham gia
6/10/16
Bài viết
136
Được thích
8
Nhờ mọi người giúp đỡ file gộp log csv. Khi code chạy xong bị dừng ở những file log có tên "(INF RRT)CoasiaRRT_2023_0705 (2).csv" có () là dừng chạy không gộp được file tiếp theo nữa. Vì là log ở các máy khác nhau mà cùng ngày chạy .Nên mình phải để như "* (2).csv" mới không bị trùng tên. Mình tìm hiểu nhưng chưa tìm ra nguyên nhân và cũng không rành lắm về code. Code này mình copy trên mạng và mình đang để trong file "Merge File Csv".
 

File đính kèm

  • Gộp File LOG.rar
    77 KB · Đọc: 6
Nó bị như ảnh kia bạn vì nó nhiều file quá không chứa hết được ký tự trong chỗ khoanh đỏ trong ảnh ý bạn

Code cập nhật với tính năng chọn Folder chứa các file CSV cần gộp.
- Thêm một hàm ListFiles() trả về mảng tên các file cần gộp trong Folder đã chọn.
- Vẫn giữ nguyên hàm MergeCSVFiles() của anh @HieuCD .


Mã:
Sub GopFiles()

    Dim newFileName As String

    On Error GoTo ErrHandler
 
    Application.ScreenUpdating = False
 
    newFileName = ThisWorkbook.Path & "\MergedCSVFiles.csv"
    If MergeCSVFiles(ListFiles, newFileName, True, False) = False Then Exit Sub
 
    MsgBox "Xong."
 
    'Mo file
    CreateObject("Shell.Application").Open (newFileName)

ExitHandler:
    Application.ScreenUpdating = True
    Exit Sub

ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
End Sub

Function MergeCSVFiles(fileNames() As Variant, newFileName As String, Optional headers As Boolean = True, Optional addNewLine As Boolean = False) As Boolean
'# fileNames:   Danh sách tên file - array
'# newFilename: Tên file moi sau khi merge
'# headers:     Du Lieu Co Dong Tieu De
'# addNewLine:  Có thêm dòng moi cuoi file hay không

    Dim fileName As Variant, textData As String, fileNo As Long, result As String
    Dim addLastLine As Boolean, RefirstHeader As Boolean, chCode As Long

    'Kiem tra array xem co chon file de gop khong.
    If UBound(fileNames) = 0 Then
        MergeCSVFiles = False
        Exit Function
    End If
 
    For Each fileName In fileNames
        fileNo = FreeFile
        Open fileName For Input As #fileNo
        textData = Input$(LOF(fileNo), fileNo)  'Doc toan bo File
        Close #fileNo
        chCode = Asc(Right(textData, 1))
        If chCode <> 10 And chCode <> 13 Then textData = textData & vbNewLine
        If addLastLine Then result = result & vbNewLine
        If RefirstHeader Then
            result = result & Right(textData, Len(textData) - InStr(textData, vbNewLine) - 1)
        Else
            result = result & textData
        End If
        If headers Then RefirstHeader = True
        If addNewLine Then addLastLine = True
    Next fileName
    fileNo = FreeFile
    Open newFileName For Output As #fileNo
    Print #fileNo, result
    Close #fileNo
 
    MergeCSVFiles = True
 
End Function

Function ListFiles() As Variant()     'Array of Files
    Dim oFSO As Object, oFolder As Object, oFile As Object, arFiles()
    Dim i As Long, selectedFolder As String
   
    'On Error GoTo ErrHandler
   
    With Application.FileDialog(4) '(msoFileDialogFolderPicker)
        .Title = "Chon Folder chua file CSV can gop"
        .Show
        If .SelectedItems.Count = 0 Then
            ReDim ListFiles(0)
            GoTo ExitHandler
        End If
        selectedFolder = .SelectedItems(1)
    End With
   
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oFolder = oFSO.GetFolder(selectedFolder)
   
    If oFolder.Files.Count = 0 Then
        MsgBox "Folder khong co file."
        ReDim ListFiles(0)
        GoTo ExitHandler
    End If
   
    ReDim arFiles(1 To oFolder.Files.Count)
    i = 0
    For Each oFile In oFolder.Files
        If Right(oFile, 4) = ".csv" Then    'Chi lay file CSV
            i = i + 1
            arFiles(i) = oFile
        End If
    Next
    If i = 0 Then   'Khong co file CSV
        ReDim ListFiles(0)
        MsgBox "Folder khong co chua file CSV", vbExclamation, "Thông báo"
    Else
        ReDim Preserve arFiles(1 To i)
        ListFiles = arFiles()
    End If
   
ExitHandler:
    Set oFSO = Nothing
    Set oFolder = Nothing
    Set oFile = Nothing
    Erase arFiles
    Exit Function

ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
   
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
rảnh tôi mới thử viết trên Delphi gộp 3 file x 150 MB/1 file thấy chạy tạm ok có nhanh hơn VBA chút ... còn gộp khoãng 10 file lên tầm 1GB thì chưa biết

gợi ý cho ai đó viết lại trên VBA chơi cho vui

1/ viết 1 hàm duyệt File CSV trong folder bao gồm đệ quy hay ko đệ quy folder

2/ khi mục số 1 xong gán nó lên CheckListBox của Form VBA

3/ khi mục 2 xong tích cho các file theo Path trên mục số 2

4/ chạy code duyệt file mục số 3 xong gộp file csv và thưởng thức :p

rất dơn giản thôi ... rảnh cho vào AddIns COM Delphi với tên mới bao chọn bộ Ofiice tên AddIns là OfficeTools ( Excel, Word,...+++++++++++++++++) tất cả trong 1 AddIns duy nhất
 
Upvote 0
Code cập nhật với tính năng chọn Folder chứa các file CSV cần gộp.
- Thêm một hàm ListFiles() trả về mảng tên các file cần gộp trong Folder đã chọn.
- Vẫn giữ nguyên hàm MergeCSVFiles() của anh @HieuCD .


Mã:
Sub GopFiles()

    Dim newFileName As String

    On Error GoTo ErrHandler
 
    Application.ScreenUpdating = False
 
    newFileName = ThisWorkbook.Path & "\MergedCSVFiles.csv"
    If MergeCSVFiles(ListFiles, newFileName, True, False) = False Then Exit Sub
 
    MsgBox "Xong."
 
    'Mo file
    CreateObject("Shell.Application").Open (newFileName)

ExitHandler:
    Application.ScreenUpdating = True
    Exit Sub

ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
End Sub

Function MergeCSVFiles(fileNames() As Variant, newFileName As String, Optional headers As Boolean = True, Optional addNewLine As Boolean = False) As Boolean
'# fileNames:   Danh sách tên file - array
'# newFilename: Tên file moi sau khi merge
'# headers:     Du Lieu Co Dong Tieu De
'# addNewLine:  Có thêm dòng moi cuoi file hay không

    Dim fileName As Variant, textData As String, fileNo As Long, result As String
    Dim addLastLine As Boolean, RefirstHeader As Boolean, chCode As Long

    'Kiem tra array xem co chon file de gop khong.
    If UBound(fileNames) = 0 Then
        MergeCSVFiles = False
        Exit Function
    End If
 
    For Each fileName In fileNames
        fileNo = FreeFile
        Open fileName For Input As #fileNo
        textData = Input$(LOF(fileNo), fileNo)  'Doc toan bo File
        Close #fileNo
        chCode = Asc(Right(textData, 1))
        If chCode <> 10 And chCode <> 13 Then textData = textData & vbNewLine
        If addLastLine Then result = result & vbNewLine
        If RefirstHeader Then
            result = result & Right(textData, Len(textData) - InStr(textData, vbNewLine) - 1)
        Else
            result = result & textData
        End If
        If headers Then RefirstHeader = True
        If addNewLine Then addLastLine = True
    Next fileName
    fileNo = FreeFile
    Open newFileName For Output As #fileNo
    Print #fileNo, result
    Close #fileNo
 
    MergeCSVFiles = True
 
End Function

Function ListFiles() As Variant()     'Array of Files
    Dim oFSO As Object, oFolder As Object, oFile As Object, arFiles()
    Dim i As Long, selectedFolder As String
   
    'On Error GoTo ErrHandler
   
    With Application.FileDialog(4) '(msoFileDialogFolderPicker)
        .Title = "Chon Folder chua file CSV can gop"
        .Show
        If .SelectedItems.Count = 0 Then
            ReDim ListFiles(0)
            GoTo ExitHandler
        End If
        selectedFolder = .SelectedItems(1)
    End With
   
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oFolder = oFSO.GetFolder(selectedFolder)
   
    If oFolder.Files.Count = 0 Then
        MsgBox "Folder khong co file."
        ReDim ListFiles(0)
        GoTo ExitHandler
    End If
   
    ReDim arFiles(1 To oFolder.Files.Count)
    i = 0
    For Each oFile In oFolder.Files
        If Right(oFile, 4) = ".csv" Then    'Chi lay file CSV
            i = i + 1
            arFiles(i) = oFile
        End If
    Next
    If i = 0 Then   'Khong co file CSV
        ReDim ListFiles(0)
        MsgBox "Folder khong co chua file CSV", vbExclamation, "Thông báo"
    Else
        ReDim Preserve arFiles(1 To i)
        ListFiles = arFiles()
    End If
   
ExitHandler:
    Set oFSO = Nothing
    Set oFolder = Nothing
    Set oFile = Nothing
    Erase arFiles
    Exit Function

ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
   
End Function
Cảm ơn bạn rất là nhiều.... Code chạy rất tốt ạ
Bài đã được tự động gộp:

rảnh tôi mới thử viết trên Delphi gộp 3 file x 150 MB/1 file thấy chạy tạm ok có nhanh hơn VBA chút ... còn gộp khoãng 10 file lên tầm 1GB thì chưa biết

gợi ý cho ai đó viết lại trên VBA chơi cho vui

1/ viết 1 hàm duyệt File CSV trong folder bao gồm đệ quy hay ko đệ quy folder

2/ khi mục số 1 xong gán nó lên CheckListBox của Form VBA

3/ khi mục 2 xong tích cho các file theo Path trên mục số 2

4/ chạy code duyệt file mục số 3 xong gộp file csv và thưởng thức :p

rất dơn giản thôi ... rảnh cho vào AddIns COM Delphi với tên mới bao chọn bộ Ofiice tên AddIns là OfficeTools ( Excel, Word,...+++++++++++++++++) tất cả trong 1 AddIns duy nhất
Khi nào bạn làm vậy. Tôi mong chờ điều này rất là lâu r
 
Upvote 0
Khi nào bạn làm vậy. Tôi mong chờ điều này rất là lâu r
code xong rồi chạy ok ... khi nào gió lên thì thuyền ra khơi thôi

chơi cho vui thôi còn không mong cầu điều gì khác ... còn ai có lòng kiên nhẫn cứ ôm cây đợi thỏ vây .............................. :p
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom