Tổng hợp dữ liệu từ nhiều file tsv hoặc excel thành 1 file theo trình tự

Liên hệ QC

tunglinhmot

Thành viên chính thức
Tham gia
17/5/17
Bài viết
58
Được thích
6
Giới tính
Nam
Mình có các file .tsv hoặc excel đánh số theo tên như là file_1, file_2, file_3... (như trong đính kèm)
Mình muốn tổng hợp dữ liệu trong các file 1,2,3... đó thành 1 file duy nhất bắt đầu từ file_1 cho đến file cuối cùng (định dạng là .tsv hoặc xlsx đều được).
Và file sau khi tổng hợp có nội dung giống trong file_tonghop.xlsx . Trong file tổng hợp này chứa tất cả nội dung của các file được đánh số 1,2,3... kia và giữ nguyên được cái Title của file_1.
Có ai biết giúp mình với ạ, mình rất cảm ơn.
 

File đính kèm

  • file_1.xlsx
    11.4 KB · Đọc: 6
  • file_2.xlsx
    11.1 KB · Đọc: 4
  • file_3.xlsx
    11.1 KB · Đọc: 3
  • file_tonghop.xlsx
    14.6 KB · Đọc: 10
Hỏi đúng 1 câu:
Nếu có đáp án đúng cho bài trên thì có hỏi thêm gì không?
 
Upvote 0
Nếu có thể chạy ra được như file tổng hợp thì mình cũng không còn gì để hỏi thật mà. Có ai giúp mình giải bài này được không ạ.
 
Upvote 0
Mình đã xem qua một bài trong link http://www.giaiphapexcel.com/dienda...ile-excel-vào-1-file-không-cần-mở-file.84529/
Tuy nhiên cái này chỉ tổng hợp được các file có cấu trúc giống nhau, trường hợp của mình khác ở chỗ là tuy các file số 2, 3 có cấu trúc giống nhau nhưng file số 1 lại có phần title (từ dòng 1 đến dòng 15), và các file 2, 3 nối tiếp vào đấy (không có phần title). Có cách nào tổng hợp tất cả vào 1 file mà vẫn giữ nguyên phần title của file 1 không ạ ?
Mong mọi người giúp đỡ với.
 
Upvote 0
Mình đã thử và nó đã chạy đúng như yêu cầu. Mình cảm ơn bạn rất nhiều.%$$
 
Upvote 0

Bạn ơi, cho mình hỏi lại một chút với, có thể mình hỏi hơi ngu nhưng mình đã cố thử chỉnh lại code rồi nhưng vẫn không được.

Ngoài định dạng xlsx thì mình còn muốn tổng hợp các file đầu vào có định dạng .tsv như lúc đầu bài toán nói ( Ví dụ file_1.tsv , file_2.tsv … ). Mình đã thử ở nhà với file xlsx và chạy được nên mình cứ nghĩ là với file tsv hay txt thì chỉ cần chỉnh lại định dạng trong code là được.

( Mình vẫn làm thế với câu lệnh kiểu như : “filePath = Application.GetOpenFilename("Excel Files, *.xls ; *.xlsx ; *.tsv ", 2, " Chon file MPL(.tsv) ", True) “

Tuy nhiên lần này khi mình thử chuyển định dạng file từ câu lệnh Const extFile As String = "xlsx" thành Const extFile As String = "tsv" thì nó chạy lại bị lỗi ra toàn những cái như là :

#REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF!
#REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF! #REF!

Xin lỗi vì phải phiền bạn lần nữa nhưng bạn có thể xem lại giúp mình được không ạ. Tốt nhất là có câu lệnh nào kiểu như Application.GetOpenFilename để mình có thể đặt nhiều định dạng file cần chọn cùng lúc trong đó, không phải chỉnh lại code khi định dạng file thay đổi.
 
Upvote 0
có thể xem lại giúp mình được không
Chắc chắn là không!
Không có gì nữa đâu bạn à. Đây là cái yêu cầu sau cùng của bài toán rồi :D
đã thử và nó đã chạy đúng như yêu cầu.
---
định dạng là .tsv hoặc xlsx đều được
Chỗ màu xanh bài #1 không có đính kèm file nào.

(nhớn rồi thì nói trước sau nhất quán chứ) ;)
 
Upvote 0
Chắc chắn là không!


---

Chỗ màu xanh bài #1 không có đính kèm file nào.

(nhớn rồi thì nói trước sau nhất quán chứ) ;)


.tsv hoặc xlsx đều được tức là có thể chạy được cho cả 2 cái định dạng đó, ban đầu mình nghĩ có thể thay đổi tùy ý định dạng trong code là sẽ ghép được nhưng lúc thử chuyển file ban đầu sang dạng .tsv lại không được. :( Vậy để mình thử mò tiếp xem có mở rộng được cả sang định dạng tsv hay txt không.
 
Upvote 0
Mã:
Const wsName As String = "$Name#Temp$"
Const sName As String = "Sheet1"
Const maxR As Long = 10000
Dim arPath()
Dim arPath2()

Dim ArrType As Variant

Dim member_Book As Workbook


Sub Main()
    SpeedOn True
  
    Const extFile As String = "tsv,xlsx,xls,xlsm"
  
    Dim pthFolder As String, Rng As Range, ws As Worksheet, i As Long, maxC As Long, arr
  
    ''Xoa du lieu o sheet tong hop:
    Sheet1.UsedRange.ClearContents
  
    ArrType = Split(extFile, ",")
  
    ''Them sheet tam:
    AddTempSheet
    Set ws = Sheets(wsName)
  
    ''Lay duong dan thu muc nguon:
    pthFolder = GetPathFolder("")
    If Len(pthFolder) = 0 Then GoTo EXIT_MAIN
  
    ''Tao dan cong thuc, ten files:
    CreateArrayPaths pthFolder, extFile
  
    If UBound(arPath) = 0 Then GoTo EXIT_MAIN
    ''Lay du lieu tu sheet tam sang sheet tong hop:
  
  
    Set Rng = ws.Range("A1:X" & maxR)
    maxC = Rng.Columns.Count
    For i = 1 To UBound(arPath)
        CopyDataFiles Rng, sName, i, arr
        CopyData Sheet1, arr, maxC
    Next i
  
  
EXIT_MAIN:
   ''Xoa sheet tam:
    ws.Delete

    Erase arr: Erase arPath
  
    SpeedOn False
End Sub

Sub CopyData(ByVal ws As Worksheet, ByVal arr, ByVal maxC As Long)
    Dim lRow As Long, eRow As Long
    lRow = UBound(arr, 1)
    With ws
        eRow = .Range("A" & Rows.Count).End(xlUp).Row + 1
        .Range("A" & eRow).Resize(lRow, maxC).Value = arr
    End With
End Sub

Rem L窕 du li黏 v瀰 sheet temp:
Sub CopyDataFiles(ByVal Rng As Range, ByVal sName As String, ByVal IndxFile As Long, ByRef arr)
 
     Set member_Book = Workbooks.Open(arPath2(IndxFile))
     Range("A1:X" & maxR).Copy
     ThisWorkbook.Activate
  
     ActiveSheet.Paste
  
     With Rng
       arr = .Resize(.Cells(.Rows.Count, 1).End(xlUp).Row).Value
       .ClearContents
    End With
  
    member_Book.Close False
  
End Sub

Function GetPathFolder(ByVal pathFolder As String) As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Select a Folder"
        .AllowMultiSelect = False
        .InitialFileName = pathFolder
        If .Show Then GetPathFolder = .SelectedItems(1)
    End With
End Function

Rem L窕 danh s當h duong d穗 files c穗 tg hop:
Sub CreateArrayPaths(ByVal pathFolder As String, ByVal extFile As String)
    Dim FSo As Object, objFolder As Object, objFile As Object, i As Long, wbName As String, iName As String
    Set FSo = CreateObject("Scripting.FileSystemObject")
    If pathFolder = "" Then Exit Sub
    Set objFolder = FSo.GetFolder(pathFolder)
    extFile = VBA.UCase(extFile)
    wbName = ThisWorkbook.Name
    For Each objFile In objFolder.Files
        If CheckFileType(FSo.GetExtensionName(objFile)) Then
            iName = objFile.Name
            If iName <> wbName Then
                i = i + 1
                ReDim Preserve arPath(1 To i)
                ReDim Preserve arPath2(1 To i)
              
                arPath(i) = "'" & pathFolder & "\[" & objFile.Name & "]"
                arPath2(i) = pathFolder & "\" & objFile.Name
              
            End If
         End If
    Next objFile
  
End Sub

Private Sub AddTempSheet()
    On Error Resume Next
    If Len(Sheets(wsName)) > 0 Then
        Sheets(wsName).Delete
        Sheets.Add After:=Sheets(1)
        Sheets(2).Name = wsName
    Else
        Sheets.Add After:=Sheets(1)
        Sheets(2).Name = wsName
    End If
End Sub

Sub SpeedOn(ByVal sType As Boolean)
With Application
    If sType = True Then
        .ScreenUpdating = False
        .DisplayAlerts = False
    Else
        .ScreenUpdating = True
        .DisplayAlerts = True
    End If
End With
End Sub

Function CheckFileType(Ftype As String) As Boolean
  CheckFileType = False
  For i = 0 To UBound(ArrType) - 1
    If UCase(Ftype) Like UCase(ArrType(i)) Then
       CheckFileType = True
       Exit Function
    End If
  Next i
 
 
End Function

Được rồi bạn à, bây giờ nó có thể chạy được cho cả các định dạng khác như tsv, xls… nữa. Mình up lên có thể có bạn nào cần có thể dùng luôn. :D
 
Upvote 0
Web KT
Back
Top Bottom