Đăng ký học Excel và VBA cùng GPE tháng 11 - TPHCM

Mua sách "VBA trong Excel - Cải thiện và tăng tốc" tái bản

Nối nhiều file excel thành 1 file excel

Thảo luận trong 'Lập Trình với Excel' bắt đầu bởi toikhongvao, 18 Tháng một 2010.

  1. toikhongvao

    toikhongvao Thành viên mới

    Mô tả công việc tự động là thế này.
    Chuẩn bị: Đưa tất cả cá file excel vào cùng 1 folder, tên file theo thứ tự 1,2,3,.... các File excel có cùng cấu trúc, cùng số cột, số dòng khác nhau.
    Chạy macro:
    Tạo một file excel mới tên tonghop. nằm cùng folder với các file trên và lấy dữ liệu từ các file trong folder nối lại với nhau.
    Xong
    Xin giúp mình, THX
     
  2. tutientrung

    tutientrung Thành viên hoạt động

    Bạn mà không đưa file mô tả lên đây thì tôi nghĩ là chờ đến tết Công gô mới có người giúp bạn được.
     
  3. hopthuhuy

    hopthuhuy Thành viên mới

    Bạn toikhongvao có cùng ý tưởng với mình. Để mình giải thích rõ thêm:

    Giả sử mình có nhiều file báo cáo lỗi theo ngày của nhiều dây chuyền (File được nhập hàng ngày bằng tay). Giờ mình muốn làm một file báo cáo tháng tổng hợp từ các báo cáo ngày (File chạy tự động)
    - Giả đã có file lỗi của 3 dây chuyền trong 2 ngày 19/01 & 20/01 (daily report)
    - Mình muốn cập nhập tự động vào file báo cáo tháng (monthly report): theo từng dây chuyền, và theo từng ngày.

    Yêu cầu : - Hiện thị các hộp thoại để cho người tổng hợp file monthly report chọn file cần cập nhập hoặc dây chuyền cần cập nhập
    - Nếu tên lỗi đã có trong báo cáo tháng thì tự điền số lượng lỗi (nếu chưa thì chèn thêm vào cột tên lỗi và điền số lượng lỗi theo ngày tương ứng)

    Vì đây là file tương đối khó +-+-+-+ +-+-+-+ +-+-+-+ nên mong mọi người giúp đỡ. @$@!^%@$@!^%@$@!^%

    Mình xin cảm ơn. -=.,,
     

    Các file đính kèm:

    Lần chỉnh sửa cuối: 21 Tháng một 2010
  4. toikhongvao

    toikhongvao Thành viên mới

    chỉ đơn giản là nối nhiều sheet nằm ở nhiều file thành 1 sheet nằm ở 1 file mới thôi.
    Xin lỗi, mình không up file lên được vì máy nội bộ không thể sao chép dữ liệu ra ngoài.
    Mình chỉ cần code tổng quát cũng được, tại xưa giờ mình không để ý mấy điều hay dạng macro trong excel.
    THX
     
  5. nghiaphuc

    nghiaphuc Hoàng Nghĩa Phúc Staff Member

    Bạn tham khảo file đính kèm nhé. Ở đây, mỗi file có 3 sheet, nếu bạn muốn thêm sheet thì phải thêm vào các file như nhau (số lượng sheet, tên sheet, số cột trong mỗi sheet).
    Góp ý một xíu: Nếu không đưa dữ liệu thực của bạn được (vì một lí do tế nhị nào đó) thì bạn nên giả lập các file tương tự. Bởi vì chính bạn biết rõ nhất là bạn cần gì và nếu có file minh họa thì người khác sẽ đỡ mất công hơn (đôi khi công này là vô ích vì không đúng ý người hỏi).
    Chúc thành công!
     

    Các file đính kèm:

    Lần chỉnh sửa cuối: 19 Tháng một 2010
  6. Hai Lúa Miền Tây

    Hai Lúa Miền Tây Chuyên gia GPE Staff Member Super Moderator

    Dùng VBA kết hợp với PivotTable để làm bài tập này.
    Bạn xem file đính kèm nha
     

    Các file đính kèm:

  7. toikhongvao

    toikhongvao Thành viên mới

    @nghiaphuc: cám ơn bạn rất nhiều, cũng gần đúng đúng yêu cầu của mình.
    Mình xin lấy file ví dụ của bạn để làm ví dụ của mình.
    Xin lỗi vì chức năng upload trên forum xài không được nên mình up qua link này.
    http://www.mediafire.com/?3njgdqzttnx
    Yêu cầu của mình là từ 3 file, chạy macro hay gì cũng được để tạo 1 file mới tên tổng hợp với dữ liệu lấy từ các file trên nối lại với nhau, sau đó thêm vào một cột mới để phân biệt dữ liệu của file nào trong bảng tổng hợp. (không cần tạo sheet cho mỗi dữ liệu trong file tổng hợp vì sẽ gây khó khăn nếu muốn dùng pivottable)
    THX. Xin giúp giùm
     
  8. hopthuhuy

    hopthuhuy Thành viên mới

    Gửi bạn Domfootwear,

    Cám ơn bạn đã làm giúp mình.

    Mình thử lại thì thấy sau khi bấm nút lệnh, sheet tonghop vẫn trắng
    (chưa lấy dữ liệu được từ các sheet khác, của các file khác)
    Mình đã thử copy & paste để tiêu đề trùng nhau nhưng cũng vẫn không được.

    Bạn xem lại giúp mình nhé.

    Mình cũng muốn chọn từng file để cập nhập thay vì chọn cả folder để tránh việc
    phải cập nhập lại. Mong bạn kiểm tra lại và hướng dẫn thêm giúp mình.

    Xin cảm ơn.@$@!^%@$@!^%@$@!^%
     
  9. nghiaphuc

    nghiaphuc Hoàng Nghĩa Phúc Staff Member

    Vậy thì ở mỗi file, bạn dán một sub như vầy nè:
    PHP:
    Sub Ghi_DL()
        
    Dim FileS As FileSearch
        Dim Wb
    Wb1 As Workbook
        Dim FPath 
    As String
        Dim F 
    As Variant
     
        Application
    .ScreenUpdating False
        Set Wb 
    ThisWorkbookFPath Wb.Path
        Set FileS 
    Application.FileSearch
        With FileS
            
    .NewSearch
            
    .Filename "*.xls"
            
    .LookIn FPath
            
    .SearchSubFolders False
            
    .Execute
        End With
        Set Wb1 
    Workbooks.Add 'Them mot Workbook moi (file tong hop)'
        'Copy du lieu cua file hien hanh va dan vao file tong hop'
        
    Wb.Activate
        ActiveSheet
    .UsedRange.Copy
        Wb1
    .Activate
        ActiveSheet
    .[A1].PasteSpecial Paste:=xlPasteAll
        
    [IV1].End(xlToLeft).Offset(01) = "File"
        
    Selection.Offset(1Selection.Columns.Count).Resize(Selection.Rows.Count 11).Value Left(Wb.NameLen(Wb.Name) - 4)
        
    'Copy du lieu cua cac file con lai va dan vao file tong hop'
        
    For Each F In Application.FileSearch.FoundFiles
            
    If ThisWorkbook.FullName Then GoTo NextFile
            Workbooks
    .Open F
            Set Wb 
    Workbooks(Replace(FFPath "\", ""))
            Wb.Activate
            ActiveSheet.UsedRange.Offset(1).Resize(ActiveSheet.UsedRange.Rows.Count - 1).Copy
            Wb1.Activate
            ActiveSheet.UsedRange.Offset(ActiveSheet.UsedRange.Rows.Count).PasteSpecial Paste:=xlPasteAll
            Selection.Offset(0, Selection.Columns.Count).Resize(Selection.Rows.Count, 1).Value = Left(Wb.Name, Len(Wb.Name) - 4)
            Wb.Close False
    NextFile:
        Next F
        Wb1.SaveAs FPath & "
    \Tong hop.xls" 'Luu file tong hop lai'
        Application.ScreenUpdating = True
    End Sub
    Như vầy thì bạn có thể tổng hợp dữ liệu từ 1 trong 3 file 1.xls, 2.xls, 3.xls. Kết quả sẽ được lưu vào file Tong hop.xls trong cùng thư mục với 3 file trên.
     

    Các file đính kèm:

  10. ducleminh

    ducleminh Thành viên chính thức

    Bạn có thể vui lòng giải thích về đoạn code này được ko?
    (vd như tác dụng và ý nghĩa của từng đoạn trong đó ....)
    Vì mình ko có kiến thức về code nhiều, nên mình muốn hiểu để áp dụng cho các file của mình, thanks bạn nhiều
     
  11. nghiaphuc

    nghiaphuc Hoàng Nghĩa Phúc Staff Member

    Nó là như vầy nè:
    PHP:
    Sub Ghi_DL()
        
    Dim FileS As FileSearch
        Dim Wb
    Wb1 As Workbook
        Dim FPath 
    As String
        Dim F 
    As Variant
     
        Application
    .ScreenUpdating False 'Không cho hiện sự thay đổi trên màn hình
        Set Wb = ThisWorkbook '
    Dat bien Wb la workbook dang mo (VDfile 1.xlsfile 2.xls,...)
        
    FPath Wb.Path 'Gan duong dan cua workbook dang mo cho bien FPath
        Set FileS = Application.FileSearch
        With FileS
            .NewSearch '
    Thiet lap mot phien tim kiem moi
            
    .Filename "*.xls" 'Tim cac file excel
            .LookIn = FPath '
    Tim trong thu muc FPath (co duong dan da gan o tren)
            .
    SearchSubFolders False 'Khong tim trong thu muc con
            .Execute '
    Thuc thi lenh tim kiem
        End With
        Set Wb1 
    Workbooks.Add 'Them mot Workbook moi (file tong hop)'
        'Bat dau Copy du lieu cua file hien hanh va dan vao file tong hop'
        
    Wb.Activate 'Chon workbook hien hanh la Wb (da gan o tren)
        ActiveSheet.UsedRange.Copy '
    Copy du lieu tai sheet hien hanh
        Wb1
    .Activate 'Chuyen sang file tong hop
        ActiveSheet.[A1].PasteSpecial Paste:=xlPasteAll '
    Dan du lieu da sao chep o tren
        
    [IV1].End(xlToLeft).Offset(01) = "File" 'Gan tieu de cho cot cuoi
        Selection.Offset(1, Selection.Columns.Count).Resize(Selection.Rows.Count - 1, 1).Value = Left(Wb.Name, Len(Wb.Name) - 4) '
    Ghi ten file vao cot cuoi cung trong bang
        
    'Ket thuc copy du lieu cua file hien hanh vao file tong hop
        '
    Bat dau Copy du lieu cua cac file con lai va dan vao file tong hop'
        For Each F In Application.FileSearch.FoundFiles '
    Duyet qua tat ca cac file tim thay o tren
            
    If ThisWorkbook.FullName Then GoTo NextFile 'Neu F la file hien hanh thi bo qua (vi da copy roi)
            Workbooks.Open F '
    Mo file F
            Set Wb 
    Workbooks(Replace(FFPath "\", "")) 'Dat bien Wb la workbook F (sau khi da bo qua duong dan)
            Wb.Activate 'Doan lenh nay tuong tu ben tren (da giai thich)
            ActiveSheet.UsedRange.Offset(1).Resize(ActiveSheet.UsedRange.Rows.Count - 1).Copy
            Wb1.Activate
            ActiveSheet.UsedRange.Offset(ActiveSheet.UsedRange.Rows.Count).PasteSpecial Paste:=xlPasteAll
            Selection.Offset(0, Selection.Columns.Count).Resize(Selection.Rows.Count, 1).Value = Left(Wb.Name, Len(Wb.Name) - 4)
            Wb.Close False 'Dong file F lai ma khong luu
    NextFile:
        Next F 'Xet file ke tiep trong cac file da tim thay
        Wb1.SaveAs FPath & "
    Tong hop.xls" 'Luu file tong hop lai'
        Application.ScreenUpdating = True 'Cho hiện lại sự thay đổi trên màn hình
    End Sub
     
  12. titanic20072007

    titanic20072007 Thành viên hoạt động

    Mình thấy bạn làm rất ổn nhưng mình có một câu hỏi: Nếu trong các tệp dữ liệu đó có nhiều hơn một sheet thì làm thế nào để chỉ cập nhật dữ liệu từ sheet cô định?
     
  13. nghiaphuc

    nghiaphuc Hoàng Nghĩa Phúc Staff Member

    Giả sử bạn cần lấy dữ liệu từ Sheet "abc". Khi đó, bạn thêm câu lệnh
    PHP:
    Sheets("abc").Select
    vào sau 2 câu lệnh
    PHP:
    Wb.Activate
    (1 câu ngoài For, 1 câu trong For)
     
  14. ducleminh

    ducleminh Thành viên chính thức

    Mình loay hoay hoài mà vẫn chưa làm được, cứ báo lỗi hoài
    Phiền bạn viết giùm mình code để nối 3 file này lại nha !
     

    Các file đính kèm:

  15. ttranhnn

    ttranhnn Thành viên mới

    nhân tiện em nhờ các cao thủ chỉ giáo hộ em, em nghĩ mãi vẫn chưa ra
    em có 3 file cân đối vcb,vib,mhb em muốn tổng hợp thành các chỉ tiêu như trong file taocdketoan thì phải làm sao ạ
    đây là link của 4 file trên:http://www.mediafire.com/?kzdimcmzzle
    mong các bác giúp em với ạ.Thanks
     
  16. ttranhnn

    ttranhnn Thành viên mới

    cả nhà help em với, em đang rất cần ạ

    Mã:
    [COLOR=#000000][COLOR=#007700]Private [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Long
    Sub GetData[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]FolderName [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]String[/COLOR][COLOR=#007700])
        [/COLOR][COLOR=#0000BB]Dim File [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Scripting[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]File[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]SubFolder [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Scripting[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Folder
        Dim ThisWb [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Workbook[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]FindWb [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Workbook
        
        Application[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]ScreenUpdating [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]False
        Set ThisWb [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]ThisWorkbook
        
        On Error Resume Next
        With [/COLOR][COLOR=#007700]New [/COLOR][COLOR=#0000BB]Scripting[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]FileSystemObject
            With [/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]GetFolder[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]FolderName[/COLOR][COLOR=#007700])
                For [/COLOR][COLOR=#0000BB]Each File In [/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Files
                    [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]InStr[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]File[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Name[/COLOR][COLOR=#007700], [/COLOR][COLOR=#DD0000]"xls"[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]Then
                        Set FindWb [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Workbooks[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Open[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]File[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Path[/COLOR][COLOR=#007700])
                        [/COLOR][COLOR=#0000BB]With ThisWb[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Sheets[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700])
                            .[/COLOR][COLOR=#0000BB]Range[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"A" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Value [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]FindWb[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Name
                            [/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Range[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"B" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Value [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]FindWb[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Sheets[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Range[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"A1"[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Value
                        End With
                        FindWb[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Close [/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]False[/COLOR][COLOR=#007700])
                        [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000BB]1
                    End [/COLOR][COLOR=#007700]If
                [/COLOR][COLOR=#0000BB]Next File
                [/COLOR][COLOR=#007700]For [/COLOR][COLOR=#0000BB]Each SubFolder In [/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]SubFolders
                    Call GetData[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]SubFolder[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Path[/COLOR][COLOR=#007700])
                [/COLOR][COLOR=#0000BB]Next SubFolder
            End With
        End With
    End Sub
    
    Sub Run[/COLOR][COLOR=#007700]()
        [/COLOR][COLOR=#0000BB]Dim FolderName [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]String
        i [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]1
        FolderName [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]InputBox[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"Nhap duong dan toi thu muc chua cac file Excel can lay du lieu : "[/COLOR][COLOR=#007700])
        [/COLOR][COLOR=#0000BB]Call GetData[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]FolderName[/COLOR][COLOR=#007700])
    [/COLOR][COLOR=#0000BB]End Sub  
    
    em mới học VBA các bác giải thích hộ cho em đoạn code trên với ạ, em xin cảm ơn
    [/COLOR][/COLOR]

    Lưu ý: nhớ đưa vào tab [ code]...đoạn mã...[ /code]
     
    Chỉnh sửa lần cuối bởi điều hành viên: 10 Tháng tư 2010
  17. hquang

    hquang Thành viên mới

    Các bạn ơi! Mình có một file bảng lương và phiếu lương. Mình muốn dữ liệu của Bảng lương và Phiếu lương thống nhất với nhau. Nghĩa là khi làm xong bảng lương thì phiếu lương cũng xong luôn thì phải làm thế nào? Giúp mình với! Cảm ơn thật nhiều!
     
  18. levanduyet

    levanduyet Thành viên danh dự

    Các bước thực hiện:

    _ Xuất các tập tin cần lấy dữ liệu vào một thư mục.
    _ Mở tập tin CombineFiles.xls
    _ Thực hiện thủ tục: MergeFiles
    Vậy là xong.

    Xem tập tin đính kèm tôi đã làm cho bạn rồi.

    Lê Văn Duyệt

    Ps: Hôm nào lên Bắc Giang chơi mới được.
     

    Các file đính kèm:

  19. thanhhai166

    thanhhai166 Thành viên mới

    Xin được giúp đỡ !

    Vào đọc bài này minh thấy rất hay và hữu ích đối với công việc của mình. Tuy nhiên mình chưa có điều kiện để tìm hiểu về VBA. Nhờ các cao thủ có thể viết cho mình đoạn code trong file tổng họp để tổng hợp các file trong tệp đính kèm được không . Mình xin cảm ơn !
     

    Các file đính kèm:

    Lần chỉnh sửa cuối: 18 Tháng tư 2010
  20. khanhvc2003

    khanhvc2003 Thành viên mới

    Tổng hợp dữ liệu nhiều file thành 1 file

    Chà bài viết hay thiệt.
    Em cũng trục trẹt về vấn đề tổng hợp dữ liệu đây, mong rằng nghiaphuc giúp em vụ này.

    Em có rất nhiều file Excel xuất ra từ phần mềm HR mỗi file có 03 sheet với tên Sheet1, Sheet2, Sheet3 chỉ có Sheet1 là có dữ liệu thôi.
    Mục đích là copy nội dung Sheet1 của tất cả các file rồi dán vào file tổng hợp với tên của Sheet là tên của các file tương ứng.

    Cảm ơn trước.
     

Chia sẻ trang này