nhờ hỗ trợ viết code tách 1 sheet thành nhiều sheet theo điều kiện

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

Caonguyen17689

Thành viên mới
Tham gia
24/6/18
Bài viết
8
Được thích
0
hiện em có 1 file cần thực hiện tách sheet
sheet tổng cần tách ra nhiều sheet nhỏ như mẫu với điều kiện đặt ở cột A. tên sheet tách được đánh số theo tên sheet gốc và số lấy theo dữ liệu tách của cột A

nhờ các bác hỗ trợ ạ !
 

File đính kèm

  • tách sheet.xlsx
    253.4 KB · Đọc: 21
hiện em có 1 file cần thực hiện tách sheet
sheet tổng cần tách ra nhiều sheet nhỏ như mẫu với điều kiện đặt ở cột A. tên sheet tách được đánh số theo tên sheet gốc và số lấy theo dữ liệu tách của cột A

nhờ các bác hỗ trợ ạ !
Trong khi chờ các giải pháp khác hãy thử tham khảo code sau:
Mã:
Option Explicit

Sub TachSheet()
Dim i&, j&, Lr&
Dim Sh As Worksheet, Ws As Worksheet
Set Sh = Sheets("26.6.2023")
Lr = Sh.Cells(100000, 1).End(xlUp).Row
For i = 1 To Application.Max(Sh.Range("A8:A" & Lr))
    Sh.Select
    Sh.Copy After:=Sheets(Sheets.Count)
    Selection.AutoFilter
    ActiveSheet.Range("$A$8:$FT$211").AutoFilter Field:=1, Criteria1:="<>" & i, _
        Operator:=xlAnd
     Rows("9:" & Lr - 1).Select
    Selection.Delete Shift:=xlUp
    Selection.AutoFilter
    i = Format(i, "##")
    ActiveSheet.Name = Sh.Name & "." & i
Next i
msgbox "Thành công"
End Sub
 

File đính kèm

  • tách sheet (1).xlsm
    216.9 KB · Đọc: 20
Trong khi chờ các giải pháp khác hãy thử tham khảo code sau:
Mã:
Option Explicit

Sub TachSheet()
Dim i&, j&, Lr&
Dim Sh As Worksheet, Ws As Worksheet
Set Sh = Sheets("26.6.2023")
Lr = Sh.Cells(100000, 1).End(xlUp).Row
For i = 1 To Application.Max(Sh.Range("A8:A" & Lr))
    Sh.Select
    Sh.Copy After:=Sheets(Sheets.Count)
    Selection.AutoFilter
    ActiveSheet.Range("$A$8:$FT$211").AutoFilter Field:=1, Criteria1:="<>" & i, _
        Operator:=xlAnd
     Rows("9:" & Lr - 1).Select
    Selection.Delete Shift:=xlUp
    Selection.AutoFilter
    i = Format(i, "##")
    ActiveSheet.Name = Sh.Name & "." & i
Next i
msgbox "Thành công"
End Sub
code này chỉ sao chép, thiếu đoạn lọc và xóa dữ liệu theo điều kiện ở cột A : phân loại theo số thứ tự đó, và mỗi sheet nhỏ ( sau tách ) chỉ lấy 1 điều kiện là 1 số đó thôi
 
code này chỉ sao chép, thiếu đoạn lọc và xóa dữ liệu theo điều kiện ở cột A : phân loại theo số thứ tự đó, và mỗi sheet nhỏ ( sau tách ) chỉ lấy 1 điều kiện là 1 số đó thôi
Bạn đã chạy code chưa? Có đúng là nó cho ra các sheets theo thứ tự 1, 2,3 và trong đó chỉ có các Lot 1,2,3 tương ứng.
 
Bạn cho hỏi thêm nếu mình cần thay đổi sheet name thì cần sửa đoạn này như nào nhỉ

Set Sh = Sheets("26.6.2023")
Thì bạn cứ thay đổi dòng trong dấu "xxx...yyy" là được với điều kiện là có Sheets("xxx...YYY") và sheet ấy nằm trong workbook chứa code.
 
Cho em hỏi trường hợp như em muốn tách thành nhiều sheet từ sheet file 1 như 4 sheet e đã tách bằng tay. Với điều kiện là một mã sản phẩm chỉ nằm trên một sheet không đưa về nhiều sheet. Xin các anh chị chỉ giáo với ạ. Em cảm ơn!
 

File đính kèm

  • ĐẨY FILE1.xlsx
    4 MB · Đọc: 7
Cho em hỏi trường hợp như em muốn tách thành nhiều sheet từ sheet file 1 như 4 sheet e đã tách bằng tay. Với điều kiện là một mã sản phẩm chỉ nằm trên một sheet không đưa về nhiều sheet. Xin các anh chị chỉ giáo với ạ. Em cảm ơn!
File của bạn có 2000 mã, vậy làm sao tách ra 2000 sheet đây? Bạn có từng nghĩ qua chưa?
 
Dạ không phải tách theo từng sheet là từng mã anh. Mà một sheet có thể nhiều mã. Nhưng với điều kiện là không để dữ liệu một mã mà chia ra ở 2 sheet á anh.
Bạn đọc kỹ lại những gì bạn viết xem có mâu thuẩn không.
Xác định lại từng phần:
1. có phải trong sheet File 1 có khoảng 80 000 dòng, chứa khoảng 2000 mã khác nhau hay không
2. Vậy 2000 mã này sẽ được nằm riêng ở các sheet
 
Bạn đọc kỹ lại những gì bạn viết xem có mâu thuẩn không.
Xác định lại từng phần:
1. có phải trong sheet File 1 có khoảng 80 000 dòng, chứa khoảng 2000 mã khác nhau hay không
2. Vậy 2000 mã này sẽ được nằm riêng ở các sheet
Dạ chắc là câu từ em không rõ ràng. E xin trình bày lại là với sheet file 1 em có khoảng 80000 dòng gồm khoảng 2000 mã. Ví dụ em muốn tách ra thành 4 sheet. thì một sheet khoảng 20000 dòng đi ( có thể lên xuống) Nhưng trường hợp tách ra thì tách hết dữ liệu một mã nằm trên một sheet chứ không phải tách ra 2 sheet khác nhau. . Em có làm một ví dụ cho Mã 0013A4V-S40263P ở file đính kèm phần em bôi vàng cho mã đó. Em muốn dữ liệu đó chia nằm về một sheet. Không để trường hợp một mã sản phẩm mà nằm trên 2 sheet khác nhau. Em cảm ơn anh!
 

File đính kèm

  • VI DU.xlsx
    34.9 KB · Đọc: 14
Dạ chắc là câu từ em không rõ ràng. E xin trình bày lại là với sheet file 1 em có khoảng 80000 dòng gồm khoảng 2000 mã. Ví dụ em muốn tách ra thành 4 sheet. thì một sheet khoảng 20000 dòng đi ( có thể lên xuống) Nhưng trường hợp tách ra thì tách hết dữ liệu một mã nằm trên một sheet chứ không phải tách ra 2 sheet khác nhau. . Em có làm một ví dụ cho Mã 0013A4V-S40263P ở file đính kèm phần em bôi vàng cho mã đó. Em muốn dữ liệu đó chia nằm về một sheet. Không để trường hợp một mã sản phẩm mà nằm trên 2 sheet khác nhau. Em cảm ơn anh!
Giờ thì hiểu rồi. Chỉ cần tách ra 4 sheet, bao nhiều dòng cũng được, baonhiêu mã cũng được, chỉ cần vét hết thông tin của 1 mã về chung với nhau. Khó

Mình đề nghị bạn nên sort dữ liệu trước theo mã, rồi ước chừng tách ra thủ công là gọn nhất
 
Giờ thì hiểu rồi. Chỉ cần tách ra 4 sheet, bao nhiều dòng cũng được, baonhiêu mã cũng được, chỉ cần vét hết thông tin của 1 mã về chung với nhau. Khó

Mình đề nghị bạn nên sort dữ liệu trước theo mã, rồi ước chừng tách ra thủ công là gọn nhất
Vì số lượng dòng còn nhiều lắm anh. Nên e kêu để đưa lên có các anh chị hỗ trợ thử được không. :) . Em cảm ơn anh nhiều!
 
Bài này bá đạo, 80000 dòng chứa 2000 mã, giả sử cực đoan là 1999 mã có 1 dòng, mã còn lại chứa 78001 dòng thì không công bằng.
 
Cho em hỏi trường hợp như em muốn tách thành nhiều sheet từ sheet file 1 như 4 sheet e đã tách bằng tay. Với điều kiện là một mã sản phẩm chỉ nằm trên một sheet không đưa về nhiều sheet. Xin các anh chị chỉ giáo với ạ. Em cảm ơn!
Dữ liệu có mã giống nhau nằm kế bên nhau, chạy code
Mã:
Sub XYZ()
  Dim arr(), aCF(), res(), sRow&, N&, i&, r&, k&, t&, j&
  Const d = 4 'So sheet DL ket qua
 
  With Sheets("FILE 1")
    arr = .Range("B2:E" & .Range("B" & Rows.Count).End(xlUp).Row + 1).Value
  End With
  sRow = UBound(arr) - 1
  N = sRow / d
  ReDim aCF(1 To d)

  For i = 1 To sRow
    k = k + 1
    If arr(i, 1) <> arr(i + 1, 1) Then
      If k > (r + 1) * N Then
        r = r + 1
        aCF(r) = t 'Tan so tich luy
      End If
      t = k
    End If
  Next i
  aCF(d) = sRow
 
  Application.ScreenUpdating = False
  t = 1
  For r = 1 To d
    ReDim res(1 To aCF(r) - t + 1, 1 To 4)
    k = 0
    For i = t To aCF(r)
      k = k + 1
      For j = 1 To 4
        res(k, j) = arr(i, j)
      Next j
    Next i
    t = i
    With Sheets("DL" & r)
      i = .Range("A" & Rows.Count).End(xlUp).Row
      If i > 1 Then .Range("A2:D" & i).Clear
      .Range("A2").Resize(k, 4) = res
      .Range("A2").Resize(k, 4).Borders.LineStyle = 1
    End With
  Next r
  Application.ScreenUpdating = True
End Sub
 
Thuật toán:

Thuật toán lười biếng, Dùng Đít Sần cho dễ:
- Đặt "mã hiện tại" = ""
- Đọc bảng, nếu mã hàng khác với "mã hiện tại" thì xét trong Dic, nếu có thì bỏ qua, nếu không có thì:
-- Nhét vào Dic
-- Đặt "mã hiện tại" = "mã mới"
-- Lập một sheet mới. Tên tuổi thế nào tùy thích.
-- Dùng Advanced Filter, lọc theo "mã hiện tại" vào sheet mới.
-- Cứ thế đến hết bảng.

Thuật toán đa dụng hơn (khong cần Đít Sần cho nên có thể chạy trên các nền tảng khác Windows):
- Copy sheet sang một sheet phụ
- Vòng lặp:
-- Đọc mã đầu tiên.
-- Đặt "mã hiện tại" = "mã mới"
-- Lập một sheet mới. Tên tuổi thế nào tùy thích.
-- Dùng Advanced Filter, lọc sheet phụ theo "mã hiện tại" vào sheet mới.
-- Dùng Advanced Filter, lọc sheet phụ theo không phải "mã hiện tại" tại sheet phụ, tức là loại những dòng này.
-- Tiếp tục trở lại đầu vòng lặp cho đến hết.
 
Thấy bài này cũng hay hay nên thử 1 cách code cho vui để vận động não tí
Mã:
Sub Tach_Sheet()
Dim sArr(), i As Long, Res(), k As Long, j As Long, TieuDe As Range
With Sheets("File 1")
    .Range("B1").CurrentRegion.Sort .Range("B1"), Header:=xlYes
    sArr = .Range("B1", .Range("B" & Rows.Count).End(3).Offset(1)).Resize(, 4).Value
    Set TieuDe = .Range("B1").Resize(, 5)
End With
ReDim Res(1 To UBound(sArr), 1 To 5)
For i = 2 To UBound(sArr) - 1
    k = k + 1
    If k < UBound(sArr) \ 4 Or sArr(i, 1) = sArr(i + 1, 1) Then
        For j = 1 To 4
            Res(k, j) = sArr(i, j)
        Next
        Res(k, 5) = k
    Else
        For j = 1 To 4
            Res(k, j) = sArr(i, j)
        Next
        Res(k, 5) = k
        Sheets.Add before:=Sheets(Sheets.Count)
        With ActiveSheet
            .Range("B2").Resize(k, UBound(Res, 2)) = Res
            TieuDe.Copy .Range("B1")
        End With
        k = 0
        ReDim Res(1 To UBound(sArr), 1 To 5)
    End If
    If i = UBound(sArr) - 1 Then
        Sheets.Add before:=Sheets(Sheets.Count)
        With ActiveSheet
            .Range("B2").Resize(k, UBound(Res, 2)) = Res
            TieuDe.Copy .Range("B1")
        End With
    End If
Next
End Sub
 
Web KT
Back
Top Bottom