Tách dòng tự động trong Excel (số lượng dòng tách tham chiếu theo cột mã hàng và Số lượng)

Liên hệ QC

khkkh

Thành viên mới
Tham gia
29/5/12
Bài viết
37
Được thích
1
Chào cả nhà
Hôm nay mình lại đang vật lộn với bài toán khó
Mình có 1 bảng dữ liệu thống kê hàng xuất, mình muốn trình bày lại bảng này theo định dạng tách dòng theo cột mã hàng và số lượng. (Mình tách thủ công nên mất khá nhiều thời gian và có thể sai sót khi dữ liệu nhiều ; mong các cao thủ và tiền bối ra tay giúp)
mọi người xem file gửi kèm và giúp đỡ nhé
Xin cảm ơn
 

File đính kèm

  • Tách dữ liệu.xls
    25 KB · Đọc: 37
Bạn ơi xem giúp mình file này với.
Tách rồi nhưng số lượng tách ra không đúng với số lượng gốc(lớn hơn)
=> Trong file mình có note phần kết quả tách mong muốn.
Có gì bạn giúp mình nhé Cảm ơn bạn
Kq(x, cls) = Gh
Chỉnh lại
Kq(x, cls) = k
Mã:
    If k Then
        If Gh = 5 Then
            x = x + 1
            Kq(x, cls) = k
            For z = 1 To cls - 1
                Kq(x, z) = Nguon(i, z)
            Next z
        Else
            For j = x + 1 To x + k
                Kq(j, cls) = 1
                For z = 1 To cls - 1
                    Kq(j, z) = Nguon(i, z)
                Next z
            Next j
            x = x + k
        End If
    End If
 
Upvote 0
Kq(x, cls) = Gh
Chỉnh lại
Kq(x, cls) = k
Mã:
    If k Then
        If Gh = 5 Then
            x = x + 1
            Kq(x, cls) = k
            For z = 1 To cls - 1
                Kq(x, z) = Nguon(i, z)
            Next z
        Else
            For j = x + 1 To x + k
                Kq(j, cls) = 1
                For z = 1 To cls - 1
                    Kq(j, z) = Nguon(i, z)
                Next z
            Next j
            x = x + k
        End If
    End If
OK phần số lượng tách với số lượng gốc
Vẫn còn vấn đề là tách không đúng như mình mong muốn
Mình muốn kết quả tách như sau.
Note: Mã hàng 42711K01902 & 42711k56V01
Tách theo số lượng 4
Ví Dụ :
* số lượng > 4
-42711K01902 có số lượng 10 thì tách ra làm 4 dòng (2 dòng số lượng 4 và 2 dòng số lượng 1)
* số lượng = 4 không tách

* số lượng < 4 Tách thành 1

42711K01902 có số lượng 3 thì tách ra làm 3 dòng số lượng 1

=> Còn lại những mã hàng khác tách theo số lượng 5

Ví dụ :

* số lượng >5

Mã hàng 42711GBGB20 có số lượng 8 thì tách làm 2 dòng( 1 dòng số lượng 5 và 1 dòng số lượng 3)

* số lượng <=5 không tách
Bạn giúp mình với nhé.
Thanks
 
Upvote 0
OK phần số lượng tách với số lượng gốc
Vẫn còn vấn đề là tách không đúng như mình mong muốn
Mình muốn kết quả tách như sau.
Note: Mã hàng 42711K01902 & 42711k56V01
Tách theo số lượng 4
Ví Dụ :
* số lượng > 4
-42711K01902 có số lượng 10 thì tách ra làm 4 dòng (2 dòng số lượng 4 và 2 dòng số lượng 1)
* số lượng = 4 không tách

* số lượng < 4 Tách thành 1

42711K01902 có số lượng 3 thì tách ra làm 3 dòng số lượng 1

=> Còn lại những mã hàng khác tách theo số lượng 5

Ví dụ :

* số lượng >5

Mã hàng 42711GBGB20 có số lượng 8 thì tách làm 2 dòng( 1 dòng số lượng 5 và 1 dòng số lượng 3)

* số lượng <=5 không tách
Bạn giúp mình với nhé.
Cảm ơn
Chạy code của mình gởi chưa
 
Upvote 0
Chạy code của mình gởi chưa
Code này phải không bạn.
Nếu code này thì như ý trên mình nói.
Sub a_abc()
Dim Nguon
Dim MHA, MHB
Dim Kq
Dim Gh
Dim i, j, k, x, z, t
Dim rws As Long, cls As Long
Nguon = Sheet1.Range("A2", Sheet1.Range("Q65000").End(xlUp))
rws = UBound(Nguon)
cls = UBound(Nguon, 2)
ReDim Kq(1 To rws * 10, 1 To cls)

MHA = "42711K01902"
MHB = "42711k56V01"
For i = 1 To rws
If Nguon(i, 8) = MHA Or Nguon(i, 8) = MHB Then
Gh = 5
Else
Gh = 4
End If
k = Nguon(i, cls)
Do While k >= Gh
x = x + 1
Kq(x, cls) = Gh
For z = 1 To cls - 1
Kq(x, z) = Nguon(i, z)
Next z
k = k - Gh
Loop
If k Then
If Gh = 5 Then
x = x + 1
Kq(x, cls) = k
For z = 1 To cls - 1
Kq(x, z) = Nguon(i, z)
Next z
Else
For j = x + 1 To x + k
Kq(j, cls) = 1
For z = 1 To cls - 1
Kq(j, z) = Nguon(i, z)
Next z
Next j
x = x + k
End If
End If
Next i
With Sheet2
.Range("A2").Resize(1000, cls).Clear
.Range("A2").Resize(x, cls) = Kq
.Sort.SortFields.Clear
.Sort.SortFields.Add2 Key:= _
.Range("Q2:Q" & x + 1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
.Sort.SetRange Range("A1:Q" & x + 1)
.Sort.Header = xlYes
.Sort.MatchCase = False
.Sort.Orientation = xlTopToBottom
.Sort.SortMethod = xlPinYin
.Sort.Apply
.UsedRange.Columns.AutoFit
End With
End Sub
 
Upvote 0
Code này phải không bạn.
Nếu code này thì như ý trên mình nói.
Sub a_abc()
Dim Nguon
Dim MHA, MHB
Dim Kq
Dim Gh
Dim i, j, k, x, z, t
Dim rws As Long, cls As Long
Nguon = Sheet1.Range("A2", Sheet1.Range("Q65000").End(xlUp))
rws = UBound(Nguon)
cls = UBound(Nguon, 2)
ReDim Kq(1 To rws * 10, 1 To cls)

MHA = "42711K01902"
MHB = "42711k56V01"
For i = 1 To rws
If Nguon(i, 8) = MHA Or Nguon(i, 8) = MHB Then
Gh = 5
Else
Gh = 4
End If
k = Nguon(i, cls)
Do While k >= Gh
x = x + 1
Kq(x, cls) = Gh
For z = 1 To cls - 1
Kq(x, z) = Nguon(i, z)
Next z
k = k - Gh
Loop
If k Then
If Gh = 5 Then
x = x + 1
Kq(x, cls) = k
For z = 1 To cls - 1
Kq(x, z) = Nguon(i, z)
Next z
Else
For j = x + 1 To x + k
Kq(j, cls) = 1
For z = 1 To cls - 1
Kq(j, z) = Nguon(i, z)
Next z
Next j
x = x + k
End If
End If
Next i
With Sheet2
.Range("A2").Resize(1000, cls).Clear
.Range("A2").Resize(x, cls) = Kq
.Sort.SortFields.Clear
.Sort.SortFields.Add2 Key:= _
.Range("Q2:Q" & x + 1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
.Sort.SetRange Range("A1:Q" & x + 1)
.Sort.Header = xlYes
.Sort.MatchCase = False
.Sort.Orientation = xlTopToBottom
.Sort.SortMethod = xlPinYin
.Sort.Apply
.UsedRange.Columns.AutoFit
End With
End Sub
Sub ABC() bài #19 mờ
 
Upvote 0
Code đó nhấn tách không chạy được bạn ơi.
Code đó viết cho file bài #7
Chỉnh lại tên sheet cho file mới
Mã:
Sub ABC()
  Dim sArr(), Res(), conMa$, SL&, slMax&
  Dim i&, r&, k&, sRow&, sCol&
 
  With Sheets("DL_IRV")
    sArr = .Range("A2", .Range("Q65000").End(xlUp)).Value
  End With
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim Res(1 To sRow * 10, 1 To sCol)
  conMa = "42711K01902,42711k56V01"
  For i = 1 To sRow
    If InStr(1, conMa, sArr(i, 8)) Then slMax = 4 Else slMax = 5
    SL = sArr(i, sCol)
    For r = 1 To SL \ slMax
      k = k + 1
      Res(k, sCol) = slMax
      Call GanDong(sArr, i, Res, k, sCol - 1)
    Next r
    SL = SL Mod slMax
    If SL > 0 Then
      If slMax = 5 Then
        k = k + 1
        Res(k, sCol) = SL
        Call GanDong(sArr, i, Res, k, sCol - 1)
      Else
        For r = 1 To SL
          k = k + 1
          Res(k, sCol) = 1
          Call GanDong(sArr, i, Res, k, sCol - 1)
        Next r
      End If
    End If
  Next i
  With Sheets("KQ_IRV")
    .Range("A2:Q10000").Clear
    .Range("A2").Resize(k, sCol) = Res
    .Range("A2").Resize(k, sCol).Sort .Range("Q2"), 1, Header:=xlNo
  End With
End Sub

Private Sub GanDong(sArr, i, Res, k, ByVal sC&)
  Dim j&
  For j = 1 To sC
    Res(k, j) = sArr(i, j)
  Next j
End Sub
 

File đính kèm

  • Tach_Drop shipment(F).xlsm
    40.5 KB · Đọc: 9
Upvote 0
Code đó viết cho file bài #7
Chỉnh lại tên sheet cho file mới
Mã:
Sub ABC()
  Dim sArr(), Res(), conMa$, SL&, slMax&
  Dim i&, r&, k&, sRow&, sCol&

  With Sheets("DL_IRV")
    sArr = .Range("A2", .Range("Q65000").End(xlUp)).Value
  End With
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim Res(1 To sRow * 10, 1 To sCol)
  conMa = "42711K01902,42711k56V01"
  For i = 1 To sRow
    If InStr(1, conMa, sArr(i, 8)) Then slMax = 4 Else slMax = 5
    SL = sArr(i, sCol)
    For r = 1 To SL \ slMax
      k = k + 1
      Res(k, sCol) = slMax
      Call GanDong(sArr, i, Res, k, sCol - 1)
    Next r
    SL = SL Mod slMax
    If SL > 0 Then
      If slMax = 5 Then
        k = k + 1
        Res(k, sCol) = SL
        Call GanDong(sArr, i, Res, k, sCol - 1)
      Else
        For r = 1 To SL
          k = k + 1
          Res(k, sCol) = 1
          Call GanDong(sArr, i, Res, k, sCol - 1)
        Next r
      End If
    End If
  Next i
  With Sheets("KQ_IRV")
    .Range("A2:Q10000").Clear
    .Range("A2").Resize(k, sCol) = Res
    .Range("A2").Resize(k, sCol).Sort .Range("Q2"), 1, Header:=xlNo
  End With
End Sub

Private Sub GanDong(sArr, i, Res, k, ByVal sC&)
  Dim j&
  For j = 1 To sC
    Res(k, j) = sArr(i, j)
  Next j
End Sub
Chuẩn luôn rồi bạn ơi ,cảm ơn bạn nhiều nhé.
 
Upvote 0
Code đó viết cho file bài #7
Chỉnh lại tên sheet cho file mới
Mã:
Sub ABC()
  Dim sArr(), Res(), conMa$, SL&, slMax&
  Dim i&, r&, k&, sRow&, sCol&

  With Sheets("DL_IRV")
    sArr = .Range("A2", .Range("Q65000").End(xlUp)).Value
  End With
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim Res(1 To sRow * 10, 1 To sCol)
  conMa = "42711K01902,42711k56V01"
  For i = 1 To sRow
    If InStr(1, conMa, sArr(i, 8)) Then slMax = 4 Else slMax = 5
    SL = sArr(i, sCol)
    For r = 1 To SL \ slMax
      k = k + 1
      Res(k, sCol) = slMax
      Call GanDong(sArr, i, Res, k, sCol - 1)
    Next r
    SL = SL Mod slMax
    If SL > 0 Then
      If slMax = 5 Then
        k = k + 1
        Res(k, sCol) = SL
        Call GanDong(sArr, i, Res, k, sCol - 1)
      Else
        For r = 1 To SL
          k = k + 1
          Res(k, sCol) = 1
          Call GanDong(sArr, i, Res, k, sCol - 1)
        Next r
      End If
    End If
  Next i
  With Sheets("KQ_IRV")
    .Range("A2:Q10000").Clear
    .Range("A2").Resize(k, sCol) = Res
    .Range("A2").Resize(k, sCol).Sort .Range("Q2"), 1, Header:=xlNo
  End With
End Sub

Private Sub GanDong(sArr, i, Res, k, ByVal sC&)
  Dim j&
  For j = 1 To sC
    Res(k, j) = sArr(i, j)
  Next j
End Sub
Bạn ơi lại nhờ bạn chút cho hoàn chỉnh file .
+Sau khi làm xong mình lưu lại thì báo lỗi như file đính kèm(bạn xem lỗi này như thế nào giúp mình với)
+ sau khi sắp sếp theo số lượng từ nhỏ đến lớn thì qua sắp xếp mã hàng từ nhỏ đến lớn.
Thanks
 

File đính kèm

  • lỖI.pptx
    188.4 KB · Đọc: 3
Upvote 0
Bạn ơi lại nhờ bạn chút cho hoàn chỉnh file .
+Sau khi làm xong mình lưu lại thì báo lỗi như file đính kèm(bạn xem lỗi này như thế nào giúp mình với)
+ sau khi sắp sếp theo số lượng từ nhỏ đến lớn thì qua sắp xếp mã hàng từ nhỏ đến lớn.
Cảm ơn
Lỗi từ file gốc, có thể do cài add in tự tạo, do phần mềm xuất ra excel không chuẩn ..., bạn tạo file mới và copy dán giá trị vào file mới sẽ hết lỗi
Chỉnh lệnh Sort
.Range("A2").Resize(k, sCol).Sort .Range("Q2"), 1, Range("H2"), , 1, Header:=xlNo
 
Lần chỉnh sửa cuối:
Upvote 0
Lỗi từ file gốc, có thể do cài add in tự tạo, do phần mềm xuất ra excel không chuẩn ..., bạn tạo file mới và copy dán giá trị vào file mới sẽ hết lỗi
Chỉnh lệnh Sort
.Range("A2").Resize(k, sCol).Sort .Range("Q2"), 1, Range("H2"), , 1, Header:=xlNo
Thanks bạn
 
Upvote 0
Code đó viết cho file bài #7
Chỉnh lại tên sheet cho file mới
Mã:
Sub ABC()
  Dim sArr(), Res(), conMa$, SL&, slMax&
  Dim i&, r&, k&, sRow&, sCol&

  With Sheets("DL_IRV")
    sArr = .Range("A2", .Range("Q65000").End(xlUp)).Value
  End With
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim Res(1 To sRow * 10, 1 To sCol)
  conMa = "42711K01902,42711k56V01"
  For i = 1 To sRow
    If InStr(1, conMa, sArr(i, 8)) Then slMax = 4 Else slMax = 5
    SL = sArr(i, sCol)
    For r = 1 To SL \ slMax
      k = k + 1
      Res(k, sCol) = slMax
      Call GanDong(sArr, i, Res, k, sCol - 1)
    Next r
    SL = SL Mod slMax
    If SL > 0 Then
      If slMax = 5 Then
        k = k + 1
        Res(k, sCol) = SL
        Call GanDong(sArr, i, Res, k, sCol - 1)
      Else
        For r = 1 To SL
          k = k + 1
          Res(k, sCol) = 1
          Call GanDong(sArr, i, Res, k, sCol - 1)
        Next r
      End If
    End If
  Next i
  With Sheets("KQ_IRV")
    .Range("A2:Q10000").Clear
    .Range("A2").Resize(k, sCol) = Res
    .Range("A2").Resize(k, sCol).Sort .Range("Q2"), 1, Header:=xlNo
  End With
End Sub

Private Sub GanDong(sArr, i, Res, k, ByVal sC&)
  Dim j&
  For j = 1 To sC
    Res(k, j) = sArr(i, j)
  Next j
End Sub
Bạn ơi lại nhờ bạn xíu.
Vẫn là file hôm bữa (vẫn tách như cũ)
Nhưng giờ mình muốn SHEET KQ thể hiện những cột cần(những cột không cần thì không lấy qua) + Thêm cột "No." tự đông đánh số thứ tự khi các bước tách và sort xong(
Note : Tách =>Sort số lượng từ nhỏ đến lớn => Sort mã hàng từ nhỏ đến lớn => tự động đánh số thứ tự từ nhỏ đến lớn.
Mình đính kèm file phía dưới nhé.
Bạn xem làm giúp mình nhé.
Cảm ơn bạn nhiều.
 

File đính kèm

  • Tach_Drop shipment(F).xlsm
    29 KB · Đọc: 9
Upvote 0
Bạn ơi lại nhờ bạn xíu.
Vẫn là file hôm bữa (vẫn tách như cũ)
Nhưng giờ mình muốn SHEET KQ thể hiện những cột cần(những cột không cần thì không lấy qua) + Thêm cột "No." tự đông đánh số thứ tự khi các bước tách và sort xong(
Note : Tách =>Sort số lượng từ nhỏ đến lớn => Sort mã hàng từ nhỏ đến lớn => tự động đánh số thứ tự từ nhỏ đến lớn.
Mình đính kèm file phía dưới nhé.
Bạn xem làm giúp mình nhé.
Cảm ơn bạn nhiều.
Mã:
Sub ABC()
  Dim sArr(), acol, Res(), conMa$, SL&, slMax&
  Dim i&, r&, k&, sRow&, sCol&
 
  acol = Array("", 1, 2, 8, 9, 11)
  conMa = "42711K01902,42711k56V01"
  With Sheets("DL_IRV")
    sArr = .Range("A2", .Range("Q65000").End(xlUp)).Value
  End With
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim Res(1 To sRow * 10, 1 To 7)
 
  For i = 1 To sRow
    If InStr(1, conMa, sArr(i, 8)) Then slMax = 4 Else slMax = 5
    SL = sArr(i, sCol)
    For r = 1 To SL \ slMax
      k = k + 1
      Res(k, 6) = slMax
      Call GanDong(sArr, i, Res, k, acol)
    Next r
    SL = SL Mod slMax
    If SL > 0 Then
      If slMax = 5 Then
        k = k + 1
        Res(k, 6) = SL
        Call GanDong(sArr, i, Res, k, acol)
      Else
        For r = 1 To SL
          k = k + 1
          Res(k, 6) = 1
          Call GanDong(sArr, i, Res, k, acol)
        Next r
      End If
    End If
  Next i
  With Sheets("KQ_IRV")
    .Range("A2:G10000").Clear
    .Range("B2").Resize(k, 7) = Res
    .Range("B2").Resize(k, 7).Sort .Range("G2"), 1, Range("D2"), , 1, Header:=xlNo
    .Range("A2") = 1
    .Range("A2").Resize(k).DataSeries
  End With
End Sub

Private Sub GanDong(sArr, i, Res, k, acol)
  Dim j&
  For j = 1 To UBound(acol)
    Res(k, j) = sArr(i, acol(j))
  Next j
End Sub
 
Upvote 0
Mã:
Sub ABC()
  Dim sArr(), acol, Res(), conMa$, SL&, slMax&
  Dim i&, r&, k&, sRow&, sCol&

  acol = Array("", 1, 2, 8, 9, 11)
  conMa = "42711K01902,42711k56V01"
  With Sheets("DL_IRV")
    sArr = .Range("A2", .Range("Q65000").End(xlUp)).Value
  End With
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim Res(1 To sRow * 10, 1 To 7)

  For i = 1 To sRow
    If InStr(1, conMa, sArr(i, 8)) Then slMax = 4 Else slMax = 5
    SL = sArr(i, sCol)
    For r = 1 To SL \ slMax
      k = k + 1
      Res(k, 6) = slMax
      Call GanDong(sArr, i, Res, k, acol)
    Next r
    SL = SL Mod slMax
    If SL > 0 Then
      If slMax = 5 Then
        k = k + 1
        Res(k, 6) = SL
        Call GanDong(sArr, i, Res, k, acol)
      Else
        For r = 1 To SL
          k = k + 1
          Res(k, 6) = 1
          Call GanDong(sArr, i, Res, k, acol)
        Next r
      End If
    End If
  Next i
  With Sheets("KQ_IRV")
    .Range("A2:G10000").Clear
    .Range("B2").Resize(k, 7) = Res
    .Range("B2").Resize(k, 7).Sort .Range("G2"), 1, Range("D2"), , 1, Header:=xlNo
    .Range("A2") = 1
    .Range("A2").Resize(k).DataSeries
  End With
End Sub

Private Sub GanDong(sArr, i, Res, k, acol)
  Dim j&
  For j = 1 To UBound(acol)
    Res(k, j) = sArr(i, acol(j))
  Next j
End Sub
Cảm ơn bạn nhiều nhé
 
Upvote 0
Mã:
Sub ABC()
  Dim sArr(), acol, Res(), conMa$, SL&, slMax&
  Dim i&, r&, k&, sRow&, sCol&

  acol = Array("", 1, 2, 8, 9, 11)
  conMa = "42711K01902,42711k56V01"
  With Sheets("DL_IRV")
    sArr = .Range("A2", .Range("Q65000").End(xlUp)).Value
  End With
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim Res(1 To sRow * 10, 1 To 7)

  For i = 1 To sRow
    If InStr(1, conMa, sArr(i, 8)) Then slMax = 4 Else slMax = 5
    SL = sArr(i, sCol)
    For r = 1 To SL \ slMax
      k = k + 1
      Res(k, 6) = slMax
      Call GanDong(sArr, i, Res, k, acol)
    Next r
    SL = SL Mod slMax
    If SL > 0 Then
      If slMax = 5 Then
        k = k + 1
        Res(k, 6) = SL
        Call GanDong(sArr, i, Res, k, acol)
      Else
        For r = 1 To SL
          k = k + 1
          Res(k, 6) = 1
          Call GanDong(sArr, i, Res, k, acol)
        Next r
      End If
    End If
  Next i
  With Sheets("KQ_IRV")
    .Range("A2:G10000").Clear
    .Range("B2").Resize(k, 7) = Res
    .Range("B2").Resize(k, 7).Sort .Range("G2"), 1, Range("D2"), , 1, Header:=xlNo
    .Range("A2") = 1
    .Range("A2").Resize(k).DataSeries
  End With
End Sub

Private Sub GanDong(sArr, i, Res, k, acol)
  Dim j&
  For j = 1 To UBound(acol)
    Res(k, j) = sArr(i, acol(j))
  Next j
End Sub
Bạn ơi xem lại mình giúp mã hàng vẫn chưa sort được từ nhỏ đến lớn .(cùng mã hàng mà lại làm nhiều dòng khác nhau => Chưa nằm gần nhau)
 
Upvote 0
Web KT

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

Back
Top Bottom