Nhờ sửa code VBA tách 1 file exel thành nhiều file nhỏ bằng autofilter

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

le thi thuy 3013

Thành viên mới
Tham gia
16/10/18
Bài viết
19
Được thích
1
Chào mọi người,
Mình đang cần tách sheet "Total" thành các file nhỏ và tự động lưu thành các file mới
Ý tưởng: tạo thêm 1 sheet mới chứa điều kiện lọc theo tên Sale rồi dùng autofilter. Code phía dưới mình chạy toàn ra file chưa mỗi dòng tiêu đề. Nhờ mn xem và sửa giúp mình ạ

Sub taods()

Dim i As Integer

i = 2

With ThisWorkbook.Sheets("Assign")

While (.Cells(i, 1) <> "")

ThisWorkbook.Sheets("Total").Select

ActiveSheet.Range("A1", Sheets("Total").Range("H" & Rows.Count).End(xlUp)).AutoFilter Field:=2, Criteria1:=".Cells(i,1)"

Sheets("Total").Range("A:H").Select

Selection.Copy

Sheets("Data").Paste

Sheets("Total").Range("A1", Sheets("Total).Range("H" & Rows.Count).End(xlUp)).AutoFilter

ThisWorkbook.Sheets("Data").Copy

ActiveWorkbook.SaveAs ThisWorkbook.Path & "\Danh Sach\" & .Cells(i, 1) & ".xlsx"

i = i + 1

Wend

End With

End Sub
 

File đính kèm

  • Thống kê đơn hàng.xlsx
    11.2 KB · Đọc: 18
Chào mọi người,
Mình đang cần tách sheet "Total" thành các file nhỏ và tự động lưu thành các file mới
Ý tưởng: tạo thêm 1 sheet mới chứa điều kiện lọc theo tên Sale rồi dùng autofilter. Code phía dưới mình chạy toàn ra file chưa mỗi dòng tiêu đề. Nhờ mn xem và sửa giúp mình ạ
Bỏ dấu "
Thành
Hãy thử xem.
 
Upvote 0
Tất cả các sheet đều có địa chỉ, tự nhiên có 1 câu lệnh trỏ ActiveSheet. Xem lại chỗ đó đi.
 
Upvote 0
Em thử mấy nữa cũng k được, mà code trên vẫn tạo được file mới chỉ là không chạy tiếp vòng lặp nên em nghĩ câu lệnh chứa ActiveSheets kia k có vấn đề đâu ạ. phiền mọi người ai có giải pháp cho em xin với ạ. Em cảm ơn
 
Upvote 0
Thêm câu lệnh
ActiveWorkbook.Close
trước dòng
i = i + 1
Lý do: File mới lưu là file hiện hành, không thể quay sang select sheet Total của file khác được.

Còn nữa:
Câu lệnh Sheets("Data").Paste bị lỗi vì không phải sheet hiện hành. Hãy copy kiểu Copy + Destination thay vì Copy + Paste
Copy nguyên 8 cột (8 triệu ô)
Không cần select cũng copy được nếu chỉ định rõ địa chỉ
Chạy code thì màn hình giật giật.
Cần xóa dữ liệu cũ ở sheet Data trước khi copy dữ liệu mới vào.
Code như sau đây chạy đỡ hơn dù chưa tối ưu
Mã:
Sub taods()
Dim i As Integer
Application.ScreenUpdating = False
Application.DisplayAlerts = False
i = 2
With ThisWorkbook.Sheets("Assign")
    While (.Cells(i, 1) <> "")
        Sheets("Data").Range("A1:H1000").ClearContents
        Sheets("Total").Range("A1", Sheets("Total").Range("H" & Rows.Count).End(xlUp)).AutoFilter _
        Field:=2, Criteria1:=.Cells(i, 1)
        Sheets("Total").Range("A1", Sheets("Total").Range("H" & Rows.Count).End(xlUp)).Copy Sheets("Data").[A1]
        ThisWorkbook.Sheets("Data").Copy
       
        ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & .Cells(i, 1) & ".xlsx"
        ActiveWorkbook.Close
        i = i + 1
    Wend
End With
Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Tất cả các sheet đều có địa chỉ, tự nhiên có 1 câu lệnh trỏ ActiveSheet. Xem lại chỗ đó đi.
"Chỗ đó" không làm sao cả vì phía trên đã select sheet Total. Vấn đề nằm ở chính câu lệnh Select sheet total: ThisWorkbook không phải activeWorkbook thì không select sheet được.
 
Upvote 0
Sử dụng Advanced Filter nhanh gấp 7 lần Copy paste

Mã:
Sub TaoFile()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
i = 2
t = Timer
Sheets("Total").AutoFilterMode = False
With ThisWorkbook.Sheets("Assign")
    While (.Cells(i, 1) <> "")
        Sheets("Data").[L2] = .Cells(i, 1)
        LastRw = Sheets("Total").[H20000].End(xlUp).Row
        Sheets("Total").Range("A1:H" & LastRw).AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Sheets("Data").[L1:L2], CopyToRange:=Sheets("Data").[A1:H1]
        ThisWorkbook.Sheets("Data").Copy
        ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & .Cells(i, 1) & ".xlsx"
        ActiveWorkbook.Close
        i = i + 1
    Wend
End With
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox Timer - t
End Sub
 
Upvote 0
Sử dụng Advanced Filter nhanh gấp 7 lần Copy paste

Mã:
Sub TaoFile()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
i = 2
t = Timer
Sheets("Total").AutoFilterMode = False
With ThisWorkbook.Sheets("Assign")
    While (.Cells(i, 1) <> "")
        Sheets("Data").[L2] = .Cells(i, 1)
        LastRw = Sheets("Total").[H20000].End(xlUp).Row
        Sheets("Total").Range("A1:H" & LastRw).AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Sheets("Data").[L1:L2], CopyToRange:=Sheets("Data").[A1:H1]
        ThisWorkbook.Sheets("Data").Copy
        ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & .Cells(i, 1) & ".xlsx"
        ActiveWorkbook.Close
        i = i + 1
    Wend
End With
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox Timer - t
End Sub
Bạn ơi, mình có cần clear content ở sheet Data sau mỗi lần paste k, vì mình sợ sẽ bị ghi đè giá trị cũ trước đó nếu số dòng ít hơn chẳng hạn?
 
Upvote 0
Upvote 0
Web KT
Back
Top Bottom