TÁCH DỮ LIỆU TỪ 1 SHEET FILE EXCEL TỔNG THÀNH FILE EXCEL NHỎ

Liên hệ QC

Raito yagami

Thành viên mới
Tham gia
30/8/22
Bài viết
2
Được thích
0
Chào các anh chị, em có 1 số file excel khoangr 500 nghìn dòng giờ em muốn tách file đấy thành các file exel nhỏ hơn tối đa 9000 dòng từ trên xuống dưới, file excel gốc không có công thức chỉ có dữ liệu. Anh chị giúp em cách tách với
 
Có lẽ nên chỉnh lại nội quy cho rõ ràng hơn anh ạ.

Em chưa thấy chỗ nào yêu cầu cụ thể tiêu đề không được viết hoa toàn bộ.
Chính vì vậy nên chưa xử lý, chỉ thông báo để chủ đề tài sửa. Và đừng quên câu hỏi "siêu hàm"
 
Upvote 0
Có thể viết 1 siêu hàm dùng cho mọi file không?
------
Ở đây toàn là dân chữa cháy không hè.
Viết "xiêu hàm" rồi cũng xiêu. Chả ai thiết đến dùng lại.
1. Chủ quan: hàm không chú thích. Rất khó hiểu để áp dụng trong vấn đề khác. Tức là code không thuộc loại reusable.
2. Khách quan: có viết code reusable ở đây cũng uổng công. Người hỏi bài ở đây chỉ muốn làm giùm chứ đâu muốn giải thuật.

Xiêu hàm: tôi để ý dân GPE có truyền thống viết code "ba cây chụm lại - tháp luôn vào một gốc", và rất ngại chuyện gọi hàm con. Một vấn đề có cả chục Options mà dồn hết vô một hàm "dùng cho mội trường hợp". "Nên hòn núi cao" thì trông hùng vĩ thật. Nhưng bảo tôi lội đèo thì còn phya.
Theo đúng nguyên tắc lập trình là phải "chia để trị". Mỗi công việc một hàm con. Hàm lớn chỉ làm công việc chộn Option(s) mà gọi hàm con thôi, cùng lắm thì chứa phần chung. Nếu viết giỏi, ngay cả cái công việc chung cũng dồn lại, thêm một hàm con.
 
Upvote 0
Ở đây toàn là dân chữa cháy không hè.
Viết "xiêu hàm" rồi cũng xiêu. Chả ai thiết đến dùng lại.
1. Chủ quan: hàm không chú thích. Rất khó hiểu để áp dụng trong vấn đề khác. Tức là code không thuộc loại reusable.
2. Khách quan: có viết code reusable ở đây cũng uổng công. Người hỏi bài ở đây chỉ muốn làm giùm chứ đâu muốn giải thuật.
Riêng chủ đề này, siêu hàm (ý là siêu Sub) chỉ cần tách 1 file (đang đứng) thành nhiều file, mỗi file 9000 dòng. Siêu ở chỗ là dùng cho nhiều file cấu trúc khác nhau.
Thí dụ:
Mã:
Sub SplitFile ()
'Tìm dòng cuối cột cuối sheet chỉ định cứng rồi thực hiện
End Sub
hoặc
Mã:
Sub SplitFile (Sh as WorkSheet, SplitRws as long, NewFName as String)
'---- Tùy chọn sheet, tùy chọn số dòng tách, tùy chọn tên file sẽ lưu (hoặc thêm folder nếu thích)
End Sub
 
Upvote 0
Chào các anh chị, em có 1 số file excel khoangr 500 nghìn dòng giờ em muốn tách file đấy thành các file exel nhỏ hơn tối đa 9000 dòng từ trên xuống dưới, file excel gốc không có công thức chỉ có dữ liệu. Anh chị giúp em cách tách với
Tôi thử code và chạy hơn 501000 dòng tách thành 56 sheet hết 72s. hóng các phương án tối ưu hơn.
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Tôi thử code và chạy hơn 501000 dòng tách thành 56 sheet hết 72s. hóng các phương án tối ưu hơn.
File hơn 500000 dòng và 15 cột. chạy code của anh Hai Lua Mien Tay hết 73,03125. Dù nén nhưng dung lượng lớn qua quy định không up lên được
Mã:
Sub Tach_1_SheetThanhNhieuSheet()
    Dim sh As Worksheet
    Dim SoSheet As Integer, i As Integer
    Dim tTime As Double
    
    Const SoDong = 9000
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    tTime = Timer

    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        While Not .EOF
            SoSheet = SoSheet + 1
            Set sh = Worksheets.Add
            sh.Name = "Sheet_" & SoSheet
            sh.Range("A3").CopyFromRecordset .DataSource, SoDong
        Wend
    End With

    Debug.Print Timer - tTime
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    
    MsgBox "Done"
End Sub
 
Upvote 0
Tôi làm hầu hết công việc quan trọng đều có thể kiểm toán.
Tách 500000 dòng thì cũng phải có gì ghi lại quá trình?

Quá trình được ghi lại trong một sheet phụ để làm báo cáo. Chỉ cần 2 dòng: dòng tiêu đề và dòng số liệu.
Tên File Con Đề nghị | Tên File Con Được Ghi | Sao Từ Dòng | Sao đến dòng | Chú thích

Sub chính có nhiệm vụ chia dữ liệu, gọi sub con, chuyền:
- Range chứa dòng tiêu đề.
- Range chứa những dòng cần sao.
- Tên đề nghị cho file con
- Range để ghi báo cáo trong sheet phụ

Sub con có nhiệm vụ:
- Mở file mới. Nếu có vấn đề (file exists) thì thử bản (1), (2),...
- Chép tiêu đề và các dòng cần sao vào file mới.
- Đóng file mới.
- Ghi chi tiết vào báo cáo.
 
Upvote 0
File hơn 500000 dòng và 15 cột. chạy code của anh Hai Lua Mien Tay hết 73,03125.
Code dùng ADO thường chậm hơn mảng.
Nếu dùng mảng sẽ thường dùng lệnh gán như:
Mã:
Dim SourceArr()
SourceArr= Range1.Value
Range2.Value = SourceArr
Nếu bỏ qua mảng mà gán
Mã:
Range2.Value = Range1.Value
Thì còn nhanh hơn nữa vì bỏ qua trung gian mảng.
 
Upvote 0
Chào các anh chị, em có 1 số file excel khoangr 500 nghìn dòng giờ em muốn tách file đấy thành các file exel nhỏ hơn tối đa 9000 dòng từ trên xuống dưới, file excel gốc không có công thức chỉ có dữ liệu. Anh chị giúp em cách tách với
Thế bạn tách theo tiêu chí nào? Ngày tháng hay tên khách v.v.v.phải có file mẫu ae mới biết mà giúp chứ
 
Upvote 0
Thế bạn tách theo tiêu chí nào?

Người ta nêu rõ ràng thế còn hỏi tiêu chí nào nữa bạn?

1662003999577.png

Nghĩa là, cứ tách 9000 dòng thành 1 bảng, lưu thành 1 file.
Phần dư cuối cùng (nếu có) sau khi tách 9000 dòng thì lưu phần dư đó thành 1 file.

Cần file chỉ là xem cấu trúc dòng/ cột thế nào, xem cột nào để tham chiếu lấy dòng cuối, xem dòng nào để tham chiếu lấy cột cuối.
 
Upvote 0
... ae mới biết mà giúp chứ
Chỗ này là bạn hứa chứ chưa có "a" "e" gì hết nhé.
Thớt nhất định theo chính sách "lỳ". Không chịu sửa tiêu đề theo đề nghị của người khác

Vì vây, chúng tôi chỉ bàn bạc học hỏi với nhau là chính thôi. Cootrs kiếc là để mình họa giải thuật.

Việc giúp thớt hiện giờ là việc phụ.
 
Upvote 0
Code dùng ADO thường chậm hơn mảng.
Nếu dùng mảng sẽ thường dùng lệnh gán như:
Mã:
Dim SourceArr()
SourceArr= Range1.Value
Range2.Value = SourceArr
Nếu bỏ qua mảng mà gán
Mã:
Range2.Value = Range1.Value
Thì còn nhanh hơn nữa vì bỏ qua trung gian mảng.
Tôi thử 500800 dòng 15 cột dùng phương pháp copy và paste hết 10,3s
Mã:
...
Ws.Range......Copy Sh.range....
...
Paste ở đây là paste vào các Sheet cùng workbook với sheet gốc.
và nghĩ rằng số cột nhiều, ít không ảnh hưởng đến tốc độ code. Không biết suy nghĩ thế có đúng không. Anh PTM 0412 hoặc ai biết xin giải thích giùm, tôi xin được khai sáng.
Trân trọng
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom