Các bác chỉ giúp em cách lấy dữ liệu tự động từ nhiều file vào 1 file

Liên hệ QC

ajiang

Thành viên mới
Tham gia
14/1/09
Bài viết
3
Được thích
0
Em có 120 file bảng điểm của 120 học sinh khác nhau, mỗi file có tên dưới dạng "ten hoc sinh.xls", tất nhiên là cấu trúc bảng trong mỗi file là giống hệt nhau. Bi giờ em muốn làm 1 file tổng hợp trong đó muốn thông kê điểm của từng môn hoặc điểm trung bình của những học sinh trên thì có cách nào không chứ làm thủ công từng dòng thì cực quá. Các bác giúp em với. (Tất cả các file bảng điểm của học sinh được đặt trong cùng thư mục)
Em để file mẫu đính kèm phía dưới.
 

File đính kèm

  • Test.zip
    16.7 KB · Đọc: 71
Lần chỉnh sửa cuối:
Em có 120 file bảng điểm của 120 học sinh khác nhau, mỗi file có tên dưới dạng "ten hoc sinh.xls", tất nhiên là cấu trúc bảng trong mỗi file là giống hệt nhau. Bi giờ em muốn làm 1 file tổng hợp trong đó muốn thông kê điểm của từng môn hoặc điểm trung bình của những học sinh trên thì có cách nào không chứ làm thủ công từng dòng thì cực quá. Các bác giúp em với. (Tất cả các file bảng điểm của học sinh được đặt trong cùng thư mục)
Bạn phải đưa lên một vài file điểm học sinh và file tổng hợp. Ai biết cấu trúc các file của bạn như thế nào mà giúp.
 
Bạn phải đưa lên một vài file điểm học sinh và file tổng hợp. Ai biết cấu trúc các file của bạn như thế nào mà giúp.
Đơn giản thì mình chỉ muốn làm tự động việc lấy dữ liệu ở 1 ô có địa chỉ nhất định của nhiều file khác nhau vào 1 cột nào đó của 1 sheet trong 1 file thôi, cái bảng điểm trên chỉ là 1 ví dụ cho dễ hiểu.
 
Đơn giản thì mình chỉ muốn làm tự động việc lấy dữ liệu ở 1 ô có địa chỉ nhất định của nhiều file khác nhau vào 1 cột nào đó của 1 sheet trong 1 file thôi, cái bảng điểm trên chỉ là 1 ví dụ cho dễ hiểu.
Nếu bạn không đưa file lên thì dù mọi người có cho bạn code cũng chưa chắc bạn có khả năng sửa lại phù hợp với file của mình---> Đúng không? Vậy nên mọi người cũng không cần mất công viết 1 code vu vơ rồi sau đó lại phải giải thích đi giải thích lại nhiều lần
 
Em có 120 file bảng điểm của 120 học sinh khác nhau, mỗi file có tên dưới dạng "ten hoc sinh.xls", tất nhiên là cấu trúc bảng trong mỗi file là giống hệt nhau. Bi giờ em muốn làm 1 file tổng hợp trong đó muốn thông kê điểm của từng môn hoặc điểm trung bình của những học sinh trên thì có cách nào không chứ làm thủ công từng dòng thì cực quá. Các bác giúp em với. (Tất cả các file bảng điểm của học sinh được đặt trong cùng thư mục)
Em để file mẫu đính kèm phía dưới.
SAO LẠI CÓ CÁI DỮ LIỆU 1 NGƯỜI MỘT FILE VẬY TRỜI
NẾU CÓ HƠN 10000 NGƯỜI THÌ CHẾT LUÔN
VÀ BÁC BIll GATE SẼ PHÁ SẢN MẤT VÌ SẼ KHÔNG AI CÒN SỬ DỤNG EXCEL NỮA
 
Chỉnh sửa lần cuối bởi điều hành viên:
Em có 120 file bảng điểm của 120 học sinh khác nhau, mỗi file có tên dưới dạng "ten hoc sinh.xls", tất nhiên là cấu trúc bảng trong mỗi file là giống hệt nhau. Bi giờ em muốn làm 1 file tổng hợp trong đó muốn thông kê điểm của từng môn hoặc điểm trung bình của những học sinh trên thì có cách nào không chứ làm thủ công từng dòng thì cực quá. Các bác giúp em với. (Tất cả các file bảng điểm của học sinh được đặt trong cùng thư mục)
Em để file mẫu đính kèm phía dưới.

Gộp tất cả các file có chung 1 folder thành 1 file, dùng PivotTable để tổng hợp.
Bạn xem file nhé.
P/S: Lưu ý là giải nén rồi mới chạy code nhé
 

File đính kèm

  • Test.rar
    40.8 KB · Đọc: 109
Đúng là cần phải tham gia với bạn về việc tổ chức dữ liệu sao cho hợp lý và tiện cho việc ghi chép theo dõi, trích rút dữ liệu sau này. Mình nhất trí với bạn Thuong, chỉ cần 1 file là đủ:
1/Sheet DM
-DMKhoi: Khối 5, khối 6,....
-DMLop: Các lớp (Nhóm theo DMKhoi)
-MAHS: Mã Học sinh, nhóm theo DMLop
-DMMon: Các môn học.
-Loai: Loại điểm: 15 phút, 1 tiết, Học kỳ...(Có cột quy định hệ số quy đổi để đánh giá)
2/Sheet Data: Chỉ cần các cột:
+ MaHS:Nhập mã HS
+ Mon: Nhap theo DMMon.
+Loai: Loại điểm
+Điểm: Số điểm.
(Hoặc dồn các bộ môn và loại điểm của 1 học sinh vào 1 dòng)

Như vậy thôi là bạn có thể vẽ vời đủ dạng báo cáo với tất cả hoc sinh trong trường.
 
Lần chỉnh sửa cuối:
Gộp tất cả các file có chung 1 folder thành 1 file, dùng PivotTable để tổng hợp.
Bạn xem file nhé.
P/S: Lưu ý là giải nén rồi mới chạy code nhé
Dùng PivotTable tất nhiên rất hiệu quả, tuy nhiên xin mạn phép sửa code cho ngắn gọn hơn:
- Đầu tiên cho các file con vào 1 thư mục riêng, file Tonghop nằm 1 mình
PHP:
Private Sub GetData(sFile As String, sSheet As String, sRange As String, tRange As Range)
  Dim Temp As String
  Temp = "'" & Replace(sFile, Dir(sFile), "[" & Dir(sFile) & "]") & sSheet & "'!" & sRange
  With Range(sRange)
    With tRange.Resize(.Rows.Count, .Columns.Count)
      .FormulaArray = "=" & Temp
      .Value = .Value
    End With
  End With
End Sub
PHP:
Sub GopSheet()
  Dim i As Long, FolderName As String
  Range("A2:C10000").ClearContents
  FolderName = ThisWorkbook.Path & "\SrcFile"
  With Application.FileSearch
    .LookIn = FolderName
    .FileType = msoFileTypeExcelWorkbooks
    .Execute
    For i = 1 To .FoundFiles.Count
      GetData .FoundFiles(i), "Sheet1", "A2:B6", Range("B65536").End(xlUp).Offset(1)
      Range("A1").CurrentRegion.SpecialCells(4).Value = Replace(Dir(.FoundFiles(i)), ".xls", "")
    Next
  End With
  Sheet1.PivotTables("PivotTable1").PivotCache.Refresh
End Sub
 

File đính kèm

  • Test.rar
    38.7 KB · Đọc: 109
Lần chỉnh sửa cuối:
Thanks các bác đã đóng góp, em sẽ ngâm cứu xem. Trên thực tế nhiều khi cũng gặp trường hợp như vậy mà, ví dụ tổng hợp báo cáo của nhiều nơi gửi về trong điều kiện chưa có ứng dụng sử dụng database thì vẫn phải tổng hợp = excel thôi.
 
Lần chỉnh sửa cuối:
Sử dụng ADODC để tập hợp dữ liệu.

Do có nhiều bài của các bạn đề cập về vấn đề này, mình thử viết File sử dụng ADODC để kết nối rút dữ liệu và cho kết quả cũng khả quan. Các bạn tham khảo và vận dụng cho file của mình. Vấn đề cho ta vận dụng 1 kỹ thuật khá hay mà anh em GPE còn ít dùng.
Mình chưa viết các thủ tục kiểm tra File hay Name có tồn tại hay không.
Rất cảm ơn anh Ca_Dafi. Code có tham khảo bài của anh .

Mã:
Option Explicit
  Public Cn As Variant, Rec As Variant, mySQL As String
  ===============================================================
  'DUNG ADODC TRICH DU LIEU
  Sub Getdata(ByVal FName As String, ByVal hs As String)
  Dim dich As Range
  Cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FName & _
  ";Persist Security Info=False; Extended Properties=Excel 8.0;"
  Cn.Open
  mySQL = "SELECT * FROM [Data]"
  Rec.Open mySQL, Cn, adOpenKeyset, adLockOptimistic
  Set dich = TH.[b56536].End(xlUp).Offset(1)
  dich.CopyFromRecordset Rec
  dich.Offset(, -1).Resize(Rec.RecordCount) = hs
  Rec.Close
  Cn.Close
  End Sub
  ===============================================================
  'TONG HOP THEO DANH SACH
  Sub THDL()
  Dim i
  Dim hs, ten As String
  Set Cn = New ADODB.Connection
  Set Rec = New ADODB.Recordset
  TH.[a2:c56536].ClearContents
  For i = 1 To T.Range("DST").Cells.Count
  hs = T.Range("DST").Rows(i)
  ten = ThisWorkbook.Path & "\DATA\" & hs
  Getdata ten, hs
  Next
  Set Rec = Nothing
  Set Cn = Nothing
  End Sub
  ===============================================================
  'TONG HOP TAT CA CAC FILE TRONG THU MUC DATA
  Sub TH_ALL()
  Dim fs, i
  Dim hs, ten As String
  Set Cn = New ADODB.Connection
  Set Rec = New ADODB.Recordset
  TH.[a2:c56536].ClearContents
  Set fs = Application.FileSearch
  With fs
      .LookIn = ThisWorkbook.Path & "\DATA"
      .Filename = "*.xls"
      If .Execute > 0 Then
          For i = 1 To .FoundFiles.Count
              ten = .FoundFiles(i)
              hs = Right(.FoundFiles(i), Len(.FoundFiles(i)) _
              - InStrRev(.FoundFiles(i), "\"))
              hs = Replace(hs, ".xls", "")
           Getdata ten, hs
          Next i
      Else
          MsgBox "There were no files found."
      End If: End With
   Set Rec = Nothing: Set Cn = Nothing
  End Sub
   ===============================================================
  Sub xoa()
   TH.[a2:c56536].ClearContents
   End Sub
Một lưu ý quan trọng là phải xả nén ra ổ đĩa mới có địa chỉ thư mục data (Các file chi tiết chứa ở đây)
 

File đính kèm

  • Test.rar
    48.6 KB · Đọc: 106
Lần chỉnh sửa cuối:
Do có nhiều bài của các bạn đề cập về vấn đề này, mình thử viết File sử dụng ADODC để kết nối rút dữ liệu và cho kết quả cũng khả quan. Các bạn tham khảo và vận dụng cho file của mình. Vấn đề cho ta vận dụng 1 kỹ thuật khá hay mà anh em GPE còn ít dùng.
Mình chưa viết các thủ tục kiểm tra File hay Name có tồn tại hay không.
Rất cảm ơn anh Ca_Dafi. Code có tham khảo bài của anh .
Em rút ra được 1 kinh nghiệm khá hay khi làm việc với loại bài toán này:
- Nếu ta biết trước tên sheet thì không cần phải dùng đến ADO
- Chỉ dùng ADO khi tên sheet không xác định hoặc các file có tên sheet khác nhau
- Cách gõ công thức liên kết trực tiếp đến dữ liệu nguồn luôn cho tốc độ nhanh hơn cách dùng ADO (gõ trực tiếp là gõ theo kiểu: 'Đường dần [Tên file] Tên sheet'! địa chỉ cell)
 
Lần chỉnh sửa cuối:
Em rút ra được 1 kinh nghiệm khá hay khi làm việc với loại bài toán này:
- Nếu ta biết trước tên sheet thì không cần phải dùng đến ADO
- Chỉ dùng ADO khi tên sheet không xác định hoặc các file có tên sheet khác nhau
- Cách gõ công thức liên kết trực tiếp đến dữ liệu nguồn luôn cho tốc độ nhanh hơn cách dùng ADO (gõ trực tiếp là gõ theo kiểu: 'Đường dần [Tên file] Tên sheet'! địa chỉ cell)

Cái việc link trực tiếp như Ndu nói mình hay làm như sau:
-Mở cả file nguồn và file đích
-Sang file nguồn chọn cả bảng, bỏ phần tiêu đề--->Copy.
-Sang file đích đặt con trỏ vào ô đầu tiên của vùng xuất dữ liệu--->Edit--->Paste Special--->Paste link

Nhưng hạn chế là không thay đổi được vị trí của file nguồn, nếu không sửa công thức.
Nhưng như bạn ấy nói thì vài trăm file tương ứng với vài trăm học sinh mà chép kiểu này cũng oải.
 
Lần chỉnh sửa cuối:
Cái việc link trực tiếp như Ndu nói mình hay làm như sau:
-Mở cả file nguồn và file đích
-Sang file nguồn chọn cả bảng, bỏ phần tiêu đề--->Copy.
-Sang file đích đặt con trỏ vào ô đầu tiên của vùng xuất dữ liệu--->Edit--->Paste Special--->Paste link

Nhưng hạn chế là không thay đổi được vị trí của file nguồn, nếu không sửa công thức.
Ah.. không, ý em nói là dùng cách này nhưng viết vào trong code VBA ---> Giống như em đã làm ở bài #8 ấy
Em nghĩ rằng: Có tên file, có tên sheet, có địa chỉ cell thì ta chẳng việc gì phải dùng đến ADO cả ---> Mọi thứ đã đủ cho 1 công thức link
Đàng nào thì ADO cũng có mở file nguồn (dù là mở ngầm)... Còn cách dùng như em nói ở trên mới thật sự không mở file tí nào!
(Một vài công thức của Excel cũng có khả năng làm việc với file đang đóng.. như VLOOKUP chẳng hạn)
-----------------------------
 
Tôi giải nén ra nhưng có tông hợp được đâu nhỉ?
Bác xem đây là lỗi j nhé!
loi.jpg
 
Vào đây thấy có topic này hay quá, đúng là việc mà mình đang lúng túng.

Công việc của mình đang phát sinh nhu cầu cần tổng hợp dữ liệu từ các file có cấu trúc giống nhau, số lượng có thể từ vài trăm đến hàng nghìn file vào 1 file tổng hợp.

Về code thì mình mù tịt, mới đang mày mò tìm hiểu. Bạn nào ở Hà Nội mà rành về code cho mình cắp khăn gói đến xin du học nhé. Xin cảm ơn nhiều.
 
@sealand
Bác xem lại giúp em thư mục test bác gửi, sao khi tôi giải nén ra nhưng vẫn ko thể chạy tổng hợp được.
Nó báo lỗi dòng; Set fs = Application.FileSearch

Sử dụng ADODC để tập hợp dữ liệu.
 
@sealand
Bác xem lại giúp em thư mục test bác gửi, sao khi tôi giải nén ra nhưng vẫn ko thể chạy tổng hợp được.
Nó báo lỗi dòng; Set fs = Application.FileSearch

Sử dụng ADODC để tập hợp dữ liệu.
Lưu ý: Application.FileSearch không dùng được trên Excel 2007 hoặc Excel 2010 nha
Có phài bạn thuộc trường hợp này không?
 
trời vậy excel 2007 thì phải thay đổi sao cho phù hợp đây.
Không nhẽ mình phải cài thêm office 2003?
 
Làm thế nào đây các bác! chẳng lẽ ngồi chơi à!
 
Web KT
Back
Top Bottom