Tổng hợp dữ liệu từ các file con vào file chung (1 người xem)

  • Thread starter Thread starter 260135
  • Ngày gửi Ngày gửi

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

260135

Thành viên mới
Tham gia
7/7/13
Bài viết
6
Được thích
0
Hi AC trên diễn đàn, em có 1 vấn đề cần nhờ các AC tư vấn và giúp đỡ:

Hiện em đang có 1 file báo cáo chung "Bao cao tong hop.xlsx" với 2286 bản ghi (STT từ 1 -> 2286 theo hàng) và các trường (theo cột). Từ báo cáo chung này em sẽ chia cho 24 bạn làm và cập nhật số liệu vào các trường từ cột M -> cột U. 1 bạn sẽ được chia 95 bản ghi theo STT lần lượt từ trên xuống dưới - file "Bao cao tong hop - AngNTK.xls" (ví dụ: bạn 1 STT từ 1 -> 95, bạn 2 STT từ 96 -> 190, bạn 3 STT từ 191 -> 285, ... và lần lượt cho đến bạn 24). Các bản ghi (theo hàng) từ 1 -> 95 và các trường (theo cột) trong 2 file này giống nhau.

Câu hỏi 1: Có cách nào để 24 báo cáo con được tổng hợp về báo cáo chung nhanh nhất? Mỗi lần báo cáo con thay đổi thì báo cáo chung cũng sẽ được cập nhật?

Câu hỏi 2: File báo cáo chung "Bao cao tong hop.xlsx" và file con "Bao cao tong hop - AngNTK.xls" có ảnh hưởng tới việc tổng hợp dữ liệu không?

Cám ơn các AC!
 

File đính kèm

Lần chỉnh sửa cuối:
Hi AC trên diễn đàn, em có 1 vấn đề cần nhờ các AC tư vấn và giúp đỡ:

Hiện em đang có 1 file báo cáo chung "Bao cao tong hop.xlsx" với 2286 bản ghi (STT từ 1 -> 2286 theo hàng) và các trường (theo cột). Từ báo cáo chung này em sẽ chia cho 24 bạn làm và cập nhật số liệu vào các trường từ cột M -> cột U. 1 bạn sẽ được chia 95 bản ghi theo STT lần lượt từ trên xuống dưới - file "Bao cao tong hop - AngNTK.xls" (ví dụ: bạn 1 STT từ 1 -> 95, bạn 2 STT từ 96 -> 190, bạn 3 STT từ 191 -> 285, ... và lần lượt cho đến bạn 24). Các bản ghi (theo hàng) từ 1 -> 95 và các trường (theo cột) trong 2 file này giống nhau.

Câu hỏi 1: Có cách nào để 24 báo cáo con được tổng hợp về báo cáo chung nhanh nhất? Mỗi lần báo cáo con thay đổi thì báo cáo chung cũng sẽ được cập nhật?

Câu hỏi 2: File báo cáo chung "Bao cao tong hop.xlsx" và file con "Bao cao tong hop - AngNTK.xls" có ảnh hưởng tới việc tổng hợp dữ liệu không?


Cám ơn các AC!

Với dữ liệu của bạn thì việc tổng hợp dữ liệu từ nhiều file vào 1 file chẳng phải khó khăn gì
Có điều tôi không hiểu câu 2.... Ảnh hưởng là ẢNH HƯỞNG cái gì
 
Với dữ liệu của bạn thì việc tổng hợp dữ liệu từ nhiều file vào 1 file chẳng phải khó khăn gì
Có điều tôi không hiểu câu 2.... Ảnh hưởng là ẢNH HƯỞNG cái gì

_ Tức là máy tính của 24 bạn đang làm sử dụng Exel 2003, em đang dùng Exel 2007. Dữ liệu khi tổng hợp từ Exel 2003 sang 2007 có xảy ra lỗi gì không ạ?
_ Câu 1 anh có thể giúp em không ạ?
 
_ Tức là máy tính của 24 bạn đang làm sử dụng Exel 2003, em đang dùng Exel 2007. Dữ liệu khi tổng hợp từ Exel 2003 sang 2007 có xảy ra lỗi gì không ạ?

Ah... thế thì không có vấn đề
_ Câu 1 anh có thể giúp em không ạ?
Xin hỏi lại: 24 file con ấy nằm ở đâu? Nằm trên từng máy của các thành viên hay bạn sẽ mang 24 file ấy cho vào máy của bạn?
Trường hợp 24 file con nằm trên máy tính của bạn thì tôi sẽ dùng phương pháp lập trình (cụ thể là ADO) để tổng hợp!
Bạn đồng ý giải pháp lập trình chứ? Vì nếu dùng công thức hoặc công cụ có sẵn thì tôi... thua
 
_ 24 file con đó em sẽ lấy về máy em sau khi họ làm xong. Anh lập trình giúp em đoạn đó được không ạ? Cái này em không có khả năng.
_ Anh hướng dẫn cho em một chút về cách sử dụng nhé.

Cám ơn anh!
 
Lần chỉnh sửa cuối:
_ 24 file con đó em sẽ lấy về máy em sau khi họ làm xong. Anh lập trình giúp em đoạn đó được không ạ? Cái này em không có khả năng.
_ Anh hướng dẫn cho em một chút về cách sử dụng nhé.

Cám ơn anh!

Bạn vui lòng gửi lên đây 1 vài file con nữa cho dễ làm nha
(chỉ có 1 file con sẽ rất khó kiểm tra độ chính xác)
 

File đính kèm

Em gửi 5 file của 5 người.

Code dưới đây sẽ được đặt trong file TONGHOP
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
Mã:
Sub Main()
  Dim Arr, vFile, Item
  Dim FileName As String, SheetName As String, RangeAddress As String
  vFile = Application.GetOpenFilename("Excel Files, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    SheetName = "xDSL"
    RangeAddress = "A2:Z100"
    For Each Item In vFile
      FileName = CStr(Item)
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        Arr = GetData(FileName, SheetName, RangeAddress, False, False)
        With Range("A60000").End(xlUp).Offset(1)
          .Resize(UBound(Arr, 1) + 1, UBound(Arr, 2) + 1).Value = Arr
        End With
      End If
    Next
  End If
End Sub
Trong file tôi đã thiết kế sẵn 1 cái nút, việc của bạn là:
- Mở file, nhấn nút
- Cửa sổ Open File hiện ra, bạn dùng chuột chọn file đầu tiên, bấm giữ phím Shift rồi dùng chuột chọn file cuối
- Bấm Open và chở xem kết quả
--------------
Lưu ý: Để code hoạt động được, bắt buộc bạn phải lưu file theo định dạng XLSM nhé (hoặc XLS cũng được).
 

File đính kèm

Em đã download file về và thử, em muốn hỏi anh thêm một chút:
(1) Khi em mở file "TONGHOP.xlsm" , bấm Get Data, chọn 5 file con dữ liệu từ 5 file con đã được đổ vào file chung. Sau đó em save as ra thành file để gửi báo cáo. Vấn đề này OK.
(2) Khi dữ liệu trên file con thay đổi và gửi về em lại tiến hành lại như bước (1)?
(3) Ở file chung em nhận thấy 2286 bản ghi (theo hàng) đã được bỏ đi và chèn vào bằng đoạn code trong Marco. Đúng không anh?
(4) Nếu bước (3) đúng em sử dụng luôn file "TONGHOP.xlsm" mà anh đã tạo đúng không? Vì file gốc "Bao cao tong hop.xlsx" lúc sáng em upload, em không biết tạo ra nút Get Data như thế nào, và đưa đoạn code vào như thế nào! Tiện thể anh chỉ dẫn thêm cho em đoạn này được không ạ (từ file gốc của em "Bao cao tong hop.xlsx" anh đã xử lý những gì để ra file "TONGHOP.xlsm"?
(5) Khi em sử dụng đoạn code này em sẽ nói với mọi người là do anh có nick "ndu96081631 " trên diễn đang GPE viết cho. Rất cám ơn anh khi đưa khả năng của mình giúp đỡ nhưng người có khả năng kém hơn! Trân trọng!
 
Lần chỉnh sửa cuối:
(4) Nếu bước (3) đúng em sử dụng luôn file "TONGHOP.xlsm" mà anh đã tạo đúng không? Vì file gốc "Bao cao tong hop.xlsx" lúc sáng em upload, em không biết tạo ra nút Get Data như thế nào, và đưa đoạn code vào như thế nào! Tiện thể anh chỉ dẫn thêm cho em đoạn này được không ạ (từ file gốc của em "Bao cao tong hop.xlsx" anh đã xử lý những gì để ra file "TONGHOP.xlsm"?

Bấm Alt + F11 sẽ nhìn thấy code
Tôi chỉ là cho code vào file XLSX rồi Save As nó thành file mới thôi mà (file TONGHOP.xlsm)... đơn giản vì loại file XLSX không cho phép lưu code VBA, nếu cố tình lưu thì nó cũng sẽ xóa sạch hết code đã viết
------------------------------------
_ Em chưa kịp xem đã có người download trước mà cũng chẳng cảm ơn, quá nản cho ai làm việc đó!
Chuyện người ta có cảm ơn hay không là chuyện cá nhân người ta, tôi không quan tâm
Tôi chỉ làm việc gì mình thích (hứng)... ngược lại dù có cảm ơn 1000 lần cũng.. cóc làm
Ẹc... Ẹc...
 
Lần chỉnh sửa cuối:
Anh cho em hỏi thêm về ý thứ (2) ở bên trên?
 
Anh cho em hỏi thêm về ý thứ (2) ở bên trên?

- Giả sử trong file TONGHOP.xlsm đang chứa 95 dòng dữ liệu
- Giờ nếu bạn nhấn nút tiếp tục import thêm dữ liệu từ file nào đó thì lập tức dữ liệu mới sẽ được đặt ở dưới dữ liệu đang có, tức từ dòng 96 trở đi
Theo nguyên tắc đó thì: Bạn muốn cập nhật mới thì cứ việc... nhấn nút thôi (dữ liệu cũ vẫn còn nha)
 

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

Back
Top Bottom