Tách dòng tự động theo điều kiện bằng VBA (1 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
15
Đượ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: 7
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: 6
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

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

Back
Top Bottom