Tách dòng tự động theo điều kiện bằng VBA (4 người xem)

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

  • Tôi tuân thủ nội quy khi đăng bài

    duongnhuxuyen

    Thành viên mới
    Tham gia
    20/12/13
    Bài viết
    16
    Được thích
    0
    Em có 1 File ex rất mong các anh chị giúp em để em có thể tách dòng tự động tại sheet: KET QUA TRA VE bằng cách lấy dữ liệu từ sheet DỮ LIỆU

    Khi nhập dữ liệu vào ô Trang bên sheet DỮ LIỆU

    1765510737174.png


    Thì kết sheet KET QUA TRA VE sẽ cho ra kết quả tách dòng theo số lượng yêu cầu trên bảng và tách theo thứ tự các màu, theo kích thước từ trên xuống dưới theo đúng số lượng

    Bằng cách nhập kích thước và số lượng muốn tách dòng cho kích thước đó thì kết quả sẽ trả về sheet KET QUA TRA VE


    Cứ như vậy em muốn in tách tự động ạ mong các anh chị giúp đỡ em với

    em gửi File đính kèm phía dưới ạ
     

    File đính kèm

    Em có 1 File ex rất mong các anh chị giúp em để em có thể tách dòng tự động tại sheet: KET QUA TRA VE bằng cách lấy dữ liệu từ sheet DỮ LIỆU

    Khi nhập dữ liệu vào ô Trang bên sheet DỮ LIỆU

    1765510737174.png


    Thì kết sheet KET QUA TRA VE sẽ cho ra kết quả tách dòng theo số lượng yêu cầu trên bảng và tách theo thứ tự các màu, theo kích thước từ trên xuống dưới theo đúng số lượng

    Bằng cách nhập kích thước và số lượng muốn tách dòng cho kích thước đó thì kết quả sẽ trả về sheet KET QUA TRA VE


    Cứ như vậy em muốn in tách tự động ạ mong các anh chị giúp đỡ em với

    em gửi File đính kèm phía dưới ạ
    Rất may là bạn đã tiếp thu.
    Xem file.
    Kết quả làm tay của bạn hình như không đủ.
    Kết quả chạy code đang để ở I2:Oxx
    Hãy nhấn vào nút run, hoăc nút TACH để được kết quả.
    Hy vọng đúng ý.
     

    File đính kèm

    Lần chỉnh sửa cuối:
    Upvote 0
    Rất hâm mộ @HUONGHCKT: Trong khi mình chưa hiểu đề bài thì thầy không những hiểu đề & còn phát hiện chưa đủ trong nội dung bài!
    Tôi dỗi hơi lên đoán mò mà làm đó.
    Trân trọng cảm ơn anh đã động viên.
    Chúc anh ngày mới có nhiều niềm vụi.
     
    Upvote 0
    Hi Hj em casm own anh
    Tôi dỗi hơi lên đoán mò mà làm đó.
    Trân trọng cảm ơn anh đã động viên.
    Chúc anh ngày mới có nhiều niềm vụi.
    Em cám ơn anh HUONGHCKT
    Em check thì bị lỗi vậy không biết sao ạ


    Mong muốn của em là Tại sheet DU LIEU : mình sẽ làm công tác sau

    1. Nhập dữ liệu vào ô Kích thước và số lượng tương ứng với số lượng mình muốn tách cho kích thước ấy

    VD Tên BQ400 - kích thước 100x100x7 với số lượng đầu bài là 1000 viên nhưng mình yêu cầu tác ra 1000 dòng với số lượng là 1
    tất cả các màu được tách theo số lượng đã yêu cầu ở sheet DU LIEU ạ

    Mongnhận đc sự giúp đỡ từ các Bác em xin chân thành cám ơn ạ



    1765767502732.png
     
    Upvote 0
    Góp thêm code VBA gọn hơn:
    PHP:
    Sub TachDong()
    Dim SL(), SArr(), KTArr(), RArr(), LastRw As Long, LastRwSL As Long
    Dim Dict, DictKeys
    LastRw = Sheet2.[A10000].End(xlUp).Row
    LastRwSL = Sheet2.[M100].End(xlUp).Row
    SArr = Sheet2.Range("A2:E" & LastRw).Value
    KTArr = Sheet2.Range("F2:J" & LastRw).Value
    SL = Sheet2.Range("M2:N" & LastRwSL).Value
    ReDim RArr(1 To LastRw * LastRwSL, 1 To 7)
    Set Dict = CreateObject("Scripting.Dictionary")
    For i = 1 To LastRwSL - 1
        Dict.Add SL(i, 1), SL(i, 2)
    Next
    DictKeys = Dict.keys
    For i = 1 To LastRw - 1
        For j = 1 To 5
            If KTArr(i, j) > 0 Then
                k = k + 1
                RArr(k, 1) = k
                RArr(k, 2) = SArr(i, 2)
                RArr(k, 3) = SArr(i, 3)
                RArr(k, 4) = SArr(i, 4)
                RArr(k, 5) = SArr(i, 5)
                RArr(k, 6) = DictKeys(j - 1)
                RArr(k, 7) = Dict.Item(RArr(k, 6))
            End If
        Next
    Next
    Sheet3.[Q2].Resize(10000, 7).Clear
    Sheet3.[Q2].Resize(k, 7).Value = RArr
    End Sub

    Đồng thới có 1 phương án Power query, với điều kiện sửa ô M5 sheet "dữ liệu" xóa khoảng trắng ở đầu.

    Query TableSL chỉ 1 dòng lệnh

    1765771216836.png

    Query Ketqua:

    PHP:
    let
        Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
        UnPivot = Table.UnpivotOtherColumns(Source, {"TT","Tên", "Code mới", "Tên sản phẩm", "Finish"}, "Kích thước", "Số lượng"),
        ReplaceValue = Table.ReplaceValue(UnPivot,"KT ","",Replacer.ReplaceText,{"Kích thước"}),
        Merge = Table.NestedJoin(ReplaceValue, {"Kích thước"}, TableSL, {"Kích thước"}, "Table3", JoinKind.LeftOuter),
        Expand = Table.ExpandTableColumn(Merge, "Table3", {"Số lượng"}, {"Số lượng.1"})
    in
        Expand
     
    Upvote 0
    Hi Hj em casm own anh

    Em cám ơn anh HUONGHCKT
    Em check thì bị lỗi vậy không biết sao ạ


    Mong muốn của em là Tại sheet DU LIEU : mình sẽ làm công tác sau

    1. Nhập dữ liệu vào ô Kích thước và số lượng tương ứng với số lượng mình muốn tách cho kích thước ấy

    VD Tên BQ400 - kích thước 100x100x7 với số lượng đầu bài là 1000 viên nhưng mình yêu cầu tác ra 1000 dòng với số lượng là 1
    tất cả các màu được tách theo số lượng đã yêu cầu ở sheet DU LIEU ạ

    Mongnhận đc sự giúp đỡ từ các Bác em xin chân thành cám ơn ạ



    View attachment 310644
    Không hiểu bạn bị lỗi sao chứ trên máy tôi thì chạy êm.
    Tôi tin là bị lỗi dòng code sắp xếp lại dữ liệu.
    Còn đây: ....."1. Nhập dữ liệu vào ô Kích thước và số lượng tương ứng với số lượng mình muốn tách cho kích thước ấy" ... muốn vậy thì phải nói rõ ngay từ đầu.
    Khổ thế, đoán mò mà không đúng ý.
    Với....."1. Nhập dữ liệu vào ô Kích thước và số lượng tương ứng với số lượng mình muốn tách cho kích thước ấy"....
    Tôi hiểu thế này:
    Với : mã BQ400:
    F2/ Sh DULIEU=400 ; N2= 1====> tách cái F2 =400 ấy ra thành 400 dòng( =400/1) mỗi dòng có số lượng = 1.
    Tương tự: Với G2/Sh DULIEU =350 và N3=2====> Tách cái G2= 174 dòng(= 350/2 dư 1 ) có số lượng =2.
    Tương tự H2/Sh DULIEU= Rỗng ===> không tách
    Tương tự I2/Sh DULIEU=500 và N5=10 =====> Tách I2= 50 dòng (=500/10) có số lượng = 10
    Tương tự cho các mã khác.
     
    Upvote 0
    Không hiểu bạn bị lỗi sao chứ trên máy tôi thì chạy êm.
    Tôi tin là bị lỗi dòng code sắp xếp lại dữ liệu.
    Còn đây: ....."1. Nhập dữ liệu vào ô Kích thước và số lượng tương ứng với số lượng mình muốn tách cho kích thước ấy" ... muốn vậy thì phải nói rõ ngay từ đầu.
    Khổ thế, đoán mò mà không đúng ý.
    Với....."1. Nhập dữ liệu vào ô Kích thước và số lượng tương ứng với số lượng mình muốn tách cho kích thước ấy"....
    Tôi hiểu thế này:
    Với : mã BQ400:
    F2/ Sh DULIEU=400 ; N2= 1====> tách cái F2 =400 ấy ra thành 400 dòng( =400/1) mỗi dòng có số lượng = 1.
    Tương tự: Với G2/Sh DULIEU =350 và N3=2====> Tách cái G2= 174 dòng(= 350/2 dư 1 ) có số lượng =2.
    Tương tự H2/Sh DULIEU= Rỗng ===> không tách
    Tương tự I2/Sh DULIEU=500 và N5=10 =====> Tách I2= 50 dòng (=500/10) có số lượng = 10
    Tương tự cho các mã khác.
    Với kết quả như tôi phân tích ở đây và dữ liệu đã cho ===> kết quả trả vê sau khi chạy code thu được 45000 dòng
     
    Upvote 0
    Với kết quả như tôi phân tích ở đây và dữ liệu đã cho ===> kết quả trả vê sau khi chạy code thu được 45000 dòng
    Chính xác là 21.270 dòng

    PHP:
    Sub TachDong()
    Dim SL(), SArr(), KTArr(), RArr(), LastRw As Long, LastRwSL As Long
    Dim Dict, DictKeys
    LastRw = Sheet2.[A10000].End(xlUp).Row
    LastRwSL = Sheet2.[M100].End(xlUp).Row
    SArr = Sheet2.Range("A2:E" & LastRw).Value
    KTArr = Sheet2.Range("F2:J" & LastRw).Value
    SL = Sheet2.Range("M2:N" & LastRwSL).Value
    ReDim RArr(1 To LastRw * LastRwSL * 500, 1 To 7)
    Set Dict = CreateObject("Scripting.Dictionary")
    For i = 1 To LastRwSL - 1
        Dict.Add SL(i, 1), SL(i, 2)
    Next
    DictKeys = Dict.keys
    For i = 1 To LastRw - 1
        For j = 1 To 5
            If KTArr(i, j) > 0 Then
                x = Dict.Item(DictKeys(j - 1))
                m = KTArr(i, j) / x
                For n = 1 To m
                    k = k + 1
                    RArr(k, 1) = k
                    RArr(k, 2) = SArr(i, 2)
                    RArr(k, 3) = SArr(i, 3)
                    RArr(k, 4) = SArr(i, 4)
                    RArr(k, 5) = SArr(i, 5)
                    RArr(k, 6) = DictKeys(j - 1)
                    RArr(k, 7) = x
                Next
            End If
        Next
    Next
    Sheet3.[Q2].Resize(100000, 7).Clear
    Sheet3.[Q2].Resize(k, 7).Value = RArr
    End Sub
     
    Upvote 0
    Xin lỗi . Sửa bài do đã phát hiện ra chỗ sai.
    Đúng rồi: kêt quả là 21270 dòng
     

    File đính kèm

    • Screenshot (10).png
      Screenshot (10).png
      108.1 KB · Đọc: 11
    Lần chỉnh sửa cuối:
    Upvote 0
    Trường hợp đóng thùng hàng và còn dư bao nhiêu cho vào 1 thùng cuối thì hơi khác. Ví dụ 400 sp đóng 12 sp/ thùng sẽ được 33 thùng dư 4; nếu thêm 1 thùng chứa 4 sp này tức là sẽ thêm 1 dòng kết quả. Nếu đúng là trường hợp này thì xác nhận, tôi sửa 5 phút là xong.
     
    Upvote 0
    Em có 1 File ex rất mong các anh chị giúp em để em có thể tách dòng tự động tại sheet: KET QUA TRA VE bằng cách lấy dữ liệu từ sheet DỮ LIỆU

    Khi nhập dữ liệu vào ô Trang bên sheet DỮ LIỆU

    1765510737174.png


    Thì kết sheet KET QUA TRA VE sẽ cho ra kết quả tách dòng theo số lượng yêu cầu trên bảng và tách theo thứ tự các màu, theo kích thước từ trên xuống dưới theo đúng số lượng

    Bằng cách nhập kích thước và số lượng muốn tách dòng cho kích thước đó thì kết quả sẽ trả về sheet KET QUA TRA VE


    Cứ như vậy em muốn in tách tự động ạ mong các anh chị giúp đỡ em với

    em gửi File đính kèm phía dưới ạ
    Dữ liệu đã được sắp xếp theo kích thước nên không cần dùng dic
    Code đã xét khả năng phân chia có số lượng dư và tính thêm 1 dòng
    Chỉ xét 5 loại kích thước, nếu khác phải chỉnh lại mảng dữ liệu "arr"
    Mã:
    Sub xyz()
      Dim aSL(), arr(), res(), SL&, D&
      Dim i&, j&, n&, c&, k&, sRow&, sRowRes&, sCol&
     
      With Sheet2
        arr = .Range("A2:J" & .Range("A1000000").End(xlUp).Row).Value
        aSL = .Range("M2", .Range("N1000000").End(xlUp)).Value
      End With
      sRow = UBound(arr) - 1: sCol = UBound(arr, 2)
     
      For j = 6 To sCol 'Tinh tong so dong ket qua
        sRowRes = sRowRes + Application.RoundUp(arr(sRow + 1, j) / aSL(j - 5, 2), 0)
      Next
      sRowRes = sRowRes + (sCol - 5) * sRow
      ReDim res(1 To sRowRes, 1 To 7)
     
      For j = 6 To sCol
        SL = aSL(j - 5, 2) ' So luong 1 dong
        For i = 1 To sRow
          If arr(i, j) > 0 Then
            D = Application.RoundUp(arr(i, j) / aSL(j - 5, 2), 0) ' So dong ket qua
            For n = 1 To D
              k = k + 1
              res(k, 1) = k
              For c = 2 To 5
                res(k, c) = arr(i, c)
              Next c
              res(k, 6) = aSL(j - 5, 1)
              If SL <= arr(i, j) Then res(k, 7) = SL Else res(k, 7) = arr(i, j)
              arr(i, j) = arr(i, j) - res(k, 7)
            Next n
          End If
        Next i
      Next j
     
      With Sheet1
        .Range("A2", .Range("G1000000").End(xlUp).Offset(1)).Clear
        .Range("A2").Resize(k, 7).Value = res
        .Range("A2").Resize(k, 7).Borders.LineStyle = 1
      End With
    End Sub
     
    Upvote 0
    Đồng thới có 1 phương án Power query, với điều kiện sửa ô M5 sheet "dữ liệu" xóa khoảng trắng ở đầu.
    Quá chính xác : KT 80x45x5 dư 1 space
    Đoán mò là chủ thớt muốn tạo 1 list để merge in tem... (Cái này bản thân cũng từng làm)
    Nếu thế chỉ cần 38 dòng
     

    File đính kèm

    • Untitled.png
      Untitled.png
      75.8 KB · Đọc: 11
    Lần chỉnh sửa cuối:
    Upvote 0
    Dữ liệu đã được sắp xếp theo kích thước nên không cần dùng dic
    Code đã xét khả năng phân chia có số lượng dư và tính thêm 1 dòng
    Chỉ xét 5 loại kích thước, nếu khác phải chỉnh lại mảng dữ liệu "arr"
    1. Đúng là không cần Dic thật, chỉ là phòng xa thôi. Vả lại tôi đọc code bài 2 thấy dùng Dic nhưng lại tạo Dic từ bảng dữ liệu dài ngoằng nên thay Dic tạo từ bảng SL thay thế ngắn hơn rất nhiều, nếu tác giả bài 2 nhận xét thấy thì cũng là 1 kinh nghiệm cho bạn ấy.
    2. Theo ý tôi thì câu lệnh If SL <= arr(i, j) Then đặt trong vòng lặp thứ 3 nên bị xét khá nhiều lần, bằng số dòng kết quả. Phép tính trừ cũng phải tính bằng ấy lần. Tôi định tìm số dư, nếu số dư >0 thì code thêm 1 dòng kết quả bên ngoài vòng lặp 3, số lần xét điều kiện sẽ giảm đáng kể, chỉ bằng số dòng dữ liệu nguồn (nhân tối đa 5).
     
    Lần chỉnh sửa cuối:
    Upvote 0
    Code bỏ Dic và thêm dòng bằng cách tính số dư:

    Mã:
    Sub TachDong()
    Dim SL(), SArr(), KTArr(), RArr(), LastRw As Long, LastRwSL As Long
    LastRw = Sheet2.[A10000].End(xlUp).Row
    LastRwSL = Sheet2.[M100].End(xlUp).Row
    SArr = Sheet2.Range("A2:E" & LastRw).Value
    KTArr = Sheet2.Range("F2:J" & LastRw).Value
    SL = Sheet2.Range("M2:N" & LastRwSL).Value
    ReDim RArr(1 To LastRw * LastRwSL * 500, 1 To 7)
    For i = 1 To LastRw - 1
        For j = 1 To 5
            If KTArr(i, j) > 0 Then
                x = SL(j, 2)
                m = KTArr(i, j) \ x
                y = KTArr(i, j) Mod x
                For n = 1 To m
                    k = k + 1
                    RArr(k, 1) = k
                    For t = 2 To 5
                        RArr(k, t) = SArr(i, t)
                    Next
                    RArr(k, 6) = SL(j, 1)
                    RArr(k, 7) = x
                Next
                If y > 0 Then
                    k = k + 1
                    RArr(k, 1) = k
                    For t = 2 To 5
                        RArr(k, t) = SArr(i, t)
                    Next
                    RArr(k, 6) = SL(j, 1)
                    RArr(k, 7) = y
                End If
            End If
        Next
    Next
    Sheet3.[Q2].Resize(100000, 7).Clear
    Sheet3.[Q2].Resize(k, 7).Value = RArr
    End Sub
     
    Upvote 0
    Code bỏ Dic và thêm dòng bằng cách tính số dư:

    Mã:
    Sub TachDong()
    Dim SL(), SArr(), KTArr(), RArr(), LastRw As Long, LastRwSL As Long
    LastRw = Sheet2.[A10000].End(xlUp).Row
    LastRwSL = Sheet2.[M100].End(xlUp).Row
    SArr = Sheet2.Range("A2:E" & LastRw).Value
    KTArr = Sheet2.Range("F2:J" & LastRw).Value
    SL = Sheet2.Range("M2:N" & LastRwSL).Value
    ReDim RArr(1 To LastRw * LastRwSL * 500, 1 To 7)
    For i = 1 To LastRw - 1
        For j = 1 To 5
            If KTArr(i, j) > 0 Then
                x = SL(j, 2)
                m = KTArr(i, j) \ x
                y = KTArr(i, j) Mod x
                For n = 1 To m
                    k = k + 1
                    RArr(k, 1) = k
                    For t = 2 To 5
                        RArr(k, t) = SArr(i, t)
                    Next
                    RArr(k, 6) = SL(j, 1)
                    RArr(k, 7) = x
                Next
                If y > 0 Then
                    k = k + 1
                    RArr(k, 1) = k
                    For t = 2 To 5
                        RArr(k, t) = SArr(i, t)
                    Next
                    RArr(k, 6) = SL(j, 1)
                    RArr(k, 7) = y
                End If
            End If
        Next
    Next
    Sheet3.[Q2].Resize(100000, 7).Clear
    Sheet3.[Q2].Resize(k, 7).Value = RArr
    End Sub
    dạ em cám ơn em coppy cord vào thì bị lỗi thế này

    Bác xem giúp em với ạ em cám ơn





    1766110634077.png
     
    Upvote 0

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

    Back
    Top Bottom