Xin hỏi cách tổng hợp nhiều file xlsm vào 1 file xlsx duy nhất

Liên hệ QC

blackcucu

Thành viên mới
Tham gia
18/5/16
Bài viết
25
Được thích
0
Giới tính
Nam
Xin hỏi các anh chị là có thể tổng hợp nhiều file xlsm vào 1 file xlsx duy nhất bằng cách sử VBA excel không ạ?
Nếu có xin cho em xin vài dòng code này. Em có nhiều file A.xlsm, B.xlsm... Trong đó em muốn tổng hợp dữ liệu các sheet2 của các file A.xlsm, B.xlsm vào 1 file excel duy nhất là tonghop.xlsx

Xin cảm ơn.
 
Lần chỉnh sửa cuối:
Em gởi file lên đây. Mọi người có ai xem hộ giúp em. Các file cần lấy data là sheet2 của 001.xlsm, 002.xlsm tổng hợp vào File tong hop. xlsm.
Em xin cảm ơn.
 

File đính kèm

  • 001.xlsm
    37.8 KB · Đọc: 6
  • 002.xlsm
    40.6 KB · Đọc: 7
  • FILE TONG HOP.xlsm
    25.4 KB · Đọc: 7
Em gởi file lên đây. Mọi người có ai xem hộ giúp em. Các file cần lấy data là sheet2 của 001.xlsm, 002.xlsm tổng hợp vào File tong hop. xlsm.
Em xin cảm ơn.
Bạn làm như sau nhé!
Bước 1: copy dòng tiêu đề vào FILE TONG HOP
Bước 2: copy code
Mã:
Sub get_data()
    Dim lr1 As Long, lr2 As Long
    Dim rng As Range
    Dim Item As Variant
    Dim wk As Workbook, ws As Worksheet, master As Worksheet
    
    Set master = ThisWorkbook.Sheets(1)
    
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .Filters.Add "Microsoft Excel Files", "*.xls*", 1
        If Not .Show = -1 Then
            MsgBox "Ban chua chon File", vbInformation, "----Mr.GPE----"
            Exit Sub
        End If
        For Each Item In .SelectedItems
            Set wk = Workbooks.Open(Item)
            For Each ws In wk.Sheets
                If ws.Name = "Manifest" Then
                    With ws
                        lr1 = .Range("B" & Rows.Count).End(xlUp).Row
                        Set rng = .Range("A3:L" & lr1)
                        With master
                            lr2 = .Range("B" & Rows.Count).End(xlUp).Row + 1
                            .Range("A" & lr2).Resize(lr1 - 2, 12) = rng.Value2
                        End With
                    End With
                End If
            Next ws
            wk.Close
        Next Item
    End With
End Sub
 
Bạn làm như sau nhé!
Bước 1: copy dòng tiêu đề vào FILE TONG HOP
Bước 2: copy code
Mã:
Sub get_data()
    Dim lr1 As Long, lr2 As Long
    Dim rng As Range
    Dim Item As Variant
    Dim wk As Workbook, ws As Worksheet, master As Worksheet
   
    Set master = ThisWorkbook.Sheets(1)
   
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .Filters.Add "Microsoft Excel Files", "*.xls*", 1
        If Not .Show = -1 Then
            MsgBox "Ban chua chon File", vbInformation, "----Mr.GPE----"
            Exit Sub
        End If
        For Each Item In .SelectedItems
            Set wk = Workbooks.Open(Item)
            For Each ws In wk.Sheets
                If ws.Name = "Manifest" Then
                    With ws
                        lr1 = .Range("B" & Rows.Count).End(xlUp).Row
                        Set rng = .Range("A3:L" & lr1)
                        With master
                            lr2 = .Range("B" & Rows.Count).End(xlUp).Row + 1
                            .Range("A" & lr2).Resize(lr1 - 2, 12) = rng.Value2
                        End With
                    End With
                End If
            Next ws
            wk.Close
        Next Item
    End With
End Sub

Anh cho em hỏi tí ạ:
- Bước 1: Copy dòng tiêu đề này ở đâu ạ?
- Bước 2: Copy hết code anh đưa ra vào module của FILE TONG HOP đúng không ạ?

Em xin cảm ơn.
 
Bạn làm như sau nhé!
Bước 1: copy dòng tiêu đề vào FILE TONG HOP
Bước 2: copy code
Mã:
Sub get_data()
    Dim lr1 As Long, lr2 As Long
    Dim rng As Range
    Dim Item As Variant
    Dim wk As Workbook, ws As Worksheet, master As Worksheet
   
    Set master = ThisWorkbook.Sheets(1)
   
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .Filters.Add "Microsoft Excel Files", "*.xls*", 1
        If Not .Show = -1 Then
            MsgBox "Ban chua chon File", vbInformation, "----Mr.GPE----"
            Exit Sub
        End If
        For Each Item In .SelectedItems
            Set wk = Workbooks.Open(Item)
            For Each ws In wk.Sheets
                If ws.Name = "Manifest" Then
                    With ws
                        lr1 = .Range("B" & Rows.Count).End(xlUp).Row
                        Set rng = .Range("A3:L" & lr1)
                        With master
                            lr2 = .Range("B" & Rows.Count).End(xlUp).Row + 1
                            .Range("A" & lr2).Resize(lr1 - 2, 12) = rng.Value2
                        End With
                    End With
                End If
            Next ws
            wk.Close
        Next Item
    End With
End Sub
Chào anh, code đã chạy anh ạ. Rất cảm ơn những chia sẻ của anh.
 
Bạn làm như sau nhé!
Bước 1: copy dòng tiêu đề vào FILE TONG HOP
Bước 2: copy code
Mã:
Sub get_data()
    Dim lr1 As Long, lr2 As Long
    Dim rng As Range
    Dim Item As Variant
    Dim wk As Workbook, ws As Worksheet, master As Worksheet
  
    Set master = ThisWorkbook.Sheets(1)
  
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .Filters.Add "Microsoft Excel Files", "*.xls*", 1
        If Not .Show = -1 Then
            MsgBox "Ban chua chon File", vbInformation, "----Mr.GPE----"
            Exit Sub
        End If
        For Each Item In .SelectedItems
            Set wk = Workbooks.Open(Item)
            For Each ws In wk.Sheets
                If ws.Name = "Manifest" Then
                    With ws
                        lr1 = .Range("B" & Rows.Count).End(xlUp).Row
                        Set rng = .Range("A3:L" & lr1)
                        With master
                            lr2 = .Range("B" & Rows.Count).End(xlUp).Row + 1
                            .Range("A" & lr2).Resize(lr1 - 2, 12) = rng.Value2
                        End With
                    End With
                End If
            Next ws
            wk.Close
        Next Item
    End With
End Sub

Anh cho em hỏi thêm tí là nếu là sheet3 hay sheet4 của file cần lấy dữ liệu thì mình chỉ thay đổi thông tin chỗ tên sheet "Manifest" thôi đúng không ạ? Vì khi em thay đổi lấy dữ liệu sheet "Packing List" thì trong FILE TONG HOP lại copy nhiều dòng của 1 sheet này.
Và trong File tổng hợp nếu em muốn paste dữ liệu bắt đầu từ B5 thì thế nào ạ?
Xin cảm ơn anh.


If ws.Name = "Manifest" Then
With ws
lr1 = .Range("B" & Rows.Count).End(xlUp).Row
Set rng = .Range("A3:L" & lr1)
With master
lr2 = .Range("B" & Rows.Count).End(xlUp).Row + 1
.Range("A" & lr2).Resize(lr1 - 2, 12) = rng.Value2
End With
End With
End If
 
Lần chỉnh sửa cuối:
Anh cho em hỏi thêm tí là nếu là sheet3 hay sheet4 của file cần lấy dữ liệu thì mình chỉ thay đổi thông tin chỗ tên sheet "Manifest" thôi đúng không ạ?
Và trong File tổng hợp nếu em muốn paste dữ liệu bắt đầu từ B5 thì thế nào ạ?
Xin cảm ơn anh.


If ws.Name = "Manifest" Then
With ws
lr1 = .Range("B" & Rows.Count).End(xlUp).Row
Set rng = .Range("A3:L" & lr1)
With master
lr2 = .Range("B" & Rows.Count).End(xlUp).Row + 1
.Range("A" & lr2).Resize(lr1 - 2, 12) = rng.Value2
End With
End With
End If
Đúng như ý bạn hiểu, bạn thay thông tin ws.Name là đc.
Nhưng nếu bạn cần lấy dữ liệu từ 2 sheet trở lên, bạn phải dùng code
Mã:
If ws.Name="Manifest"  Then
...
elseif ws.Name="..." then
...
end if
Hoặc nếu bạn chỉ loại trừ 1 sheet không lấy dữ liệu, bạn chỉ cần dùng code
Mã:
If ws.Name<>"..." Then
...
End If
Nếu bạn muốn copy dữ liệu từ ô B5, bạn điền 1 ký tự nào đó vào ô B4 để nhận biết vị trí bắt đầu copy nhé!
Copy xong có thể bỏ đi.
Mình cũng không giỏi món code này lắm đâu.
 
Đúng như ý bạn hiểu, bạn thay thông tin ws.Name là đc.
Nhưng nếu bạn cần lấy dữ liệu từ 2 sheet trở lên, bạn phải dùng code
Mã:
If ws.Name="Manifest"  Then
...
elseif ws.Name="..." then
...
end if
Hoặc nếu bạn chỉ loại trừ 1 sheet không lấy dữ liệu, bạn chỉ cần dùng code
Mã:
If ws.Name<>"..." Then
...
End If
Nếu bạn muốn copy dữ liệu từ ô B5, bạn điền 1 ký tự nào đó vào ô B4 để nhận biết vị trí bắt đầu copy nhé!
Copy xong có thể bỏ đi.
Mình cũng không giỏi món code này lắm đâu.
Dạ cám ơn anh. Vấn đề ở đây là khi em thay đổi sheet cần lấy dữ liệu ở đây là "Manifest" thành sheet "Packing List" thì trong File Tong Hop nó tự copy thêm 2 dòng nữa sau khi đã get được dữ liệu:
Như hình dưới đây ạ:

S005 TUDUNG PCS 170 21
S005 TUDUNG PCS 170 21
S005 TUDUNG PCS 170 21
S005 TUDUNG PCS 170 21

S007 TUDUNG PCS 150 20
S007 TUDUNG PCS 150 20
S007 TUDUNG PCS 150 20
S007 TUDUNG PCS 150 20

S001 TUDUNG PCS 1234 365
S001 TUDUNG PCS 1234 365
S001 TUDUNG PCS 1234 365
S001 TUDUNG PCS 1234 365

Rất cảm ơn sự chia sẻ của anh.
 
Dạ cám ơn anh. Vấn đề ở đây là khi em thay đổi sheet cần lấy dữ liệu ở đây là "Manifest" thành sheet "Packing List" thì trong File Tong Hop nó tự copy thêm 2 dòng nữa sau khi đã get được dữ liệu:
Như hình dưới đây ạ:

S005 TUDUNG PCS 170 21
S005 TUDUNG PCS 170 21
S005 TUDUNG PCS 170 21
S005 TUDUNG PCS 170 21

S007 TUDUNG PCS 150 20
S007 TUDUNG PCS 150 20
S007 TUDUNG PCS 150 20
S007 TUDUNG PCS 150 20

S001 TUDUNG PCS 1234 365
S001 TUDUNG PCS 1234 365
S001 TUDUNG PCS 1234 365
S001 TUDUNG PCS 1234 365

Rất cảm ơn sự chia sẻ của anh.
Đây là do trong Sheets("Manifest") bạn để 1 dòng trống giữa dòng tiêu đề với dòng dữ liệu, Sheets("Packing list") thì không như vậy.
Ngoài ra bạn chú ý code: lr1=.Range("B" & Rows.Count).End(xlUp).Row
--> bạn phải chọn cột nào chắc chắn có dữ liệu, ko được để trống.
Bây giờ bạn thử cho thêm 1 dòng trống giữa dòng tiêu đề với dòng dữ liệu trong Sheets("Packing list") xem sao.
Nếu chưa ổn, bạn upload lại file và ghi rõ lại yêu cầu, mình sẽ sửa cho
 
Đây là do trong Sheets("Manifest") bạn để 1 dòng trống giữa dòng tiêu đề với dòng dữ liệu, Sheets("Packing list") thì không như vậy.
Ngoài ra bạn chú ý code: lr1=.Range("B" & Rows.Count).End(xlUp).Row
--> bạn phải chọn cột nào chắc chắn có dữ liệu, ko được để trống.
Bây giờ bạn thử cho thêm 1 dòng trống giữa dòng tiêu đề với dòng dữ liệu trong Sheets("Packing list") xem sao.
Nếu chưa ổn, bạn upload lại file và ghi rõ lại yêu cầu, mình sẽ sửa cho
Dạ, em gởi lại file nhờ anh edit giúp em. Vẫn bị tình trạng copy thêm file sau khi get dữ liệu từ các sheet S003.xlsm, S004.xlsm. Em cảm ơn ạ.
 

File đính kèm

  • Packinglist.xlsm
    23.1 KB · Đọc: 2
  • S003.xlsm
    46.5 KB · Đọc: 3
  • S004.xlsm
    46.5 KB · Đọc: 2
Dạ, em gởi lại file nhờ anh edit giúp em. Vẫn bị tình trạng copy thêm file sau khi get dữ liệu từ các sheet S003.xlsm, S004.xlsm. Em cảm ơn ạ.
Bạn nhớ copy dòng tiêu đề trước vào file Packing list.
Sửa code đoạn copy từ
Mã:
.Range("A" & lr2).Resize(lr1 - 2, 12) = rng.Value2
thành
Mã:
.Range("A" & lr2).Resize(lr1 - 5, 12) = rng.Value2
 
Bạn nhớ copy dòng tiêu đề trước vào file Packing list.
Sửa code đoạn copy từ
Mã:
.Range("A" & lr2).Resize(lr1 - 2, 12) = rng.Value2
thành
Mã:
.Range("A" & lr2).Resize(lr1 - 5, 12) = rng.Value2

OK rồi anh ạ. Code chạy tốt.
Anh có thể giải thích sơ qua về đoạn code dưới cho em học hỏi không ạ ( các dòng bôi màu)?

If ws.Name = "Manifest" Then
With ws
lr1 = .Range("B" & Rows.Count).End(xlUp).Row
Set rng = .Range("A3:L" & lr1)
With master
lr2 = .Range("B" & Rows.Count).End(xlUp).Row + 1
.Range("A" & lr2).Resize(lr1 - 2, 12) = rng.Value2

End With
End With
End If
 
OK rồi anh ạ. Code chạy tốt.
Anh có thể giải thích sơ qua về đoạn code dưới cho em học hỏi không ạ ( các dòng bôi màu)?

If ws.Name = "Manifest" Then
With ws
lr1 = .Range("B" & Rows.Count).End(xlUp).Row
Set rng = .Range("A3:L" & lr1)
With master
lr2 = .Range("B" & Rows.Count).End(xlUp).Row + 1
.Range("A" & lr2).Resize(lr1 - 2, 12) = rng.Value2

End With
End With
End If
mình giải thích nhé!
lr1 = .Range("B" & Rows.Count).End(xlUp).Row --> xác định dòng cuối cùng có dữ liệu trong sheets "Manifest"
Set rng = .Range("A3:L" & lr1) --> đặt tên cho vùng dữ liệu cần copy
lr2 = .Range("B" & Rows.Count).End(xlUp).Row + 1 --> xác định dòng đầu tiên để paste dữ liệu
.Range("A" & lr2).Resize(lr1 - 2, 12) = rng.Value2 --> paste dữ liệu
Mình cũng không biết giải thích thế nào cho rõ hơn nữa.
Bạn chịu khó tìm hiểu kiến thức trên GPE nhé, bổ ích lắm
 
mình giải thích nhé!
lr1 = .Range("B" & Rows.Count).End(xlUp).Row --> xác định dòng cuối cùng có dữ liệu trong sheets "Manifest"
Set rng = .Range("A3:L" & lr1) --> đặt tên cho vùng dữ liệu cần copy
lr2 = .Range("B" & Rows.Count).End(xlUp).Row + 1 --> xác định dòng đầu tiên để paste dữ liệu
.Range("A" & lr2).Resize(lr1 - 2, 12) = rng.Value2 --> paste dữ liệu
Mình cũng không biết giải thích thế nào cho rõ hơn nữa.
Bạn chịu khó tìm hiểu kiến thức trên GPE nhé, bổ ích lắm

Cám ơn anh nhiều ạ. Biết đến GPE đầu óc em được khai sáng nhiều thứ lắm. 1 lần nữa xin cám ơn những code anh đã chia sẻ.:)
 
mình giải thích nhé!
lr1 = .Range("B" & Rows.Count).End(xlUp).Row --> xác định dòng cuối cùng có dữ liệu trong sheets "Manifest"
Set rng = .Range("A3:L" & lr1) --> đặt tên cho vùng dữ liệu cần copy
lr2 = .Range("B" & Rows.Count).End(xlUp).Row + 1 --> xác định dòng đầu tiên để paste dữ liệu
.Range("A" & lr2).Resize(lr1 - 2, 12) = rng.Value2 --> paste dữ liệu
Mình cũng không biết giải thích thế nào cho rõ hơn nữa.
Bạn chịu khó tìm hiểu kiến thức trên GPE nhé, bổ ích lắm

Hi anh Thịnh,
Cho em hỏi thêm là code này:
.Range("A" & lr2).Resize(lr1 - 2, 12) = rng.Value2 --> paste dữ liệu

Resize(lr1 - 2, 12) có ý nghĩa gì vậy anh? Lúc thì mình code Resize(lr1 - 5, 12), lúc thì mình code Resize(lr1 - 2, 12). Mong anh giải thích thêm cho em hiểu tí.
Thanks anh nhiều.
 
Hi anh Thịnh,
Cho em hỏi thêm là code này:
.Range("A" & lr2).Resize(lr1 - 2, 12) = rng.Value2 --> paste dữ liệu

Resize(lr1 - 2, 12) có ý nghĩa gì vậy anh? Lúc thì mình code Resize(lr1 - 5, 12), lúc thì mình code Resize(lr1 - 2, 12). Mong anh giải thích thêm cho em hiểu tí.
Thanks anh nhiều.
Cái này nói paste dữ liệu thì không hoàn toàn chính xác.
Nếu chính xác nhất thì gọi là gán giá trị rng cho 1 vùng dữ liệu ở sheets khác (vùng).
Để gán được chính xác thì cần rng và vùng phải có kích thước bằng nhau -> .Range("A" & lr2).Resize(lr1 - 2, 12) nghĩa là chọn ô cuối cùng có dữ liệu trong cột A, sau đó điều chỉnh số dòng, số cột cho tương ứng với rng.
còn tại sao lúc -2; lúc -5 là do dữ liệu đầu vào của bạn.
+ Khi dữ liệu ở sheets cần tổng hợp bắt đầu từ dòng thứ 3 --> chọn -2
+ Khi dữ liệu ở sheets cần tổng hợp bắt đầu từ dòng thứ 6 --> chọn -5
Bạn đối chiếu lại file các file để suy luận nhé!
 
Cái này nói paste dữ liệu thì không hoàn toàn chính xác.
Nếu chính xác nhất thì gọi là gán giá trị rng cho 1 vùng dữ liệu ở sheets khác (vùng).
Để gán được chính xác thì cần rng và vùng phải có kích thước bằng nhau -> .Range("A" & lr2).Resize(lr1 - 2, 12) nghĩa là chọn ô cuối cùng có dữ liệu trong cột A, sau đó điều chỉnh số dòng, số cột cho tương ứng với rng.
còn tại sao lúc -2; lúc -5 là do dữ liệu đầu vào của bạn.
+ Khi dữ liệu ở sheets cần tổng hợp bắt đầu từ dòng thứ 3 --> chọn -2
+ Khi dữ liệu ở sheets cần tổng hợp bắt đầu từ dòng thứ 6 --> chọn -5
Bạn đối chiếu lại file các file để suy luận nhé!

Dạ cám ơn anh nhiều vì đã chia sẻ thông tin ạ
 
Web KT
Back
Top Bottom