Tổng hợp dữ liệu từ nhiều file excel vào 1 file không cần mở file (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

ffcb1900

Thành viên chính thức
Tham gia
27/7/08
Bài viết
77
Được thích
4
Mình lúc nào cũng sẽ có 5 file dữ liệu (mỗi file khoảng 2000-5000 dòng dữ liệu), download trực tiếp hàng ngày từ server với định dạng định sẵn dưới định dạng .xls (số cột và vị trí cột định sẵn theo mẫu đính kèm là các file CA1, CA2, CA3, CA4, CA5).

Mình cần tổng hợp lại 5 file vào 1 file duy nhất (như mẫu đính kèm) trong đó du liệu của các file CA1, CA2, CA3, CA4, CA5 sẽ nối tiếp nhau ghep vào 1 sheet theo đúng cột tương ứng. Để tổng hợp đc mà k cần mở cả 5 file lên là tốt nhất (như kiểu paste link và có linh external data vậy).

Mong mọi người giúp đỡ với
 

File đính kèm

Mình lúc nào cũng sẽ có 5 file dữ liệu (mỗi file khoảng 2000-5000 dòng dữ liệu), download trực tiếp hàng ngày từ server với định dạng định sẵn dưới định dạng .xls (số cột và vị trí cột định sẵn theo mẫu đính kèm là các file CA1, CA2, CA3, CA4, CA5).

Mình cần tổng hợp lại 5 file vào 1 file duy nhất (như mẫu đính kèm) trong đó du liệu của các file CA1, CA2, CA3, CA4, CA5 sẽ nối tiếp nhau ghep vào 1 sheet theo đúng cột tương ứng. Để tổng hợp đc mà k cần mở cả 5 file lên là tốt nhất (như kiểu paste link và có linh external data vậy).

Mong mọi người giúp đỡ với

Bạn gôm 5 File vào 1 Foder rồi sử dụng File gộp các File vào 1 File, nhấn Ctrl+Q để chạy Code, hộp thoại Open file mở ra, bạn vào mục look in chọn ổ dĩa và chọn Folder cần gộp File và nhấn nút Open, tiếp theo chọn tất cả các File cần gộp và nhấn nút Open (hoặc nhấn nút Enter), chờ Macro chạy và lấy tất cả các sheet có trong tất cả các File vào File (gộp các File vào 1 File).

Bạn tìm trên diễn đàn đã có bài gộp các sheet vào 1 sheet tải về sử dụng, nếu tìm và làm không được tôi sẽ giúp sau.

Lưu ý:
- Trong tất cả các sheet tôi đặt tên sheet ở cột B, để khi gộp các sheet lại bạn sẽ phân biệt vùng nào là của sheet nào gộp vô, sau đó sử dụng PivotTable để tổng hợp thì mới có kết quả của từng tên như đã đặt ở cột B.
- Bạn không được làm ẩn sheet (nếu để ẩn thì phát sinh lỗi).
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình lúc nào cũng sẽ có 5 file dữ liệu (mỗi file khoảng 2000-5000 dòng dữ liệu), download trực tiếp hàng ngày từ server với định dạng định sẵn dưới định dạng .xls (số cột và vị trí cột định sẵn theo mẫu đính kèm là các file CA1, CA2, CA3, CA4, CA5).

Mình cần tổng hợp lại 5 file vào 1 file duy nhất (như mẫu đính kèm) trong đó du liệu của các file CA1, CA2, CA3, CA4, CA5 sẽ nối tiếp nhau ghep vào 1 sheet theo đúng cột tương ứng. Để tổng hợp đc mà k cần mở cả 5 file lên là tốt nhất (như kiểu paste link và có linh external data vậy).

Mong mọi người giúp đỡ với
Dùng ADO sẽ không cần mở file:
Mã:
Function GetData(ByVal FileName As String, ByVal SheetName As String, ByVal RangeAddress As String, _
            ByVal HasTitle As Boolean, ByVal UseTitle As Boolean)
            
  Dim rsCon As Object, rsData As Object, cat As Object, tbl As Object
  Dim tmpArr, Arr()
  Dim szConnect As String, szSQL As String, tmp As String
  Dim lCount As Long, lR As Long, lC As Long, lVer As Long
  lVer = Val(Application.Version)
  Set rsCon = CreateObject("ADODB.Connection")
  Set rsData = CreateObject("ADODB.Recordset")
  Set cat = CreateObject("ADOX.Catalog")
  
  If lVer < 12 Then
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 8.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  Else
    szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 12.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  End If
  If SheetName = "" Then
    Dim Dbs  As Object, db As Object
    Set Dbs = CreateObject("DAO.DBEngine." & IIf(lVer < 12, "36", "120"))
    Set db = Dbs.OpenDatabase(FileName, False, False, "Excel 8.0;")
    tmp = db.TableDefs(0).Name
    tmp = Replace(tmp, " ", "?")
    tmp = Replace(tmp, "'", " ")
    tmp = WorksheetFunction.Trim(tmp)
    tmp = Replace(tmp, " ", "'")
    tmp = Replace(tmp, "?", " ")
    SheetName = tmp
    db.Close
    Set Dbs = Nothing: Set db = Nothing
  End If
  If Right(SheetName, 1) <> "$" Then SheetName = SheetName & "$"
  rsCon.Open szConnect
  cat.ActiveConnection = rsCon
  
  szSQL = "SELECT * FROM [" & SheetName & RangeAddress & "];"
  rsData.Open szSQL, rsCon, 0, 1, 1
  tmpArr = rsData.GetRows
  ReDim Arr(UBound(tmpArr, 2) - UseTitle, UBound(tmpArr, 1) + 1)
  If UseTitle Then
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(0, lC) = rsData.Fields(lC).Name
    Next
  End If
  For lR = LBound(tmpArr, 2) To UBound(tmpArr, 2)
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(lR - UseTitle, lC) = tmpArr(lC, lR)
    Next
  Next
  rsData.Close: Set rsData = Nothing
  rsCon.Close: Set rsCon = Nothing
  GetData = Arr
End Function

Sub Main()
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    SheetName = "Sheet1": RangeAddress = "A8:V10000"
    For Each FileItem In vFile
      FileName = CStr(FileItem)
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If
End Sub
Cách dùng:
- Cho code trên vào Module
- Chạy sub Main
- Cửa sổ Open File hiện ra, dùng chuột chọn file đầu, bấm giữ phím Shift rồi còn file cuối ---> Bấm nút Open
- Chờ trong giây lát, khi MsgBox hiện ra báo hiệu hoàn tất, kiểm tra lại dữ liệu trong file hiện hành xem đã cập nhật chưa
-------------
Lưu ý: File TongHop phải được lưu theo định dạng XLSM (nếu lưu bằng XLSX sẽ mất sạch code)
 

File đính kèm

Upvote 0
Cảm ơn 2 thầy be09 và ndu96081631!
Em thử file của thầy be09 thì có 2 lỗi phát sinh như em đính kèm file để thầy sửa giúp xem vì sao ạ. Nếu ra từng sheet riêng rẽ này thì em dùng Pivot chỉ biết làm cho 1 sheet, nhiều sheet thi Pivot xử thế nào, thầy chỉ cho em biết với.

File của thầy ndu96081631, em thử chạy tốt. Thầy cho em hỏi, với code này, thì sẽ có những hạn chế gì mà sẽ khiến file k chạy được ạ ? Ví dụ hạn chế về số dòng, số cột, định dạng, số lượng gộp file... ? Nếu sau em có thêm file data để gộp và vùng gộp cũng thay đổi số cột thì thầy em sẽ chỉnh đoạn nào trong code để có thể tự thay đổi đc ạ?

Ngoài ra em còn 1 đề nữa ở topic khác, nhờ 2 thầy và các bạn giải dùm với
http://www.giaiphapexcel.com/forum/showthread.php?84528-Tự-động-đếm-số-lân-cho-từng-mã-trong-1-tháng
 

File đính kèm

  • Error 1 - sodangoa.jpg
    Error 1 - sodangoa.jpg
    145.7 KB · Đọc: 188
  • Error 2 - sodangoa.jpg
    Error 2 - sodangoa.jpg
    270.1 KB · Đọc: 156
Upvote 0
Bạn không nên dùng chữ thầy trong bài viết, ý của tôi là chỉ trả lời bài viết với mục đích "người biết thì trả lời người chưa biết để giúp nhau trong công việc. Trong bài viết tác giả đã nêu rõ ở dòng tiêu đề:

Tổng hợp dữ liệu từ nhiều file excel vào 1 file

Còn việc gộp các sheet vào 1 sheet thì tôi cũng đã nêu:

Bạn tìm trên diễn đàn đã có bài gộp các sheet vào 1 sheet tải về sử dụng, nếu tìm và làm không được tôi sẽ giúp sau


Vì vậy nếu bạn chưa gộp các sheet vào thì khi sử dụng Pivottable thì kết quả chỉ được 1 sheet là đúng rồi, còn vấn đề lỗi tôi cũng đã nêu ở trên.

Bạn không được làm ẩn sheet (nếu để ẩn thì phát sinh lỗi)

Trong File tại B3 tôi cũng đã nêu: "Chỗ B3 chọn loại Office 2003, 2007, 2010".
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn 2 thầy be09 và ndu96081631!
Em thử file của thầy be09 thì có 2 lỗi phát sinh như em đính kèm file để thầy sửa giúp xem vì sao ạ. Nếu ra từng sheet riêng rẽ này thì em dùng Pivot chỉ biết làm cho 1 sheet, nhiều sheet thi Pivot xử thế nào, thầy chỉ cho em biết với.

File của thầy ndu96081631, em thử chạy tốt. Thầy cho em hỏi, với code này, thì sẽ có những hạn chế gì mà sẽ khiến file k chạy được ạ ? Ví dụ hạn chế về số dòng, số cột, định dạng, số lượng gộp file... ? Nếu sau em có thêm file data để gộp và vùng gộp cũng thay đổi số cột thì thầy em sẽ chỉnh đoạn nào trong code để có thể tự thay đổi đc ạ?

Ngoài ra em còn 1 đề nữa ở topic khác, nhờ 2 thầy và các bạn giải dùm với
http://www.giaiphapexcel.com/forum/showthread.php?84528-Tự-động-đếm-số-lân-cho-từng-mã-trong-1-tháng

Anh ndu96081631 cho em hỏi thêm là sau khi chạy với file test thì chạy tốt. Nhưng chạy với file download xuống thì bị lỗi là:
-Vẫn báo "Done" nhưng dữ liệu trống ko tổng hợp sang. Rất tiếc là file down xuống nằm trong máy tính của công ty mà k thế upload trực tiếp lên đc ạ

- Nếu copy all từ file down xuống và paste all vao 1 new document. Rồi dùng file tổng hợp trỏ đến new document thì chạy ngon còn trỏ vào file down xuống thì k chạy. Liệu có restriction gì cài đặt trong file down xuống làm hạn chế này ko ạ ? Liệu có loại restriction nào như the k ạ ?
 
Upvote 0
File của thầy ndu96081631, em thử chạy tốt. Thầy cho em hỏi, với code này, thì sẽ có những hạn chế gì mà sẽ khiến file k chạy được ạ ? Ví dụ hạn chế về số dòng, số cột, định dạng, số lượng gộp file... ? Nếu sau em có thêm file data để gộp và vùng gộp cũng thay đổi số cột thì thầy em sẽ chỉnh đoạn nào trong code để có thể tự thay đổi đc ạ?

Bạn chỉ cần để ý Sub Main này thôi:
Mã:
Sub Main()
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    [COLOR=#ff0000][B]SheetName = "Sheet1"[/B][/COLOR]: [B][COLOR=#0000cd]RangeAddress = "A8:V10000"[/COLOR][/B]
    For Each FileItem In vFile
      [B][COLOR=#006400]FileName = CStr(FileItem)[/COLOR][/B]
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If
End Sub
Khai báo cho đúng: màu đỏ là tên sheet, màu xanh dương là vùng dữ liệu, xanh lá là tên file
----------------------
Anh ndu96081631 cho em hỏi thêm là sau khi chạy với file test thì chạy tốt. Nhưng chạy với file download xuống thì bị lỗi là:
-Vẫn báo "Done" nhưng dữ liệu trống ko tổng hợp sang. Rất tiếc là file down xuống nằm trong máy tính của công ty mà k thế upload trực tiếp lên đc ạ

- Nếu copy all từ file down xuống và paste all vao 1 new document. Rồi dùng file tổng hợp trỏ đến new document thì chạy ngon còn trỏ vào file down xuống thì k chạy. Liệu có restriction gì cài đặt trong file down xuống làm hạn chế này ko ạ ? Liệu có loại restriction nào như the k ạ ?
Bạn nói chung chung thế sao tôi biết được. Khám bệnh thì phải có bệnh nhân bạn à
 
Upvote 0
Thầy ndu96081631ơi cho em hỏi thêm chút: Nếu các file em cần tổng hợp nằm ở nhiều thư mục khác nhau thì có cách nào để dùng được code này ko thầy? Mong được thầy chỉ dạy.
Em cảm ơn thầy.
 
Upvote 0
Thầy ndu96081631ơi cho em hỏi thêm chút: Nếu các file em cần tổng hợp nằm ở nhiều thư mục khác nhau thì có cách nào để dùng được code này ko thầy? Mong được thầy chỉ dạy.
Em cảm ơn thầy.

Đương nhiên là được! Chỉ cần bạn biết được các file ấy nằm ở đâu (đường dẫn)
Nếu chỉ 1 vài file thì bạn cũng không cần phải For.. Next làm gì, cứ liệt kê đường dẫn ấy ra rồi tổng hợp từng cái là được
--------------
Bạn tự "mò" hoặc cho file cụ thể lên đây nếu không làm được nhé
 
Upvote 0
Đương nhiên là được! Chỉ cần bạn biết được các file ấy nằm ở đâu (đường dẫn)
Nếu chỉ 1 vài file thì bạn cũng không cần phải For.. Next làm gì, cứ liệt kê đường dẫn ấy ra rồi tổng hợp từng cái là được
--------------
Bạn tự "mò" hoặc cho file cụ thể lên đây nếu không làm được nhé
Vâng, em hiểu ý thầy và như vậy là mình phải làm nhiều lần, mỗi lần chỉ được 1 thư mục. Em hỏi khó thầy tí là em muốn làm 1 lần cho một số thư mục (các thư mục này nằm trong 1 thư mục cấp cao hơn)
Cảm ơn thầy nhiều!
 
Upvote 0
Vâng, em hiểu ý thầy và như vậy là mình phải làm nhiều lần, mỗi lần chỉ được 1 thư mục. Em hỏi khó thầy tí là em muốn làm 1 lần cho một số thư mục (các thư mục này nằm trong 1 thư mục cấp cao hơn)
Cảm ơn thầy nhiều!

Thì chỉ yêu cầu bạn biết trước đường dẫn của file là được rồi
Có thể đầu tiên ta liệt kê các đường dẫn ấy vào 1 Array, xong dùng vòng lập quét qua array này (để lấy đường dẫn) ---> Vậy xem như là làm 1 lần rồi
 
Upvote 0
Em lại làm phiền các thầy 1 chút:
Em Copy đoạn Code của thầy và làm như hướng dẫn cho 1 file ví dụ thì chạy rất tốt nhưng khi em đưa code vào file chính thức của em lại ko chạy được. Em nghi là file tổng hợp của em có vấn đề gì đó mà em ko thể tìm ra lỗi. Em cũng hỏi thêm là vùng dữ liệu sau khi khi tổng hợp hiện tại nó đang nằm ở 1 vị trí mặc định, em muốn sửa code để vùng dữ liệu này nằm ở vị trí tùy ý thì sửa ở chỗ nào.
Mong thầy chỉ bảo giúp em.
Cảm ơn thầy.
Vui lòng xem file đính kèm.
 

File đính kèm

Upvote 0
...vùng dữ liệu sau khi khi tổng hợp hiện tại nó đang nằm ở 1 vị trí mặc định, em muốn sửa code để vùng dữ liệu này nằm ở vị trí tùy ý thì sửa ở chỗ nào.
....

Trong khi chờ Ndu trả lời, trong sub Main bạn thử thay câu lệnh

Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)

thành

Set Target = Sheet1.Range(selection)

Lưu ý: vị trí bạn đặt con trỏ sẽ là ô đầu tiên (ô trái trên) của vùng dữ liệu. Vì vậy bạn phải chọn vị trí đặt dữ liệu trước khi chạy code
 
Upvote 0
Em lại làm phiền các thầy 1 chút:
Em Copy đoạn Code của thầy và làm như hướng dẫn cho 1 file ví dụ thì chạy rất tốt nhưng khi em đưa code vào file chính thức của em lại ko chạy được. Em nghi là file tổng hợp của em có vấn đề gì đó mà em ko thể tìm ra lỗi. Em cũng hỏi thêm là vùng dữ liệu sau khi khi tổng hợp hiện tại nó đang nằm ở 1 vị trí mặc định, em muốn sửa code để vùng dữ liệu này nằm ở vị trí tùy ý thì sửa ở chỗ nào.
Mong thầy chỉ bảo giúp em.
Cảm ơn thầy.
Vui lòng xem file đính kèm.

Đoạn code Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
Trong file của bạn chẳng có sheet nào là Sheet1 cả
Nên nhớ viết kiểu như thế Excel hiểu rằng đó là Sheet CodeName nha
Cái "Sheet1" mà bạn nhìn thấy có Sheet CodeName = "Sheet6"
Vậy, hoặc là bạn sửa đoạn code trên thành:
Set Target = Sheet6.Range("A60000").End(xlUp).Offset(1)
Hoặc là sửa thành:
Set Target = Worksheets("Sheet1").Range("A60000").End(xlUp).Offset(1)
---------------------
Trong khi chờ Ndu trả lời, trong sub Main bạn thử thay câu lệnh

Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)

thành

Set Target = Sheet1.Range(selection)


Lưu ý: vị trí bạn đặt con trỏ sẽ là ô đầu tiên (ô trái trên) của vùng dữ liệu. Vì vậy bạn phải chọn vị trí đặt dữ liệu trước khi chạy code
Vầy mới đúng chứ anh Set Target = Selection
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn các thầy đã giúp. Em đã làm theo chỉ dẫn của các thầy và đã thành công.
Mỗi ngày lên GPE là 1 ngày em học được bao điều bổ ích.
Yêu GPE...
 
Upvote 0
Bạn chỉ cần để ý Sub Main này thôi:
Mã:
Sub Main()
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    [COLOR=#ff0000][B]SheetName = "Sheet1"[/B][/COLOR]: [B][COLOR=#0000cd]RangeAddress = "A8:V10000"[/COLOR][/B]
    For Each FileItem In vFile
      [B][COLOR=#006400]FileName = CStr(FileItem)[/COLOR][/B]
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If
End Sub
Khai báo cho đúng: màu đỏ là tên sheet, màu xanh dương là vùng dữ liệu, xanh lá là tên file
----------------------

Bạn nói chung chung thế sao tôi biết được. Khám bệnh thì phải có bệnh nhân bạn à


Anh ndu ơi, em đã sữ dụng file anh up lên, copy data ok. Nhưng em phát hiện có 1 vấn đề là: nếu ô trong file nguồn là dạng text (có số 0 ở đầu dãy), nhưng lúc copy qua thì bị mất số 0 ở đầu anh ơi. (em có file ví dụ, nhưng ko upload ở đây đc ;( ).
ANh xem giúp em với nha. Cám ơn anh
 
Upvote 0
hiện tại em cũng có 2 file cần tổng hợp là 1 nhưng làm như hướng dẫn ko được. Nhờ các anh giúp với. Trong file excel của em có công thức cũng như 1 số đoạn code tổng hợp.
Em có tổng cộng 3 file: 2 file Team HN,HCM và 1 file tổng hợp.
 
Upvote 0
Dùng ADO sẽ không cần mở file:
Cách dùng:
- Cho code trên vào Module
- Chạy sub Main
- Cửa sổ Open File hiện ra, dùng chuột chọn file đầu, bấm giữ phím Shift rồi còn file cuối ---> Bấm nút Open
- Chờ trong giây lát, khi MsgBox hiện ra báo hiệu hoàn tất, kiểm tra lại dữ liệu trong file hiện hành xem đã cập nhật chưa
-------------
Lưu ý: File TongHop phải được lưu theo định dạng XLSM (nếu lưu bằng XLSX sẽ mất sạch code)
Mọi người lam ơn cho hỏi có file của bài #3chay ko ra k quả trên excel 2003 phải ko các anh chị, em mầm mãi ko được như thầy Ndu96081631 giới thiệu
Xin giải pháp khắc phục với ah
cảm ơn các anh chị
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ BQT xóa giúp 2 bài #18;#19 của tôi trên đây
Cảm ơn
 
Upvote 0
hiện tại em cũng có 2 file cần tổng hợp là 1 nhưng làm như hướng dẫn ko được. Nhờ các anh giúp với. Trong file excel của em có công thức cũng như 1 số đoạn code tổng hợp.
Em có tổng cộng 3 file: 2 file Team HN,HCM và 1 file tổng hợp.

Sử dụng nút gộp File, gộp sheet, tổng hợp, nội dung chi tiết xem sheet Hướng dẫn trong File

Lưu ý:

Tại B4 của sheet Hướng dẫn cần chọn loại Office 2003, 2007, 2010 của File cần gộp.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Dùng ADO sẽ không cần mở file:
Mã:
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    SheetName = "[B]Sheet1[/B]": RangeAddress = "A8:V10000"
    For Each FileItem In vFile
      FileName = CStr(FileItem)
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If
End Sub
Cách dùng:
- Cho code trên vào Module
- Chạy sub Main
- Cửa sổ Open File hiện ra, dùng chuột chọn file đầu, bấm giữ phím Shift rồi còn file cuối ---> Bấm nút Open
- Chờ trong giây lát, khi MsgBox hiện ra báo hiệu hoàn tất, kiểm tra lại dữ liệu trong file hiện hành xem đã cập nhật chưa
-------------
Lưu ý: File TongHop phải được lưu theo định dạng XLSM (nếu lưu bằng XLSX sẽ mất sạch code)

Chào Anh NDU96081631 , trước xin cám ơn anh về đoạn code trên . Nó giúp ích rất nhiều trong công việc của tôi . Nhưng trong quá trình sử dụng tôi còn gặp hai vướng mắc mong anh cũng như các pro khác giải đáp giúp .

- có thể nào cho excel tự hiểu sheet đầu tiên là sheet cần lấy dữ liệu cho dù sheet đầu tiên không phải mang tên là ''sheet1'' .
- trên sheet tổng hợp chỉ nhập những dữ liệu mới , lọc bỏ những dữ liệu trùng lập .

Mong được sự giải đáp của các pro . Thân .
 
Upvote 0
- có thể nào cho excel tự hiểu sheet đầu tiên là sheet cần lấy dữ liệu cho dù sheet đầu tiên không phải mang tên là ''sheet1'' .
.
Code có tính đến trường hợp này mà bạn. Bạn cho SheetName = "" đồng nghĩa sẽ lấy Sheet đầu tiên
Mã:
Sub Main()
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    [COLOR=#ff0000]SheetName = ""[/COLOR]: RangeAddress = "A8:V10000"   ''<--- [COLOR=#ff0000]Gán SheetName = ""[/COLOR]
    For Each FileItem In vFile
      FileName = CStr(FileItem)
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If
End Sub
Hoặc cũng không cần gán giá trị nào cho SheetName cũng được:
Mã:
Sub Main()
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    RangeAddress = "A8:V10000"  [COLOR=#ff0000]''<---- Xóa luôn dòng gán giá trị cho SheetName[/COLOR]
    For Each FileItem In vFile
      FileName = CStr(FileItem)
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If
End Sub
------------------------------------
- trên sheet tổng hợp chỉ nhập những dữ liệu mới , lọc bỏ những dữ liệu trùng lập .
.
Chưa hiểu ý bạn chỗ này! Như thế nào thì gọi là dữ liệu mới
 
Upvote 0
Chưa hiểu ý bạn chỗ này! Như thế nào thì gọi là dữ liệu mới

Xin cám ơn Anh đã giải đáp khúc mắc . Về khúc mắc thứ 2 tức là : mỗi ngày tôi nhận được một file dữ liệu khoảng 500 dòng nhưng thực chất nó chỉ có khoảng 10 dòng là mới so với file dữ liệu tôi nhận được ngày hôm trước . Cho nên khi dùng code của anh để gộp 2 file này lại thi tôi được 1 file mới 1000 dòng trong khi yêu cầu của công việc tôi chỉ việc cập nhật thêm 10 dòng mới kia là đủ .
Hiện tại tôi dùng chức năng ''remove duplicates'' trong data để loại bỏ những dữ liệu trùng lập . Tôi tự hỏi liệu có thể tích hợp chức năng lọc dữ liệu sau khi gộp file này vào đoạn code của anh viết ở trên không . Thân .
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi tự hỏi liệu có thể tích hợp chức năng lọc dữ liệu sau khi gộp file này vào đoạn code của anh viết ở trên không . Thân .
Đương nhiên là làm được rồi (nhưng mà tôi bận quá)
Hiện tại tôi dùng chức năng ''remove duplicates'' trong data để loại bỏ những dữ liệu trùng lập
Excel có chức năng gì phù hợp thì cứ xài đi, cũng đâu có tốn mấy công sức đâu
Ẹc... Ẹc...
 
Upvote 0
Gửi thầy NDU, em muốn hỏi nếu mình tông hợp vài ô trong các sheet đóng VD: ô A10, ô C12 và ô D15 ... thành 1 dòng trong file tổng hợp thì làm thế nào ah? Em mò mẫm mãi mà không đi đượcThanks
 
Upvote 0
Em có download file của thầy NDU về sử dụng chạy rất tốt. thầy có thể chỉ giúp em sửa code của thầy như thế nào để nếu trong file nguồn có 3 sheet đầu có dữ liệu thì khi chạy nó sẽ copy dữ liệu cả 3 sheet đó sang 3 sheet tương ứng bên file tổng hợp được không ạ. em cám ơn thầy nhiều ạ.:-=
 
Upvote 0
Sử dụng nút gộp File, gộp sheet, tổng hợp, nội dung chi tiết xem sheet Hướng dẫn trong File

Lưu ý:

Tại B4 của sheet Hướng dẫn cần chọn loại Office 2003, 2007, 2010 của File cần gộp.

em thấy mỗi lần gộp các sheet lại có nhiều name rác, sao anh không viết luôn thêm đoạn code xoá name rác cho nó nhẹ
 
Upvote 0
Tổng hợp dữ liệu từ cáccột của nhiều file(cấu trúc bảng giống nhau) vào file tổng hợp

Dùng ADO sẽ không cần mở file:
Mã:
Cách dùng:
- Cho code trên vào Module
- Chạy sub Main
- Cửa sổ Open File hiện ra, dùng chuột chọn file đầu, bấm giữ phím Shift rồi còn file cuối ---> Bấm nút Open
- Chờ trong giây lát, khi MsgBox hiện ra báo hiệu hoàn tất, kiểm tra lại dữ liệu trong file hiện hành xem đã cập nhật chưa
-------------
Lưu ý: File TongHop phải được lưu theo định dạng XLSM (nếu lưu bằng XLSX sẽ mất sạch code)[/QUOTE]
Vì thấy mong muốn của mình gần giống với Giải pháp của thầy [FONT=arial black][SIZE=2][COLOR=#0000CD]ndu96081631[/COLOR][/SIZE][/FONT] 
Nên tôi gởi bài vào đây: Rất mong mọi người giúp đỡ cho các file như mong muốn sau
1)Lấy tất cả các dữ liệu của nguyen van A1 ở cọt (số giờ dư/tháng 1) đưa vào cột D ở bảng tổng hợp
---
Tương cho cho những người khác
2)Lấy tất cả các dữ liệu của nguyen van A1 ở cọt (thành tiền của tháng 1) đưa vào cột E ở bảng tổng hợp
---
Tương cho cho những người khác; tương tự cho các tháng khác
Lưu ý: ở cột họ và tên(chỉ có từng đó con người) nhưng giữa các tháng là khác nhau về thứ tự
--------
Cảm ơn các bạn
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Copy dữ liệu từ nhiều sheets của nhiều file vào nhiều sheets của 1 file.

Xin Chào Thầy Cô cùng các Anh Chị trên GPE!
Em cũng thấy chủ đề này tương tự với chủ đề em muốn hỏi nên em không tạo chủ đề mới nữa ạ.
Em có một vấn đề khó khắn dưới đây:
Em có rất nhiều file có định dạng "dd-mm-yyyy".xlsb
ví dụ: 01-01-2014.xlsb,02-01-2014.xlsb,03-01-2014.xls,....
Và trong mỗi file này có 3 Sheets em cần quan tâm đó là Lan1,Lan2,Lan3
Tất cả các file và các sheets đều đồng nhất với nhau về mặt cầu trúc dữ liệu.

Mong muốn là để làm sao đưa toàn bộ dữ liệu từ 3 sheets trong các file có định dạng "dd-mm-yyyy".xlsb vào 1 file TongHop.xlsb

Cụ thể là:
Trong cùng một thư mục có 16 file tương ứng với 16 ngày và trong mỗi file này lại có 3 sheets cần lấy dữ liệu (Sheets("Lan1"),Sheets("Lan2"),Sheest("Lan3")) và dữ liệu cần lấy từ vùng B6:AA222

Khi lấy vào sheets TongHop.xlsb thì file này sẽ có 16x3=48Sheet (sheet1,sheet2,....,sheet48)
Và trong mỗi sheets này sẽ hiển thì dữ liệu từ vùng B6:AA222

Ghi chú chỉ lấy dữ liệu theo kiểu xlPasteFormats,xlPasteValuesAndNumberFormats
Vì dữ liệu ở các file nguồn cũng có nhiều vùng chứa công thức.

Xin hỏi Thầy Cô và Anh Chị là mong muốn trên của em liệu có phương pháp nào giải quyết được không ạ?
Em rất mong nhận được sự giúp đỡ cụ thể cho trường hợp này!Em xin cảm ơn!
 
Upvote 0
Xin Chào Thầy Cô cùng các Anh Chị trên GPE!
Em cũng thấy chủ đề này tương tự với chủ đề em muốn hỏi nên em không tạo chủ đề mới nữa ạ.
Em có một vấn đề khó khắn dưới đây:


Xin hỏi Thầy Cô và Anh Chị là mong muốn trên của em liệu có phương pháp nào giải quyết được không ạ?
Em rất mong nhận được sự giúp đỡ cụ thể cho trường hợp này!Em xin cảm ơn!

Không tương tự đâu KUMI à: chủ đề này chỉ lấy dữ liệu, không lấy Format nên có thể dùng ADO mà không cần mở File nguồn. Còn yêu cầu của bạn thì lấy cả Format nên bắt buộc phải mở File nguồn.

Vấn đề bạn hỏi đương nhiên là làm được Bạn cứ gửi file lên sẽ có người giúp, còn tôi thì bó tay vì đang dùng Ex 2003.
 
Upvote 0
Không tương tự đâu KUMI à: chủ đề này chỉ lấy dữ liệu, không lấy Format nên có thể dùng ADO mà không cần mở File nguồn. Còn yêu cầu của bạn thì lấy cả Format nên bắt buộc phải mở File nguồn.

Vấn đề bạn hỏi đương nhiên là làm được Bạn cứ gửi file lên sẽ có người giúp, còn tôi thì bó tay vì đang dùng Ex 2003.

Cảm ơn Chú TrungChinhs đã góp ý ạ!
Mới đầu con cũng định sẽ gửi file nên nhưng nghĩ rằng với số lượng dữ liệu và file đính kèm như mong muốn đặt ra thì không thể gửi file nên đây được vì nặng, nên con đã cố gắng phân tích kỹ hơn vấn đề mong muốn đề mọi người hiểu được và có thể chỉ cần đưa code nên là đủ ạ.

Về file thì với trường hợp do những người dùng phiên bản office 2003 như Chú chẳng hạn nên con cũng đã chuyển về định dạng này mọi người cùng đóng góp.

Số lượng file kèm con đã giảm bớt từ 16 file xuống còn 5 file để giảm dung lượng và dễ test ,đồng thời trong file tổng hợp con cũng đã minh họa dữ liệu sau khi kết quả thực hiện xong.
Về việc lấy Format cũng không phải là cần thiết nên có thể bỏ cái này cũng được Chú ạ (nếu có thì sẽ tốt hơn) chỉ cần số liệu là được rồi ạ nếu cần format thì sau khi lấy kết quả xong con chỉ cần copyformat 1 sheet ở file nguồn rồi pase sang các sheets cũng được ạ.

Chú cùng các Thầy Cô xem file và tìm cách giúp con với nhé!

Ý!Do em không hiểu sâu vấn đề cứa tưởng mở file ngầm bằng code cũn thuộc dạng là không mở nên viết nhầm chủ đề như Chú TrungChinhs đã phân tích ở trên Phiền BQT giúp em tách chủ để này riêng ra với ạ.Em xin cảm ơn!(Em cũng định viết chủ đề mới nhưng để bài viết liền mạch với bài của Chú TrungChinhs nên mới tiếp tục ạ).
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Vẫn là File .xlsb bạn ạ

Bạn tạo 2 hoặc 3 file nguồn và 1 file tổng hợp dạng .xls. Để trong cùng một thư mục, nén lại rồi post lên.
 
Upvote 0
Trời, Xin lỗi Chú vì con sơ xuất ạ!
Con gửi lại file kèm rồi Chú xem lại nhé!
 
Upvote 0
ban cho mình hỏi làm sao để gộp nhiều file excel mà những file excel đó có chung 1 password. thanks nhiều ^^
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Thầy ndu xem giúp sao khi em chọn file này thì ko tổng hợp được dữ liệu vào nhưng nếu em Save as (ko chỉnh sửa gì) lại thì lại tổng hợp đươc? tks

Đây là file được lưu với định dạng "xa xưa": Microsoft Excel 4.0 ---> Bạn Save As nó thành Microsoft Excel 79-Excel 2003 là được
 
Upvote 0
Có khoảng 200 file con, có cách nào làm nhanh ko thầy?

Thử code này trên 1 file trắng:
Mã:
Sub ConvertToExl2003()
  Dim vFile, FileName
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel Files, *.xls", , , , True)
  If TypeName(vFile) = "Variant()" Then
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    For Each FileName In vFile
      With Workbooks.Open(FileName)
        .SaveAs FileName, xlExcel9795
        .Close True
      End With
    Next
    MsgBox "Thành công"
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
  End If
End Sub
Chạy code, hộp mở file hiện ra, chọn file đầu, bấm phím Shift và chọn file cuối rồi bấm nút Open. Chờ đến khi thông báo "Thành công" hiện ra là xong
Để thí nghiệm, đừng chọn quá nhiều file nha. Chọn 1 vài file, sau khi code chạy xong hãy kiểm tra lại cho chắc chắn rồi hẳn tiếp tục
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Bài viết rất hữu ích, tuy nhiên cách ghép dữ liệu như code đã nêu là ghép theo kiểu "nối tiếp". Giờ mình muốn ghép theo kiểu lọc dữ liệu (giống như VLOOKUP) từ nhiều file do nhiều người nhập vào 1 file tổng hợp có cấu trúc dữ liệu giống nhau, chỉ có nội dung là thay đổi thì phải làm sao, mình đã sửa lại code nhưng vẫn chưa chạy được. Rất mong các sư phụ giúp đỡ ! ThankS!
 
Upvote 0
Chào bác ndu96081631 , em có file này nhờ bác giúp cho ạ. Chả là em muốn tổng hợp dữ liệu ở sheet data của File có link sau ạ: http://www.mediafire.com/download/0rryyfr5ccu6b6q/CV.rar. Do là file CV do ứng viên gửi tới nên định dạng giống nhau bác ạ và do gửi cho ứng viên để ứng viên điền nên chỉ có sheet example là ko unhide thôi ạ. Bác giúp em với nhé. Em cảm ơn bác nhiều ạ.

 
Upvote 0
Tổng hợp dữ liệu từ nhiều file giống nhau vào 1 file (mỗi file có 4 sheet)

Mọi người ơi em là thành viên mới, hay phải làm báo cáo thống kê nhưng em lại không hiểu nhiều về excel nên rất mất thời gian và vất vả. Mọi người giúp em với. Cụ thể bây giờ em có 16 file giống nhau của 16 trường, muốn tổng hợp thành 1 file để gửi Sở GD, sheet của Sở lại khóa nên em chẳng biết phải làm sao. Mọi người giúp em nhanh nhanh với! Em có gửi kèm tạm 8 file của 8 trường và file em tổng hợp đây ạ.
 

File đính kèm

Upvote 0
Lấy dữ liệu từ nhiều file khác nhau mà không cần mở file

Xin chào mọi người
Xin mọi người giúp mình code lấy dữ liệu từ các file nhưng không cần mở file lên
yêu cầu mình đã ghi trong file LAY DL theo file đính kèm
Cám ơn mọi người rất nhiều
 

File đính kèm

Upvote 0
Xin chào mọi người
Xin mọi người giúp mình code lấy dữ liệu từ các file nhưng không cần mở file lên
yêu cầu mình đã ghi trong file LAY DL theo file đính kèm
Cám ơn mọi người rất nhiều

Mình đang tập tành ADO , VBA thấy bài của bạn tải về cũng muốn vọc lắm... nhưng sau khi đọc yêu cầu của bạn có tới 10 mấy mục ...
và cách sắp xếp dữ liệu ... ngại ghê... chạy mất dép..hahahaha
 
Upvote 0
Mình đang tập tành ADO , VBA thấy bài của bạn tải về cũng muốn vọc lắm... nhưng sau khi đọc yêu cầu của bạn có tới 10 mấy mục ...
và cách sắp xếp dữ liệu ... ngại ghê... chạy mất dép..hahahaha

Cám ơn bạn kieu manh đã xem qua file mình gửi
 
Upvote 0
Xin chào mọi người
Xin mọi người giúp mình code lấy dữ liệu từ các file nhưng không cần mở file lên
yêu cầu mình đã ghi trong file LAY DL theo file đính kèm
Cám ơn mọi người rất nhiều

http://php-dukkha.rhcloud.com/excel/demo/th.php

Bạn thử xem qua cái mình làm theo đường link trên, mình không dùng excel, nhưng bạn có thể copy qua lai với excel được, mới cả mình cũng vẫn chưa hiểu rõ ý của bạn cho lắm, mình hiểu đến đâu thì làm đến đó. Cách mình làm thì tuyệt đối là nhanh, bạn không phải làm một thao tác gì cả tất cả đều tự động cho bạn. Theo sự tưởng tượng và suy đoán của mình, sẽ có rất nhiều người làm một file excel của họ, so đó họ gửi về để bạn tổng hợp lại. Thay vì làm theo excel của riêng họ, thì họ có thể làm trực tiếp luôn, và nó tự động tổng hợp luôn, điều này cũng có nghĩa là bạn sẽ không còn việc để làm ... Mình mới chỉ làm được phần tổng hợp theo mã hàng, nói chung thì chỉ là demo nen chưa sát với ý bạn cho lắm...

Bạn có thể dùng phím ctrl +c và ctrl + v để copy và paste qua lại với excel.
Ưu điểm của nó là có thể copy và paste cả mảng .
Ở phần cột check có 3 chức năng insert : dùng để insert thêm một dòng mới.
update: sửa dòng.
và del là xóa dòng.
bạn muốn sửa xóa dòng nào thì ở cột check chọn chức năng tương ứng.
 
Lần chỉnh sửa cuối:
Upvote 0
http://php-dukkha.rhcloud.com/excel/demo/th.php

Bạn thử xem qua cái mình làm theo đường link trên, mình không dùng excel, nhưng bạn có thể copy qua lai với excel được, mới cả mình cũng vẫn chưa hiểu rõ ý của bạn cho lắm, mình hiểu đến đâu thì làm đến đó. Cách mình làm thì tuyệt đối là nhanh, bạn không phải làm một thao tác gì cả tất cả đều tự động cho bạn. Theo sự tưởng tượng và suy đoán của mình, sẽ có rất nhiều người làm một file excel của họ, so đó họ gửi về để bạn tổng hợp lại. Thay vì làm theo excel của riêng họ, thì họ có thể làm trực tiếp luôn, và nó tự động tổng hợp luôn, điều này cũng có nghĩa là bạn sẽ không còn việc để làm ... Mình mới chỉ làm được phần tổng hợp theo mã hàng, nói chung thì chỉ là demo nen chưa sát với ý bạn cho lắm...

Bạn có thể dùng phím ctrl +c và ctrl + v để copy và paste qua lại với excel.
Ưu điểm của nó là có thể copy và paste cả mảng .
Ở phần cột check có 3 chức năng insert : dùng để insert thêm một dòng mới.
update: sửa dòng.
và del là xóa dòng.
bạn muốn sửa xóa dòng nào thì ở cột check chọn chức năng tương ứng.

Cám ơn bạn pvh2007
Ý tưởng của bạn rất hay nhưng các file excel mà mình muốn tổng hợp được lấy từ báo cáo của phần mềm cty mình, có nghĩa là mọi người nhập trên phần mềm này và mình xuất ra file Excel để tổng hợp (file mình gửi kèm theo ở bài trên là mình chỉ mô phỏng theo công việc mình muốn làm thôi chứ thực tế dữ liệu còn nhiều hơn). đại loại công việc của mình thế này:
Bước 1: khi mình xuất báo cáo từ phần mềm kế toán của cty mình sẽ có rất nhiều file excel có cùng cấu trúc (theo vd file đính kèm là File 1, File 2, File A, File B nằm trong thư mục File), mình muốn tổng hợp các file này lại thành một file với mã hàng là duy nhất và số lượng bán được sum lại theo mã hàng đồng thời thêm một cột thể hiện tên file đã lấy và số lượng bán để trong ngoặc theo mã hàng (vd: File 1 (2), File A (1) với vd này mình sẽ hiểu là với cùng một mã đã lấy trong File 1 với số lượng bán là 2, và trong file A với sl bán là 1)
Bước 2: do file này không có tên hàng, phân nhóm, ghi chú... nên mình muốn lấy hết dữ liệu này theo mã hàng từ dm khác qua (theo vd file đính kèm là file DM nằm trong thư mục DM) file này hơi khủng có tới 11 sheet và số dòng thì... rất nhiều
Bước 3: do file tổng hợp này có c/khấu là 0 nên mình muốn lấy c/khấu từ file khác theo mã hàng (theo vd file đính kèm là file CK nằm trong thư mục CK)


Nếu tổng hợp bằng thủ công + Hàm thì tất nhiên là mình làm được rồi nhưng công việc này cứ lập đi lập lại nhiều lần mình thấy chán quá nên mình có ý tưởng viết thủ tục trên VBA để thực hiện khi cần nhưng kiến thức về VBA của mình còn hạn chế chủ yếu là tự học trên diễn đàn này và tham khảo sách của tác giả Phan Tự Hướng và Tác giả Nguyễn Khắc Duy, nhưng một tuần nay vẫn chưa đâu vào đâu


một lần nữa xin cám ơn bạn pvh2007 và toàn thể mọi người trên diễn đàn
 
Lần chỉnh sửa cuối:
Upvote 0
dạ kính gửi các anh chị
Em có nội dung cũng theo chủ đề gộp flie, gộp sheet
Nhưng có hơi gút mắt hơn tí nhờ các anh hướng dẫn
1. Trong file có nhiều sheet (10 sheet )nhưng chỉ cần lấy ra 1 sheet (vì có rất nhiều flie - khaong 100)
2. sau khi có được Sheet thì đem tổng hợp thành 1 sheet "TH"
* Form của sheet là giống nhau, cách gộp chủ yếu là Cộng (dữ liệu dạnh sanh sách - không cần tính toán)

em gửi mẫu flie ví dụ
Trong các file có các sheet chỉ lấy sheet "CSTD" rùi đem đi tổng hợp

Mong nhận được hướng dẫn của diễn đàn
cảm ơn
 

File đính kèm

Upvote 0
Đây là file được lưu với định dạng "xa xưa": Microsoft Excel 4.0 ---> Bạn Save As nó thành Microsoft Excel 79-Excel 2003 là được

Chào anh, em cũng gặp trường hợp như bạn này, số lượng file xuất từ hệ thống rất nhiều. Em dùng code convert của anh nhưng file vẫn y nguyên, vì thế không dùng code ghép file được.

Nhờ anh xem giúp em.
Sub ConvertToExl2003()

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Dùng ADO sẽ không cần mở file:
Mã:
Function GetData(ByVal FileName As String, ByVal SheetName As String, ByVal RangeAddress As String, _
            ByVal HasTitle As Boolean, ByVal UseTitle As Boolean)
            
  Dim rsCon As Object, rsData As Object, cat As Object, tbl As Object
  Dim tmpArr, Arr()
  Dim szConnect As String, szSQL As String, tmp As String
  Dim lCount As Long, lR As Long, lC As Long, lVer As Long
  lVer = Val(Application.Version)
  Set rsCon = CreateObject("ADODB.Connection")
  Set rsData = CreateObject("ADODB.Recordset")
  Set cat = CreateObject("ADOX.Catalog")
  
  If lVer < 12 Then
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 8.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  Else
    szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 12.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  End If
  If SheetName = "" Then
    Dim Dbs  As Object, db As Object
    Set Dbs = CreateObject("DAO.DBEngine." & IIf(lVer < 12, "36", "120"))
    Set db = Dbs.OpenDatabase(FileName, False, False, "Excel 8.0;")
    tmp = db.TableDefs(0).Name
    tmp = Replace(tmp, " ", "?")
    tmp = Replace(tmp, "'", " ")
    tmp = WorksheetFunction.Trim(tmp)
    tmp = Replace(tmp, " ", "'")
    tmp = Replace(tmp, "?", " ")
    SheetName = tmp
    db.Close
    Set Dbs = Nothing: Set db = Nothing
  End If
  If Right(SheetName, 1) <> "$" Then SheetName = SheetName & "$"
  rsCon.Open szConnect
  cat.ActiveConnection = rsCon
  
  szSQL = "SELECT * FROM [" & SheetName & RangeAddress & "];"
  rsData.Open szSQL, rsCon, 0, 1, 1
  tmpArr = rsData.GetRows
  ReDim Arr(UBound(tmpArr, 2) - UseTitle, UBound(tmpArr, 1) + 1)
  If UseTitle Then
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(0, lC) = rsData.Fields(lC).Name
    Next
  End If
  For lR = LBound(tmpArr, 2) To UBound(tmpArr, 2)
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(lR - UseTitle, lC) = tmpArr(lC, lR)
    Next
  Next
  rsData.Close: Set rsData = Nothing
  rsCon.Close: Set rsCon = Nothing
  GetData = Arr
End Function

Sub Main()
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    SheetName = "Sheet1": RangeAddress = "A8:V10000"
    For Each FileItem In vFile
      FileName = CStr(FileItem)
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If
End Sub
Cách dùng:
- Cho code trên vào Module
- Chạy sub Main
- Cửa sổ Open File hiện ra, dùng chuột chọn file đầu, bấm giữ phím Shift rồi còn file cuối ---> Bấm nút Open
- Chờ trong giây lát, khi MsgBox hiện ra báo hiệu hoàn tất, kiểm tra lại dữ liệu trong file hiện hành xem đã cập nhật chưa
-------------
Lưu ý: File TongHop phải được lưu theo định dạng XLSM (nếu lưu bằng XLSX sẽ mất sạch code)
Em có file đính kèm , muốn tổng hợp hai workbook sheet xuất kho vào sheet xuất kho TH, ko biết file có vấn đề gì ko, em thử áp dụng như code của Thầy nó ko chạy, Nhờ Thầy và các anh chị giúp đỡ ( Em đã activeX ADO rồi)
 

File đính kèm

Upvote 0
Các thánh ơi!
Giúp e vụ này với. hic hic :((
Em có 1 file mấu đính kèm như dưới, em muốn tổng hợp kết quả của các ngày vào 1 sheet or 1 fie riêng để có kết qảu tổng hợp cho 1 tháng
Thánh nào biết chiêu trò, chỉ or làm giúp e với
em đọc mấy bài đăng trên kia nhưng vẫn chưa hiểu cách làm ạ
Thánh nào giúp được e thì gửi lại file kết quả vào mail này giúp e nhớ
nguyenha100393@gmail.com
Cảm ơn nhiều nhiều
 

File đính kèm

Upvote 0
Em có file đính kèm , muốn tổng hợp hai workbook sheet xuất kho vào sheet xuất kho TH, ko biết file có vấn đề gì ko, em thử áp dụng như code của Thầy nó ko chạy, Nhờ Thầy và các anh chị giúp đỡ ( Em đã activeX ADO rồi)
Em thử đoạn này báo lỗi ở open, code trên cũng là sưu tầm trên GPE
Mã:
Sub ADO()
    Dim lsSQL As String, Cnn As Object, Fso As Object, Fi As Object, lrs As Object
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set Cnn = CreateObject("ADODB.Connection")
    Set lrs = CreateObject("ADODB.Recordset")
    With Fso
        For Each Fi In .GetFolder(ThisWorkbook.Path).Files
            If Fi.Name <> ThisWorkbook.Name Then
                MsgBox Fi.Path
                With Cnn
                    If Val(Application.Version) < 12 Then
                        .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Fi.Path & ";Extended Properties=""Excel 8.0;HDR=No"";"
                    Else
                        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Fi.Path & ";Extended Properties=""Excel 12.0;HDR=No"";"
                    End If
                    .Open
                End With
                lsSQL = "Select * From [Sheet1$B3:Z65536]"
                lrs.Open lsSQL, Cnn
                Range("B65536").End(3).Offset(1, 0).CopyFromRecordset lrs
                Cnn.Close
            End If
        Next
    End With
    Set lrs = Nothing
    Set Cnn = Nothing
    Set Fso = Nothing
End Sub
Anh chị nào có giải pháp hay thì giúp em
 
Upvote 0
file của em có mấy sheet ẩn, em không để ý, em xóa bớt sheet, đổi lại tên code Thầy ndu chạy ngon rồi,
Cảm ơn mọi người đã quan tâm
 
Upvote 0
Chào Thầy và các anh chi !
Em muốn
tổng hợp du lieu từ tất cả các sheet trong nhiều file vào một sheet tổng hợp. vậy code này phải sửa như thế nào?
nhờ
Thầy và các anh chi giúp.

Xinh chân thành cảm ơn !!
 

File đính kèm

Upvote 0
Chào Thầy và các anh chi !
Em muốn
tổng hợp du lieu từ tất cả các sheet trong nhiều file vào một sheet tổng hợp. vậy code này phải sửa như thế nào?
nhờ
Thầy và các anh chi giúp.

Xinh chân thành cảm ơn !!
code này nhìn quen quen--=0--=0
vui lòng xem file
chú ý tên sheet trong file nguồn sủa thành sheet1,2,3...thì mới chạy
 

File đính kèm

Upvote 0
Mọi người ơi giúp em với :-)
gửi bài viết tháng 8 rồi tháng 10 quay lại , rồi sau hôm nay thì tháng mấy bạn quay lại ?
muốn sửa code thì xóa hết code đang có trong file rồi ghi code này vào mà chạy
Mã:
Public Sub hello()
Dim cn As Object, cat As Object, filename, sheetname As String, tbl As Object, vFile
On Error Resume Next
Set cn = CreateObject("ADODB.Connection")
Set cat = CreateObject("ADOX.Catalog")
vFile = Application.GetOpenFilename("Excel File, *.xl*", , , , True)
If TypeName(vFile) = "Variant()" Then
    For Each filename In vFile
        cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filename & _
                ";mode=read;Extended Properties=""Excel 12.0;HDR=no"";"
        Set cat.ActiveConnection = cn
        For Each tbl In cat.tables
            If Right(tbl.Name, 1) = "$" Or Right(tbl.Name, 2) = "$'" Then
                sheetname = " [" & Replace(tbl.Name, "'", "") & "A13:EM13]"
                'error when range [A13:EM13] empty
                Sheet1.Range("B100000").End(xlUp).Offset(1) _
                .CopyFromRecordset cn.Execute("select * from " & sheetname)
            End If
        Next
        cn.Close
    Next
End If
End Sub
 
Upvote 0
Em xin kính chào cả nhà,
Em đã đọc hết 7 trang của Thread này – nhưng thực sự chưa thấy có nội dung nào như nội dung em cần thực hiện sau đây để áp dụng – nên em đành mạo muội viết post này và các thông tin attach, xin kính nhờ cả nhà giúp em với:
– Em có 1 file tổng hợp – tên gọi AToZ_Summary.xls → Lưu ở 1 Folder riêng
– Và các file chi tiết (cụ thể em attach ở đây là 8 file) → các file này lưu CHUNG ở 1 Folder riêng (không giống folder của File Summary nêu trên)


Em cần tổng hợp số liệu từ 1 sheet của các File Chi tiết này vào File Summary như em ghi nhận Yêu cầu trong File Summary. Xin nói rõ là các File chi tiết sẽ có nhiều Sheet, không chỉ Sheet cần lấy thông tin (Sheet cần thông tin này có mã hiệu ABC) – nhưng em chỉ quan tâm cái Sheet cần lấy thông tin này mà thôi – các Sheet còn lại thì không sử dụng vào file Summary.


Em zip toàn bộ các File này vào chung 1 folder để cả nhà dễ hình dung.


Vậy em kính nhờ cả nhà giúp em với ạ – nội dung em thỉnh nhờ cả nhà là em đã ghi nhận trong Sheet "AToZ_Summary" của File AToZ_Summary.xls rồi ạ


Em rất cảm ơn cả nhà đã đọc tin và em mong tin cả nhà lắm ạ
Em chuotpt3
 

File đính kèm

Upvote 0
Em Kính mong cả nhà giúp em với ạ ......

Em xin chân thành cảm ơn cả nhà!!
Em
Chuotpt3
 
Upvote 0
Dạ, em xin lỗi vì không check lại dữ liệu
Em xin cảm ơn anh/thầy hpkhuong lắm lắm – để em chạy thử xem ạ ......
}}}}}}}}}}}}}}}}}}}}}}}}}
 
Upvote 0
Em xin kính chào Thầy hpkhuong,
Code này chạy thì đúng ạ, không có sai và đúng như em ghi nhận yêu cầu bên trên. Em cảm ơn Thầy lắm.

Nhưng xin Thầy cho em hỏi chút và kính nhờ Thầy ạ:
– Hiện tại các File lẻ AAA, BBB, ...... cần lấy số liệu này là em giả lập số để thông tin rõ ràng hơn chút – và các file này không chỉ có Sheet mà Thầy đã giúp lấy số liệu ấy, mà còn có các Sheet khác nữa – vậy khi chạy code này để lấy số liệu từ Sheet như Sheet em giả lập ấy, thì em ghi nhận TÊN GỌI Sheet này nhận dạng là Mã ABC thì code này chạy có đúng nữa không ạ?
– Và em cũng mong Thầy giúp em thiết kế 1 Button để chạy khi tổng hợp số liệu mà không phải vào ADO code chạy như hiện tại được không Thầy ơi?

Em Mong tin Thầy lắm ạ
Em
chuotpt3
 
Upvote 0
Xin chào các anh chị trên diễn đàn
Ở bài #3 Thầy ndu có tạo một hàm và sub Main để tổng hợp nhiều file excel vào 1 file nhưng thí dụ có 1 file excel trống (không có số liệu hoặc chỉ có tiêu đề) thì kết quả khi chạy sẽ lấy số liệu file trước đó gán vào file trống này (ví dụ file CA1 có 4 dòng số liệu file CA6 trống nếu lấy CA1 trước CA6 thì kết quả sẽ là 8 dòng CA1)
Xin hỏi các anh chị trên diễn đàn cùng thầy ndu mình sửa code như thế nào để kết quả ra đúng
Cám ơn các anh chị rất nhiều
 
Upvote 0
Mọi người cho em hỏi, phần RangeAddress = "B3:TM500000" của em là từ B đến TM, nhưng khi chạy macro thì chỉ lấy từ B đến IU, vì sao lại như vậy ạ.

Em cảm ơn!
 
Upvote 0
Kính gửi diễn đàn giaiphapexcel.com em đã xem từ đầu đến cuối 7 trang về:Tổng hợp dữ liệu từ nhiều file excel vào 1 file không cần mở file"

nhưng em chưa tìm ra cách giải quyết vấn đề của mình rất mong diễn đàn chỉ giúp:
Vấn đề của em như sau:
- Em có 1 folder: QLCV
- Trong folder QLCV: hàng năm em tạo ra các folder theo năm như folder: 2004, 2005, 2006...
- Trong folder QLCV: em có file excel TongHopDiDen.xls dùng để tổng hợp dữ liệu từ các sheet DataDen của các file 2004.xls, 2005.xls, 2006.xls... tương ứng trong các folder: 2004,2005,2006... vào 1 sheet THDataDen.
Rất mong các Thầy trên diễn đàn giúp đỡ em. Em cám ơn rất nhiều.
Vì file gốc của em rất lớn không thể gửi lên được. Em xin gửi file mẫu giống file gốc mong mọi các thầy giúp đỡ.

[h=1]http://www.mediafire.com/file/k0out1xx5xdnz16/QLVB.rar[/h]
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn hpkhuong rất nhiều mình đã thử và chạy rất tốt. Nhưng khi test trên excel 2003 thì bị báo lỗi ở dòng này: Set rs = cn.Execute("select * from [Den$A:R] where f1 is not null"). Rất mong hpkhuong giúp mình lần nữa
 
Upvote 0
Cám ơn hpkhuong rất nhiều mình đã thử và chạy rất tốt. Nhưng khi test trên excel 2003 thì bị báo lỗi ở dòng này: Set rs = cn.Execute("select * from [Den$A:R] where f1 is not null"). Rất mong hpkhuong giúp mình lần nữa
bạn sủa những chố sau xem
Microsoft.ACE.OLEDB.12.0

thành Microsoft.JET.OLEDB.4.0

Excel 12.0 thành Excel 8.0
 
Upvote 0
Bạn chạy thử đoạn sau:
Mã:
Public Sub GPE_ADO()
Dim FOb As Object, Item As Object, Pth As String
Dim cn As Object, rs As Object, Ws As Worksheet
Set Ws = ThisWorkbook.Sheets("THDataDen")
Set cn = CreateObject("ADODB.Connection")
Pth = ThisWorkbook.Path
Application.ScreenUpdating = False
Ws.Range("A2").Resize(5000, 18).ClearContents
Set FOb = CreateObject("Scripting.FileSystemObject").GetFolder(Pth)
For Each Item In FOb.SubFolders
    cn.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & _
        Pth & "\" & Item.Name & "\" & Item.Name & ".xlsx" & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
            Set rs = cn.Execute("select * from [Den$A:R] where f1 is not null")
            If Not rs.EOF Then Ws.Range("A65000").End(3)(2).CopyFromRecordset rs
            rs.Close
            cn.Close
Next Item
Set cn = Nothing
Set FOb = Nothing
Set Item = Nothing
MsgBox "Da Tong Hop Xong!"
Application.ScreenUpdating = True
End Sub

anh,
em muốn lấy dữ lieu từ các file khác nhưng dữ lieu nằm rãi rác như A13, C56, D78,...
thì mình sửa code sao anh?
em cảm ơn anh trước nhiều nhiều!
 
Upvote 0
Dùng ADO sẽ không cần mở file:
Mã:
Function GetData(ByVal FileName As String, ByVal SheetName As String, ByVal RangeAddress As String, _
            ByVal HasTitle As Boolean, ByVal UseTitle As Boolean)
            
  Dim rsCon As Object, rsData As Object, cat As Object, tbl As Object
  Dim tmpArr, Arr()
  Dim szConnect As String, szSQL As String, tmp As String
  Dim lCount As Long, lR As Long, lC As Long, lVer As Long
  lVer = Val(Application.Version)
  Set rsCon = CreateObject("ADODB.Connection")
  Set rsData = CreateObject("ADODB.Recordset")
  Set cat = CreateObject("ADOX.Catalog")
  
  If lVer < 12 Then
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 8.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  Else
    szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 12.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  End If
  If SheetName = "" Then
    Dim Dbs  As Object, db As Object
    Set Dbs = CreateObject("DAO.DBEngine." & IIf(lVer < 12, "36", "120"))
    Set db = Dbs.OpenDatabase(FileName, False, False, "Excel 8.0;")
    tmp = db.TableDefs(0).Name
    tmp = Replace(tmp, " ", "?")
    tmp = Replace(tmp, "'", " ")
    tmp = WorksheetFunction.Trim(tmp)
    tmp = Replace(tmp, " ", "'")
    tmp = Replace(tmp, "?", " ")
    SheetName = tmp
    db.Close
    Set Dbs = Nothing: Set db = Nothing
  End If
  If Right(SheetName, 1) <> "$" Then SheetName = SheetName & "$"
  rsCon.Open szConnect
  cat.ActiveConnection = rsCon
  
  szSQL = "SELECT * FROM [" & SheetName & RangeAddress & "];"
  rsData.Open szSQL, rsCon, 0, 1, 1
  tmpArr = rsData.GetRows
  ReDim Arr(UBound(tmpArr, 2) - UseTitle, UBound(tmpArr, 1) + 1)
  If UseTitle Then
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(0, lC) = rsData.Fields(lC).Name
    Next
  End If
  For lR = LBound(tmpArr, 2) To UBound(tmpArr, 2)
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(lR - UseTitle, lC) = tmpArr(lC, lR)
    Next
  Next
  rsData.Close: Set rsData = Nothing
  rsCon.Close: Set rsCon = Nothing
  GetData = Arr
End Function

Sub Main()
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    SheetName = "Sheet1": RangeAddress = "A8:V10000"
    For Each FileItem In vFile
      FileName = CStr(FileItem)
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If
End Sub
Cách dùng:
- Cho code trên vào Module
- Chạy sub Main
- Cửa sổ Open File hiện ra, dùng chuột chọn file đầu, bấm giữ phím Shift rồi còn file cuối ---> Bấm nút Open
- Chờ trong giây lát, khi MsgBox hiện ra báo hiệu hoàn tất, kiểm tra lại dữ liệu trong file hiện hành xem đã cập nhật chưa
-------------
Lưu ý: File TongHop phải được lưu theo định dạng XLSM (nếu lưu bằng XLSX sẽ mất sạch code)

Bạn cho hỏi khi tên sheet ở các file nguồn của tôi có tên là "dữ liệu" không phải có tên là sheet1 thì code của bạn phải sửa dòng nào và sửa như thế nào vậy.
Cảm ơn.
 
Upvote 0
Upvote 0
Xin chào các anh chị trên diễn đàn
Ở bài #3 Thầy ndu có tạo một hàm và sub Main để tổng hợp nhiều file excel vào 1 file nhưng thí dụ có 1 file excel trống (không có số liệu hoặc chỉ có tiêu đề) thì kết quả khi chạy sẽ lấy số liệu file trước đó gán vào file trống này (ví dụ file CA1 có 4 dòng số liệu file CA6 trống nếu lấy CA1 trước CA6 thì kết quả sẽ là 8 dòng CA1)
Xin hỏi các anh chị trên diễn đàn cùng thầy ndu mình sửa code như thế nào để kết quả ra đúng
Cám ơn các anh chị rất nhiều

bạn thêm dòng màu đỏ này vào là ok nhé.
Mã:
Sub Main()
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    SheetName = "Sheet1": RangeAddress = "A8:V10000"
    For Each FileItem In vFile
      [COLOR=#ff0000]aRes = Nothing[/COLOR]
      FileName = CStr(FileItem)
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If 
End Sub
 
Upvote 0
Chào thầy ndu và mọi người,Mình dùng file hướng dẫn của thầy ndu, đang mày mò áp dụng nhưng có yêu cầu hơi khó hơn là các file con có nhiều sheet khác nhau, và các sheet này sẽ dc copy tương ứng vào các sheet trong file tổng hợp.Mình đã làm thử nhưng nó bị lỗi sửa mãi ko dc, hix hix. Mình up file lên đây, mong thầy ndu & các bác sửa giúp ah.Cám ơn mọi người trên gpexcel nhiều!
 

File đính kèm

Upvote 0
Chào thầy ndu và mọi người,Mình dùng file hướng dẫn của thầy ndu, đang mày mò áp dụng nhưng có yêu cầu hơi khó hơn là các file con có nhiều sheet khác nhau, và các sheet này sẽ dc copy tương ứng vào các sheet trong file tổng hợp (tên các sheet trong file tổng hợp giống với các sheet trong file con).Mình đã làm thử nhưng nó bị lỗi sửa mãi ko dc, hix hix. Mình up file lên đây, mong thầy ndu & các bác sửa giúp ah.Cám ơn mọi người trên gpexcel nhiều!


Các thầy/ các bạn giúp mình với nhé :(
 
Upvote 0
Các thầy/ các bạn giúp mình với nhé :(
các file có cấu trúc cột dòng khác nhau, dữ liệu minh họa và giải thích quá sơ sài, nên code khó viết đúng ý
Mã:
Sub TongHop()
  Dim Wb As Workbook, WbMain As Workbook, Ws As Worksheet, Dic As Object, Fso As Object, ObjFoder As Object, ObjFile As Object
  Dim Darr(), ShArr(), ShName As String, Tem
  Dim i As Integer, j As Integer, k As Integer, FistC As Byte, LastC As Long, FistR As Byte, LastR As Long
  Application.ScreenUpdating = False
  Set WbMain = ThisWorkbook
  Set Dic = CreateObject("scripting.dictionary")
  ReDim ShArr(i To WbMain.Sheets.Count)
  For k = 1 To WbMain.Sheets.Count
    ShArr(k) = 2
    With WbMain.Sheets(k)
      Dic.Add .Name, k
      LastR = .Range("A" & Rows.Count).End(xlUp).Row
      LastC = .Range("A1").End(xlToRight).Column
      If LastR > 1 And LastC < 16000 Then .Range("A2").Resize(LastR - 1, LastC).ClearContents
    End With
  Next k
  Set Fso = CreateObject("Scripting.FileSystemObject")
  Set ObjFoder = Fso.GetFolder(ThisWorkbook.Path)
  For Each ObjFile In ObjFoder.Files
    If Right(ObjFile, Len(WbMain.Name)) <> WbMain.Name And Fso.GetExtensionName(ObjFile) Like "xls*" Then
      Set Wb = Workbooks.Open(ObjFile)
      For Each Ws In Wb.Sheets
        ShName = Ws.Name
        If Dic.exists(ShName) Then
          If ShName = "Product_Location_3a" Then
            FistR = 3:  FistC = 2
          ElseIf ShName = "Product_Global" Then
            FistR = 3:  FistC = 1
          Else
            FistR = 2:  FistC = 1
          End If
          LastR = Ws.Range("B" & Rows.Count).End(xlUp).Row
          If LastR >= FistR Then
            LastC = Ws.Range("A1").End(xlToRight).Column
            Darr = Ws.Range(Ws.Cells(FistR, FistC), Ws.Cells(LastR, LastC)).Value
            k = Dic.Item(ShName)
            WbMain.Sheets(k).Range("B" & ShArr(k)).Resize(UBound(Darr), UBound(Darr, 2)) = Darr
            ShArr(k) = ShArr(k) + UBound(Darr)
          End If
        End If
      Next Ws
      Wb.Close False
    End If
  Next
  Application.ScreenUpdating = True
End Sub
 
Upvote 0
các file có cấu trúc cột dòng khác nhau, dữ liệu minh họa và giải thích quá sơ sài, nên code khó viết đúng ý
Mã:
Sub TongHop()
  Dim Wb As Workbook, WbMain As Workbook, Ws As Worksheet, Dic As Object, Fso As Object, ObjFoder As Object, ObjFile As Object
  Dim Darr(), ShArr(), ShName As String, Tem
  Dim i As Integer, j As Integer, k As Integer, FistC As Byte, LastC As Long, FistR As Byte, LastR As Long
  Application.ScreenUpdating = False
  Set WbMain = ThisWorkbook
  Set Dic = CreateObject("scripting.dictionary")
  ReDim ShArr(i To WbMain.Sheets.Count)
  For k = 1 To WbMain.Sheets.Count
    ShArr(k) = 2
    With WbMain.Sheets(k)
      Dic.Add .Name, k
      LastR = .Range("A" & Rows.Count).End(xlUp).Row
      LastC = .Range("A1").End(xlToRight).Column
      If LastR > 1 And LastC < 16000 Then .Range("A2").Resize(LastR - 1, LastC).ClearContents
    End With
  Next k
  Set Fso = CreateObject("Scripting.FileSystemObject")
  Set ObjFoder = Fso.GetFolder(ThisWorkbook.Path)
  For Each ObjFile In ObjFoder.Files
    If Right(ObjFile, Len(WbMain.Name)) <> WbMain.Name And Fso.GetExtensionName(ObjFile) Like "xls*" Then
      Set Wb = Workbooks.Open(ObjFile)
      For Each Ws In Wb.Sheets
        ShName = Ws.Name
        If Dic.exists(ShName) Then
          If ShName = "Product_Location_3a" Then
            FistR = 3:  FistC = 2
          ElseIf ShName = "Product_Global" Then
            FistR = 3:  FistC = 1
          Else
            FistR = 2:  FistC = 1
          End If
          LastR = Ws.Range("B" & Rows.Count).End(xlUp).Row
          If LastR >= FistR Then
            LastC = Ws.Range("A1").End(xlToRight).Column
            Darr = Ws.Range(Ws.Cells(FistR, FistC), Ws.Cells(LastR, LastC)).Value
            k = Dic.Item(ShName)
            WbMain.Sheets(k).Range("B" & ShArr(k)).Resize(UBound(Darr), UBound(Darr, 2)) = Darr
            ShArr(k) = ShArr(k) + UBound(Darr)
          End If
        End If
      Next Ws
      Wb.Close False
    End If
  Next
  Application.ScreenUpdating = True
End Sub


Chào bác, cám ơn bác rất nhiều vì đã đọc bài viết và làm giúp em. Nhưng mà em bỏ vô file chạy thử thì bị lỗi rùi nên chưa test tiếp dc, em up lên đây bác xem thử nha. Em đang tiếp cận bài toán theo cách khác. Nhưng nếu bác sửa dc thì cũng sẽ giúp rất nhiều cho em.

Cám ơn bác nhé!
 

File đính kèm

Upvote 0
Chào bác, cám ơn bác rất nhiều vì đã đọc bài viết và làm giúp em. Nhưng mà em bỏ vô file chạy thử thì bị lỗi rùi nên chưa test tiếp dc, em up lên đây bác xem thử nha. Em đang tiếp cận bài toán theo cách khác. Nhưng nếu bác sửa dc thì cũng sẽ giúp rất nhiều cho em.
Cám ơn bác nhé!
bạn xem lại file bạn gởi bài trước và bài nầy có giống nhau không? cụ thể là sheet Product_Location_3a của file Part...
 
Upvote 0
bạn xem lại file bạn gởi bài trước và bài nầy có giống nhau không? cụ thể là sheet Product_Location_3a của file Part...

Cám ơn bác nhiều nhé. Em đã check lại và làm dc rồi. ko hiểu sao cái file Part...lúc sau lại bị đổi so vơi lúc e gữi file lên diễn đàn nữa.

Giải pháp excel luôn là cứu cánh của mình khi gặp khó khăn với excel!
 
Upvote 0
Các bạn xem giúp mình dữ liệu cột F(data6) không lấy vào file TONG HOP được.
Chân thành cảm ơn
 

File đính kèm

Upvote 0
Dùng ADO sẽ không cần mở file:
Mã:
Function GetData(ByVal FileName As String, ByVal SheetName As String, ByVal RangeAddress As String, _
            ByVal HasTitle As Boolean, ByVal UseTitle As Boolean)
           
  Dim rsCon As Object, rsData As Object, cat As Object, tbl As Object
  Dim tmpArr, Arr()
  Dim szConnect As String, szSQL As String, tmp As String
  Dim lCount As Long, lR As Long, lC As Long, lVer As Long
  lVer = Val(Application.Version)
  Set rsCon = CreateObject("ADODB.Connection")
  Set rsData = CreateObject("ADODB.Recordset")
  Set cat = CreateObject("ADOX.Catalog")
 
  If lVer < 12 Then
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 8.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  Else
    szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 12.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  End If
  If SheetName = "" Then
    Dim Dbs  As Object, db As Object
    Set Dbs = CreateObject("DAO.DBEngine." & IIf(lVer < 12, "36", "120"))
    Set db = Dbs.OpenDatabase(FileName, False, False, "Excel 8.0;")
    tmp = db.TableDefs(0).Name
    tmp = Replace(tmp, " ", "?")
    tmp = Replace(tmp, "'", " ")
    tmp = WorksheetFunction.Trim(tmp)
    tmp = Replace(tmp, " ", "'")
    tmp = Replace(tmp, "?", " ")
    SheetName = tmp
    db.Close
    Set Dbs = Nothing: Set db = Nothing
  End If
  If Right(SheetName, 1) <> "$" Then SheetName = SheetName & "$"
  rsCon.Open szConnect
  cat.ActiveConnection = rsCon
 
  szSQL = "SELECT * FROM [" & SheetName & RangeAddress & "];"
  rsData.Open szSQL, rsCon, 0, 1, 1
  tmpArr = rsData.GetRows
  ReDim Arr(UBound(tmpArr, 2) - UseTitle, UBound(tmpArr, 1) + 1)
  If UseTitle Then
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(0, lC) = rsData.Fields(lC).Name
    Next
  End If
  For lR = LBound(tmpArr, 2) To UBound(tmpArr, 2)
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(lR - UseTitle, lC) = tmpArr(lC, lR)
    Next
  Next
  rsData.Close: Set rsData = Nothing
  rsCon.Close: Set rsCon = Nothing
  GetData = Arr
End Function

Sub Main()
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    SheetName = "Sheet1": RangeAddress = "A8:V10000"
    For Each FileItem In vFile
      FileName = CStr(FileItem)
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If
End Sub
Cách dùng:
- Cho code trên vào Module
- Chạy sub Main
- Cửa sổ Open File hiện ra, dùng chuột chọn file đầu, bấm giữ phím Shift rồi còn file cuối ---> Bấm nút Open
- Chờ trong giây lát, khi MsgBox hiện ra báo hiệu hoàn tất, kiểm tra lại dữ liệu trong file hiện hành xem đã cập nhật chưa
-------------
Lưu ý: File TongHop phải được lưu theo định dạng XLSM (nếu lưu bằng XLSX sẽ mất sạch code)
Cho em hỏi chút. Em muốn chèn thêm 1 cột đầu tiên trong File TongHop lấy tên các file gộp theo từng dòng thì làm thế nào ạ.
 
Upvote 0
Dùng ADO sẽ không cần mở file:
Mã:
Function GetData(ByVal FileName As String, ByVal SheetName As String, ByVal RangeAddress As String, _
            ByVal HasTitle As Boolean, ByVal UseTitle As Boolean)
           
  Dim rsCon As Object, rsData As Object, cat As Object, tbl As Object
  Dim tmpArr, Arr()
  Dim szConnect As String, szSQL As String, tmp As String
  Dim lCount As Long, lR As Long, lC As Long, lVer As Long
  lVer = Val(Application.Version)
  Set rsCon = CreateObject("ADODB.Connection")
  Set rsData = CreateObject("ADODB.Recordset")
  Set cat = CreateObject("ADOX.Catalog")
 
  If lVer < 12 Then
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 8.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  Else
    szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 12.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  End If
  If SheetName = "" Then
    Dim Dbs  As Object, db As Object
    Set Dbs = CreateObject("DAO.DBEngine." & IIf(lVer < 12, "36", "120"))
    Set db = Dbs.OpenDatabase(FileName, False, False, "Excel 8.0;")
    tmp = db.TableDefs(0).Name
    tmp = Replace(tmp, " ", "?")
    tmp = Replace(tmp, "'", " ")
    tmp = WorksheetFunction.Trim(tmp)
    tmp = Replace(tmp, " ", "'")
    tmp = Replace(tmp, "?", " ")
    SheetName = tmp
    db.Close
    Set Dbs = Nothing: Set db = Nothing
  End If
  If Right(SheetName, 1) <> "$" Then SheetName = SheetName & "$"
  rsCon.Open szConnect
  cat.ActiveConnection = rsCon
 
  szSQL = "SELECT * FROM [" & SheetName & RangeAddress & "];"
  rsData.Open szSQL, rsCon, 0, 1, 1
  tmpArr = rsData.GetRows
  ReDim Arr(UBound(tmpArr, 2) - UseTitle, UBound(tmpArr, 1) + 1)
  If UseTitle Then
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(0, lC) = rsData.Fields(lC).Name
    Next
  End If
  For lR = LBound(tmpArr, 2) To UBound(tmpArr, 2)
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(lR - UseTitle, lC) = tmpArr(lC, lR)
    Next
  Next
  rsData.Close: Set rsData = Nothing
  rsCon.Close: Set rsCon = Nothing
  GetData = Arr
End Function

Sub Main()
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    SheetName = "Sheet1": RangeAddress = "A8:V10000"
    For Each FileItem In vFile
      FileName = CStr(FileItem)
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If
End Sub
Cách dùng:
- Cho code trên vào Module
- Chạy sub Main
- Cửa sổ Open File hiện ra, dùng chuột chọn file đầu, bấm giữ phím Shift rồi còn file cuối ---> Bấm nút Open
- Chờ trong giây lát, khi MsgBox hiện ra báo hiệu hoàn tất, kiểm tra lại dữ liệu trong file hiện hành xem đã cập nhật chưa
-------------
Lưu ý: File TongHop phải được lưu theo định dạng XLSM (nếu lưu bằng XLSX sẽ mất sạch code)

Chào anh. Em thấy code này chạy tốt. Vậy nếu các sheet cần lấy dữ liệu ở đây là sheet2 của CA1.xlsx; CA2.xlsx thì dòng code mình phải điều chỉnh như thế nào để lấy dữ liệu đúng sheet. Xin cảm ơn
 
Upvote 0
Dùng ADO sẽ không cần mở file:
Mã:
em chào anh ndu96081631.
như file anh giới thiệu thì đang tổng hợp theo dòng , em muốn chuyển code để tổng hợp theo cột thì mình phải thay đổi code thế nào. 
mong anh chỉ giúp,


Function GetData(ByVal FileName As String, ByVal SheetName As String, ByVal RangeAddress As String, _
            ByVal HasTitle As Boolean, ByVal UseTitle As Boolean)
           
  Dim rsCon As Object, rsData As Object, cat As Object, tbl As Object
  Dim tmpArr, Arr()
  Dim szConnect As String, szSQL As String, tmp As String
  Dim lCount As Long, lR As Long, lC As Long, lVer As Long
  lVer = Val(Application.Version)
  Set rsCon = CreateObject("ADODB.Connection")
  Set rsData = CreateObject("ADODB.Recordset")
  Set cat = CreateObject("ADOX.Catalog")
 
  If lVer < 12 Then
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 8.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  Else
    szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 12.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  End If
  If SheetName = "" Then
    Dim Dbs  As Object, db As Object
    Set Dbs = CreateObject("DAO.DBEngine." & IIf(lVer < 12, "36", "120"))
    Set db = Dbs.OpenDatabase(FileName, False, False, "Excel 8.0;")
    tmp = db.TableDefs(0).Name
    tmp = Replace(tmp, " ", "?")
    tmp = Replace(tmp, "'", " ")
    tmp = WorksheetFunction.Trim(tmp)
    tmp = Replace(tmp, " ", "'")
    tmp = Replace(tmp, "?", " ")
    SheetName = tmp
    db.Close
    Set Dbs = Nothing: Set db = Nothing
  End If
  If Right(SheetName, 1) <> "$" Then SheetName = SheetName & "$"
  rsCon.Open szConnect
  cat.ActiveConnection = rsCon
 
  szSQL = "SELECT * FROM [" & SheetName & RangeAddress & "];"
  rsData.Open szSQL, rsCon, 0, 1, 1
  tmpArr = rsData.GetRows
  ReDim Arr(UBound(tmpArr, 2) - UseTitle, UBound(tmpArr, 1) + 1)
  If UseTitle Then
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(0, lC) = rsData.Fields(lC).Name
    Next
  End If
  For lR = LBound(tmpArr, 2) To UBound(tmpArr, 2)
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(lR - UseTitle, lC) = tmpArr(lC, lR)
    Next
  Next
  rsData.Close: Set rsData = Nothing
  rsCon.Close: Set rsCon = Nothing
  GetData = Arr
End Function

Sub Main()
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    SheetName = "Sheet1": RangeAddress = "A8:V10000"
    For Each FileItem In vFile
      FileName = CStr(FileItem)
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If
End Sub
Cách dùng:
- Cho code trên vào Module
- Chạy sub Main
- Cửa sổ Open File hiện ra, dùng chuột chọn file đầu, bấm giữ phím Shift rồi còn file cuối ---> Bấm nút Open
- Chờ trong giây lát, khi MsgBox hiện ra báo hiệu hoàn tất, kiểm tra lại dữ liệu trong file hiện hành xem đã cập nhật chưa
-------------
Lưu ý: File TongHop phải được lưu theo định dạng XLSM (nếu lưu bằng XLSX sẽ mất sạch code)
 
Upvote 0
các file có cấu trúc cột dòng khác nhau, dữ liệu minh họa và giải thích quá sơ sài, nên code khó viết đúng ý
Mã:
Sub TongHop()
  Dim Wb As Workbook, WbMain As Workbook, Ws As Worksheet, Dic As Object, Fso As Object, ObjFoder As Object, ObjFile As Object
  Dim Darr(), ShArr(), ShName As String, Tem
  Dim i As Integer, j As Integer, k As Integer, FistC As Byte, LastC As Long, FistR As Byte, LastR As Long
  Application.ScreenUpdating = False
  Set WbMain = ThisWorkbook
  Set Dic = CreateObject("scripting.dictionary")
  ReDim ShArr(i To WbMain.Sheets.Count)
  For k = 1 To WbMain.Sheets.Count
    ShArr(k) = 2
    With WbMain.Sheets(k)
      Dic.Add .Name, k
      LastR = .Range("A" & Rows.Count).End(xlUp).Row
      LastC = .Range("A1").End(xlToRight).Column
      If LastR > 1 And LastC < 16000 Then .Range("A2").Resize(LastR - 1, LastC).ClearContents
    End With
  Next k
  Set Fso = CreateObject("Scripting.FileSystemObject")
  Set ObjFoder = Fso.GetFolder(ThisWorkbook.Path)
  For Each ObjFile In ObjFoder.Files
    If Right(ObjFile, Len(WbMain.Name)) <> WbMain.Name And Fso.GetExtensionName(ObjFile) Like "xls*" Then
      Set Wb = Workbooks.Open(ObjFile)
      For Each Ws In Wb.Sheets
        ShName = Ws.Name
        If Dic.exists(ShName) Then
          If ShName = "Product_Location_3a" Then
            FistR = 3:  FistC = 2
          ElseIf ShName = "Product_Global" Then
            FistR = 3:  FistC = 1
          Else
            FistR = 2:  FistC = 1
          End If
          LastR = Ws.Range("B" & Rows.Count).End(xlUp).Row
          If LastR >= FistR Then
            LastC = Ws.Range("A1").End(xlToRight).Column
            Darr = Ws.Range(Ws.Cells(FistR, FistC), Ws.Cells(LastR, LastC)).Value
            k = Dic.Item(ShName)
            WbMain.Sheets(k).Range("B" & ShArr(k)).Resize(UBound(Darr), UBound(Darr, 2)) = Darr
            ShArr(k) = ShArr(k) + UBound(Darr)
          End If
        End If
      Next Ws
      Wb.Close False
    End If
  Next
  Application.ScreenUpdating = True
End Sub
 
Upvote 0
Chào Anh/Chị và Các bạn diễn đàn GPE,
File CA1&CA3 mình sửa tên Sheet1 thành "Data", trong code mình cũng sửa Sheet1 thành "Data".
Nhưng khi mình tổng hợp nếu lỡ chọn cả 03 file CA1, CA2 và CA3(file CA2 không có Sheet "Data") thì kết dữ liệu file CA2 vẫn được tổng hợp.
Anh chị và các bạn xem giúp dùm mình nếu lỡ chọn những file không có tên Sheet cần tổng hợp thì dữ liệu không được tổng hợp vào.
Fle mình nêu ra đây là một ví dụ cụ thể.
Rất mong nhận được sự giúp đỡ của anh, chị và các bạn trên diễn đàn GPE.
Chân thành cám ơn.
 

File đính kèm

Upvote 0
code gộp dữ liệu của thành viên meoluoi2010 cũng rất tốt
 

File đính kèm

Upvote 0
Bạn chạy mỗi code này. Còn code trong file tôi không sửa nha

Mã:
Option Explicit

Public Sub GPE()
Dim FOb As Object, Fso As Object, Item, cn As Object, rs As Object, fOld As String, fNew As String
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set Fso = CreateObject("Scripting.FileSystemObject")
Set cn = CreateObject("ADODB.Connection")
If Application.Version < 12 Then
    fOld = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    fNew = ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
Else
    fOld = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
    fNew = ";Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
End If
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
Range("A7").CurrentRegion.Offset(1).ClearContents
On Error Resume Next
For Each Item In .SelectedItems
    If Left(Item, 1) <> "~" Then
        cn.Open (fOld & Item & fNew)
            Set rs = cn.Execute("select * from [Data$A8:V] where F1 Is Not Null")
            If Not rs.EOF Then Range("A65000").End(3)(2).CopyFromRecordset rs
            rs.Close
            cn.Close
    End If
Next Item
End With
Set cn = Nothing
Set rs = Nothing
MsgBox "Done!"
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Mình cảm ơn bạn hpkhuong nhé, mình sẽ sử dụng code này và trong quá trình sử dụng nếu có phát sinh vấn đề cần chỉnh sửa thì rất mong nhận được sự giúp đỡ của bạn.
Chân thành cảm ơn.
 
Upvote 0
Các bác cho hỏi làm sao lấy dữ liệu mà dàn hàng ngang thay vì nối tiếp theo cột ko a

như ví du #1
 

File đính kèm

Upvote 0
Xin hỏi thêm là nếu muốn tự động đọc các file theo [Danh sách], copy dữ liệu từ 1 vùng dữ liệu thỏa mãn điều kiện vào vùng tương ứng trong file tổng hợp thì
Bạn chạy mỗi code này. Còn code trong file tôi không sửa nha

Mã:
Option Explicit

Public Sub GPE()
Dim FOb As Object, Fso As Object, Item, cn As Object, rs As Object, fOld As String, fNew As String
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set Fso = CreateObject("Scripting.FileSystemObject")
Set cn = CreateObject("ADODB.Connection")
If Application.Version < 12 Then
    fOld = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    fNew = ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
Else
    fOld = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
    fNew = ";Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
End If
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
Range("A7").CurrentRegion.Offset(1).ClearContents
On Error Resume Next
For Each Item In .SelectedItems
    If Left(Item, 1) <> "~" Then
        cn.Open (fOld & Item & fNew)
            Set rs = cn.Execute("select * from [Data$A8:V] where F1 Is Not Null")
            If Not rs.EOF Then Range("A65000").End(3)(2).CopyFromRecordset rs
            rs.Close
            cn.Close
    End If
Next Item
End With
Set cn = Nothing
Set rs = Nothing
MsgBox "Done!"
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Xin hỏi thêm là nếu muốn tự động đọc các file theo [Danh sách] đã có, copy dữ liệu theo [điều kiện] vào vùng tương ứng trong file tổng hợp thì đoạn code cần bổ sung thêm thế nào vậy bạn?
 
Upvote 0

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

Back
Top Bottom