Chuyển đổi định dạng bảng biểu

Liên hệ QC

soledad_90

Thành viên thường trực
Tham gia
12/1/10
Bài viết
250
Được thích
43
Giới tính
Nam
Xin chào diễn đàn!
Hiện em có file chi tiết PKL
Tại sheet PKL với chi tiết thể hiện từng đơn hàng/mã hàng/màu sắc số thùng chi tiết/ số đôi / size số
với nhu cầu muốn chuyển đổi qua kết quả
Chuyển đổi qua sheet BienBan với kết quả chỉ mong muốn thể hiện ở dạng đơn hàng/mã hàng/màu sắc / số đôi / số thùng / size số chỉ cần đại diện không cần thể hiện hết
Và kết quả hiển thị sẽ cố định từ cột A tới cột O
Trong tệp đính kèm em có thể hiện rõ chi tiết .
Mong nhận được sự hỗ trợ từ diễn đàn về code VBA để giải đáp vấn đề trên ạ.
Em cảm ơn!1618369604030.png
 

File đính kèm

  • 210414_CHUYEN doi dinh dang file.xls
    384 KB · Đọc: 12
Xin chào diễn đàn!
Hiện em có file chi tiết PKL
Tại sheet PKL với chi tiết thể hiện từng đơn hàng/mã hàng/màu sắc số thùng chi tiết/ số đôi / size số
với nhu cầu muốn chuyển đổi qua kết quả
Chuyển đổi qua sheet BienBan với kết quả chỉ mong muốn thể hiện ở dạng đơn hàng/mã hàng/màu sắc / số đôi / số thùng / size số chỉ cần đại diện không cần thể hiện hết
Và kết quả hiển thị sẽ cố định từ cột A tới cột O
Trong tệp đính kèm em có thể hiện rõ chi tiết .
Mong nhận được sự hỗ trợ từ diễn đàn về code VBA để giải đáp vấn đề trên ạ.
Em cảm ơn!View attachment 257037
Dữ liệu của bạn bố trí gây khó cho việc "chuyển đổi" quá.
 
Dữ liệu quá chán mà diễn giải cũng khó hiểu, bạn nên rút gọn lại 1 2 đơn ít mã với ít màu thôi điền kết quả mong muốn may ra mới hiểu được. Sáng nhìn dữ liệu đã nản, đọc một hồi càng khó hiểu là muốn gì bỏ cuộc luôn
 
Dữ liệu quá chán mà diễn giải cũng khó hiểu, bạn nên rút gọn lại 1 2 đơn ít mã với ít màu thôi điền kết quả mong muốn may ra mới hiểu được. Sáng nhìn dữ liệu đã nản, đọc một hồi càng khó hiểu là muốn gì bỏ cuộc luôn
Em có sửa lại đề bài và kết quả mong muốn lấy mẫu 1 đơn hàng, như tệp đính kèm
Mong nhận dc sự giúp đỡ ạ
 

File đính kèm

  • 210414_CHUYEN doi dinh dang file-chinh.xls
    172.5 KB · Đọc: 3
Dữ liệu quá chán mà diễn giải cũng khó hiểu, bạn nên rút gọn lại 1 2 đơn ít mã với ít màu thôi điền kết quả mong muốn may ra mới hiểu được. Sáng nhìn dữ liệu đã nản, đọc một hồi càng khó hiểu là muốn gì bỏ cuộc luôn
Tôi đọc hoài rốt cuộc cũng hiểu được nhưng quả thực dữ liệu kinh quá nên nghĩ giải thuật nát cả óc
 
Em có sửa lại đề bài và kết quả mong muốn lấy mẫu 1 đơn hàng, như tệp đính kèm
Mong nhận dc sự giúp đỡ ạ
Bạn nghiên cứu theo hướng này xem nhìn dữ liệu của bạn thật sự nản, làm xong chẳng buồn kiểm tra
 

File đính kèm

  • 210414_CHUYEN doi dinh dang file.xls
    519 KB · Đọc: 4
Tôi đọc hoài rốt cuộc cũng hiểu được nhưng quả thực dữ liệu kinh quá nên nghĩ giải thuật nát cả óc
Chào diễn đàn và chúc mọi người ngày mới đầy năng lượng.

Cảm ơn anh và việc suy nghĩ cách giải cho yêu cầu trên của em.
Về dữ liệu đầu vào như em đã trình bày, đó là yêu cầu biểu mẫu chuẩn từ khách hàng nhận hàng.
Do vậy việc thay đổi biểu mẫu gốc ban đầu là không thể.
Dù sao cũng cảm ơn anh nhiều về việc đã quan tâm tới chủ đề này.
Bài đã được tự động gộp:

Bạn nghiên cứu theo hướng này xem nhìn dữ liệu của bạn thật sự nản, làm xong chẳng buồn kiểm tra
Em có koi kết quả quả rồi, không đúng như yêu cầu.
Dù sao cũng rất cảm ơn vì đã phản hồi yêu cầu của em .
Xin cảm ơn!
 
Lần chỉnh sửa cuối:
Xin chào diễn đàn!
Hiện em có file chi tiết PKL
Tại sheet PKL với chi tiết thể hiện từng đơn hàng/mã hàng/màu sắc số thùng chi tiết/ số đôi / size số
với nhu cầu muốn chuyển đổi qua kết quả
Chuyển đổi qua sheet BienBan với kết quả chỉ mong muốn thể hiện ở dạng đơn hàng/mã hàng/màu sắc / số đôi / số thùng / size số chỉ cần đại diện không cần thể hiện hết
Và kết quả hiển thị sẽ cố định từ cột A tới cột O
Trong tệp đính kèm em có thể hiện rõ chi tiết .
Mong nhận được sự hỗ trợ từ diễn đàn về code VBA để giải đáp vấn đề trên ạ.
Em cảm ơn!View attachment 257037
Không được xóa 3 dòng đầu và 2 dòng cuối sheet BienBan
Chạy code
Mã:
Sub XYZ()
  Dim sArr(), Arr(), Res(), Dic As Object, iKey$
  Dim sRow&, i&, k&, r&, fR&, t&, TT#, TT2#
  Dim tmp, tDH$, soDH$, iCode$
 
  Set Dic = CreateObject("scripting.dictionary")
  Application.ScreenUpdating = False
  With Sheets("BienBan")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("A" & i - 1).Resize(2, 15).Copy Range("Q2")
    If i > 3 Then .Range("A4:O" & i).Clear
  End With
 
  With Sheets("PKL")
    sArr = .Range("A8:AB" & .Range("D" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  ReDim Arr(1 To sRow, 1 To 8)
  For i = 1 To sRow
    tmp = sArr(i, 1)
    If Len(tmp) >= 35 Then
      tDH = Trim(Split(Split(tmp, "(")(1), ")")(0))
      iCode = Trim(Split(tmp, ":")(1))
      If soDH <> tDH Then
        soDH = tDH
        fR = k + 1
        Arr(fR, 8) = soDH
      End If
    ElseIf tmp <> Empty And IsNumeric(tmp) Then
      iKey = soDH & "|" & iCode & "|" & sArr(i, 4)
      If Dic.exists(iKey) = False Then
        k = k + 1
        Dic.Add iKey, k
        Arr(k, 1) = iCode: Arr(k, 2) = sArr(i, 4)
        Arr(fR, 7) = Arr(fR, 7) + 1
      End If
      r = Dic.Item(iKey)
      Arr(r, 3) = Arr(r, 3) + sArr(i, 28)
      Arr(r, 4) = Arr(r, 4) + sArr(i, 27)
      
      Arr(fR, 5) = Arr(fR, 5) + sArr(i, 28)
      Arr(fR, 6) = Arr(fR, 6) + sArr(i, 27)
      TT = TT + sArr(i, 28):    TT2 = TT2 + sArr(i, 27)
    End If
  Next i
  fR = 1
  With Sheets("BienBan")
    For i = 1 To k
      If Arr(i, 8) <> Empty Then
        sRow = Arr(i, 7)
        Range("A1:O2").Copy .Range("A" & fR)
        Range("A3:O3").Copy .Range("A" & fR + 2).Resize(sRow)
        Range("Q2:AE2").Copy .Range("A" & fR + sRow + 2)
        t = 0
        ReDim Res(1 To sRow, 1 To 15)
        For r = i To i + sRow - 1
          t = t + 1
          Res(t, 1) = Arr(r, 1):    Res(t, 2) = Arr(r, 2)
          Res(t, 14) = Arr(r, 3):   Res(t, 15) = Arr(r, 4)
        Next r
        .Range("A" & fR + 2).Resize(sRow, 15) = Res
        .Range("J" & fR) = Arr(i, 8)
        .Range("N" & fR + sRow + 2) = Arr(i, 5)
        .Range("O" & fR + sRow + 2) = Arr(i, 6)
        If fR > 1 Then .Range("A" & fR).ClearContents
        fR = fR + sRow + 3
        i = r - 1
      End If
    Next i
    .Range("Q3:AE3").Copy .Range("A" & fR)
    .Range("N" & fR) = TT
    .Range("O" & fR) = TT2
    .Range("Q2:AE3").Clear
  End With
  Application.ScreenUpdating = True
End Sub
 

File đính kèm

  • 210414_CHUYEN doi dinh dang file.xlsm
    226.8 KB · Đọc: 7
Kết quả 2 cột cuối đang đúng cái bạn gõ tay còn các cột trên bạn có điền gì đâu mà biết đúng sai
View attachment 257101
Em có gửi lại kết quả mong muốn cũng như chỉ ra các mục thể hiện chưa đúng như yêu cầu.
Với kết quả này, theo em hiểu thì sẽ cần làm thêm nhiều thao tác nữa cũng sẽ ra kết quả mong muốn.
Nhưng sẽ thay đổi lại biểu mẫu kết quả thể hiện. em sẽ tham khảo kết quả này ạ
Em cảm ơn ạ!

1618454366717.png
Bài đã được tự động gộp:

Không được xóa 3 dòng đầu và 2 dòng cuối sheet BienBan
Chạy code
Mã:
Sub XYZ()
  Dim sArr(), Arr(), Res(), Dic As Object, iKey$
  Dim sRow&, i&, k&, r&, fR&, t&, TT#, TT2#
  Dim tmp, tDH$, soDH$, iCode$

  Set Dic = CreateObject("scripting.dictionary")
  Application.ScreenUpdating = False
  With Sheets("BienBan")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("A" & i - 1).Resize(2, 15).Copy Range("Q2")
    If i > 3 Then .Range("A4:O" & i).Clear
  End With

  With Sheets("PKL")
    sArr = .Range("A8:AB" & .Range("D" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  ReDim Arr(1 To sRow, 1 To 8)
  For i = 1 To sRow
    tmp = sArr(i, 1)
    If Len(tmp) >= 35 Then
      tDH = Trim(Split(Split(tmp, "(")(1), ")")(0))
      iCode = Trim(Split(tmp, ":")(1))
      If soDH <> tDH Then
        soDH = tDH
        fR = k + 1
        Arr(fR, 8) = soDH
      End If
    ElseIf tmp <> Empty And IsNumeric(tmp) Then
      iKey = soDH & "|" & iCode & "|" & sArr(i, 4)
      If Dic.exists(iKey) = False Then
        k = k + 1
        Dic.Add iKey, k
        Arr(k, 1) = iCode: Arr(k, 2) = sArr(i, 4)
        Arr(fR, 7) = Arr(fR, 7) + 1
      End If
      r = Dic.Item(iKey)
      Arr(r, 3) = Arr(r, 3) + sArr(i, 28)
      Arr(r, 4) = Arr(r, 4) + sArr(i, 27)
     
      Arr(fR, 5) = Arr(fR, 5) + sArr(i, 28)
      Arr(fR, 6) = Arr(fR, 6) + sArr(i, 27)
      TT = TT + sArr(i, 28):    TT2 = TT2 + sArr(i, 27)
    End If
  Next i
  fR = 1
  With Sheets("BienBan")
    For i = 1 To k
      If Arr(i, 8) <> Empty Then
        sRow = Arr(i, 7)
        Range("A1:O2").Copy .Range("A" & fR)
        Range("A3:O3").Copy .Range("A" & fR + 2).Resize(sRow)
        Range("Q2:AE2").Copy .Range("A" & fR + sRow + 2)
        t = 0
        ReDim Res(1 To sRow, 1 To 15)
        For r = i To i + sRow - 1
          t = t + 1
          Res(t, 1) = Arr(r, 1):    Res(t, 2) = Arr(r, 2)
          Res(t, 14) = Arr(r, 3):   Res(t, 15) = Arr(r, 4)
        Next r
        .Range("A" & fR + 2).Resize(sRow, 15) = Res
        .Range("J" & fR) = Arr(i, 8)
        .Range("N" & fR + sRow + 2) = Arr(i, 5)
        .Range("O" & fR + sRow + 2) = Arr(i, 6)
        If fR > 1 Then .Range("A" & fR).ClearContents
        fR = fR + sRow + 3
        i = r - 1
      End If
    Next i
    .Range("Q3:AE3").Copy .Range("A" & fR)
    .Range("N" & fR) = TT
    .Range("O" & fR) = TT2
    .Range("Q2:AE3").Clear
  End With
  Application.ScreenUpdating = True
End Sub
Em cảm ơn anh nhiều ạ.
Kết quả thể hiện giống như yêu cầu làm thủ công bằng tay mong muốn ạ.
Code chạy tốt ạ.
Bài đã được tự động gộp:

Không được xóa 3 dòng đầu và 2 dòng cuối sheet BienBan
Chạy code
Mã:
Sub XYZ()
  Dim sArr(), Arr(), Res(), Dic As Object, iKey$
  Dim sRow&, i&, k&, r&, fR&, t&, TT#, TT2#
  Dim tmp, tDH$, soDH$, iCode$

  Set Dic = CreateObject("scripting.dictionary")
  Application.ScreenUpdating = False
  With Sheets("BienBan")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("A" & i - 1).Resize(2, 15).Copy Range("Q2")
    If i > 3 Then .Range("A4:O" & i).Clear
  End With

  With Sheets("PKL")
    sArr = .Range("A8:AB" & .Range("D" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  ReDim Arr(1 To sRow, 1 To 8)
  For i = 1 To sRow
    tmp = sArr(i, 1)
    If Len(tmp) >= 35 Then
      tDH = Trim(Split(Split(tmp, "(")(1), ")")(0))
      iCode = Trim(Split(tmp, ":")(1))
      If soDH <> tDH Then
        soDH = tDH
        fR = k + 1
        Arr(fR, 8) = soDH
      End If
    ElseIf tmp <> Empty And IsNumeric(tmp) Then
      iKey = soDH & "|" & iCode & "|" & sArr(i, 4)
      If Dic.exists(iKey) = False Then
        k = k + 1
        Dic.Add iKey, k
        Arr(k, 1) = iCode: Arr(k, 2) = sArr(i, 4)
        Arr(fR, 7) = Arr(fR, 7) + 1
      End If
      r = Dic.Item(iKey)
      Arr(r, 3) = Arr(r, 3) + sArr(i, 28)
      Arr(r, 4) = Arr(r, 4) + sArr(i, 27)
     
      Arr(fR, 5) = Arr(fR, 5) + sArr(i, 28)
      Arr(fR, 6) = Arr(fR, 6) + sArr(i, 27)
      TT = TT + sArr(i, 28):    TT2 = TT2 + sArr(i, 27)
    End If
  Next i
  fR = 1
  With Sheets("BienBan")
    For i = 1 To k
      If Arr(i, 8) <> Empty Then
        sRow = Arr(i, 7)
        Range("A1:O2").Copy .Range("A" & fR)
        Range("A3:O3").Copy .Range("A" & fR + 2).Resize(sRow)
        Range("Q2:AE2").Copy .Range("A" & fR + sRow + 2)
        t = 0
        ReDim Res(1 To sRow, 1 To 15)
        For r = i To i + sRow - 1
          t = t + 1
          Res(t, 1) = Arr(r, 1):    Res(t, 2) = Arr(r, 2)
          Res(t, 14) = Arr(r, 3):   Res(t, 15) = Arr(r, 4)
        Next r
        .Range("A" & fR + 2).Resize(sRow, 15) = Res
        .Range("J" & fR) = Arr(i, 8)
        .Range("N" & fR + sRow + 2) = Arr(i, 5)
        .Range("O" & fR + sRow + 2) = Arr(i, 6)
        If fR > 1 Then .Range("A" & fR).ClearContents
        fR = fR + sRow + 3
        i = r - 1
      End If
    Next i
    .Range("Q3:AE3").Copy .Range("A" & fR)
    .Range("N" & fR) = TT
    .Range("O" & fR) = TT2
    .Range("Q2:AE3").Clear
  End With
  Application.ScreenUpdating = True
End Sub
Với S0 : 223314B / anh có thay đổi code cho kết quả hiển thị gộp chung là 1 trường dữ liệu, chứ không tách ra thành 2 nhóm giống như sheet dữ liệu PKL
Em có gửi hình ảnh kết quả thể hiện ạ.
Em cảm ơn!

1618455194798.png
 

File đính kèm

  • 210414_CHUYEN doi dinh dang file.xls
    554 KB · Đọc: 2
Lần chỉnh sửa cuối:
Em có gửi lại kết quả mong muốn cũng như chỉ ra các mục thể hiện chưa đúng như yêu cầu.
Với kết quả này, theo em hiểu thì sẽ cần làm thêm nhiều thao tác nữa cũng sẽ ra kết quả mong muốn.
Nhưng sẽ thay đổi lại biểu mẫu kết quả thể hiện. em sẽ tham khảo kết quả này ạ
Em cảm ơn ạ!

View attachment 257106
Bài đã được tự động gộp:


Em cảm ơn anh nhiều ạ.
Kết quả thể hiện giống như yêu cầu làm thủ công bằng tay mong muốn ạ.
Code chạy tốt ạ.
Bài đã được tự động gộp:


Với S0 : 223314B / anh có thay đổi code cho kết quả hiển thị gộp chung là 1 trường dữ liệu, chứ không tách ra thành 2 nhóm giống như sheet dữ liệu PKL
Em có gửi hình ảnh kết quả thể hiện ạ.
Em cảm ơn!

View attachment 257111
Chỉnh code
Mã:
Sub XYZ()
  Dim sArr(), Arr(), Res(), Dic As Object, iKey$
  Dim sRow&, fR&, i&, iR&, n&, k&, TT#, TT2#
  Dim tmp, tDH$, soDH$, iCode$
 
  Set Dic = CreateObject("scripting.dictionary")
  Application.ScreenUpdating = False
  With Sheets("BienBan")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("A" & i - 1).Resize(2, 15).Copy Range("Q2")
    If i > 3 Then .Range("A4:O" & i).Clear
  End With
 
  With Sheets("PKL")
    sArr = .Range("A8:AB" & .Range("D" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  ReDim Arr(1 To 101, 1 To 15)
  For i = 1 To sRow
    tmp = sArr(i, 1)
    If Len(tmp) >= 35 Then
      soDH = Trim(Split(Split(tmp, "(")(1), ")")(0))
      iCode = Trim(Split(tmp, ":")(1))
      If Dic.exists(soDH) = False Then
        k = k + 1
        Dic.Add soDH, k
        ReDim Preserve Res(1 To k)
        Res(k) = Arr
        Res(k)(101, 1) = soDH
      End If
    ElseIf tmp <> Empty And IsNumeric(tmp) Then
      n = Dic.Item(soDH)
      iKey = soDH & "|" & iCode & "|" & sArr(i, 4)
      If Dic.exists(iKey) = False Then
        iR = Res(n)(101, 2) + 1
        Res(n)(101, 2) = iR
        Dic.Add iKey, iR
        Res(n)(iR, 1) = iCode: Res(n)(iR, 2) = sArr(i, 4)
      End If
      iR = Dic.Item(iKey)
      Res(n)(iR, 14) = Res(n)(iR, 14) + sArr(i, 28)
      Res(n)(iR, 15) = Res(n)(iR, 15) + sArr(i, 27)
      
      Res(n)(101, 14) = Res(n)(101, 14) + sArr(i, 28)
      Res(n)(101, 15) = Res(n)(101, 15) + sArr(i, 27)
      TT = TT + sArr(i, 28):    TT2 = TT2 + sArr(i, 27)
    End If
  Next i
  fR = 1
  With Sheets("BienBan")
    For n = 1 To k
      sRow = Res(n)(101, 2)
      .Range("A1:O2").Copy .Range("A" & fR)
      .Range("A3:O3").Copy .Range("A" & fR + 2).Resize(sRow)
      .Range("Q2:AE2").Copy .Range("A" & fR + sRow + 2)
      
      .Range("A" & fR + 2).Resize(sRow, 15) = Res(n)
      .Range("J" & fR) = Res(n)(101, 1)
      .Range("N" & fR + sRow + 2) = Res(n)(101, 14)
      .Range("O" & fR + sRow + 2) = Res(n)(101, 15)
      If fR > 1 Then .Range("A" & fR).ClearContents
      fR = fR + sRow + 3
    Next n
    .Range("Q3:AE3").Copy .Range("A" & fR)
    .Range("N" & fR) = TT
    .Range("O" & fR) = TT2
    .Range("Q2:AE3").Clear
  End With
  Application.ScreenUpdating = True
End Sub
 
Với kết quả này, theo em hiểu thì sẽ cần làm thêm nhiều thao tác nữa cũng sẽ ra kết quả mong muốn
Mình nói chỉ là hướng cho bạn làm theo pivot table thôi mà, những cái bạn nói thực ra nếu bạn hiểu về pivot table thì rất đơn giản chưa đến một phút là xong, bạn chủ động chỉnh thì sẽ hiểu và tiện cho sau này nếu muốn chỉnh sửa. Còn dùng VBA thì nếu bạn không biết sau này nếu có thay đổi yêu cầu hay mẫu biểu sẽ không làm được.
 

File đính kèm

  • 210414_CHUYEN doi dinh dang file.xls
    543.5 KB · Đọc: 3
Chỉnh code
Mã:
Sub XYZ()
  Dim sArr(), Arr(), Res(), Dic As Object, iKey$
  Dim sRow&, fR&, i&, iR&, n&, k&, TT#, TT2#
  Dim tmp, tDH$, soDH$, iCode$

  Set Dic = CreateObject("scripting.dictionary")
  Application.ScreenUpdating = False
  With Sheets("BienBan")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("A" & i - 1).Resize(2, 15).Copy Range("Q2")
    If i > 3 Then .Range("A4:O" & i).Clear
  End With

  With Sheets("PKL")
    sArr = .Range("A8:AB" & .Range("D" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  ReDim Arr(1 To 101, 1 To 15)
  For i = 1 To sRow
    tmp = sArr(i, 1)
    If Len(tmp) >= 35 Then
      soDH = Trim(Split(Split(tmp, "(")(1), ")")(0))
      iCode = Trim(Split(tmp, ":")(1))
      If Dic.exists(soDH) = False Then
        k = k + 1
        Dic.Add soDH, k
        ReDim Preserve Res(1 To k)
        Res(k) = Arr
        Res(k)(101, 1) = soDH
      End If
    ElseIf tmp <> Empty And IsNumeric(tmp) Then
      n = Dic.Item(soDH)
      iKey = soDH & "|" & iCode & "|" & sArr(i, 4)
      If Dic.exists(iKey) = False Then
        iR = Res(n)(101, 2) + 1
        Res(n)(101, 2) = iR
        Dic.Add iKey, iR
        Res(n)(iR, 1) = iCode: Res(n)(iR, 2) = sArr(i, 4)
      End If
      iR = Dic.Item(iKey)
      Res(n)(iR, 14) = Res(n)(iR, 14) + sArr(i, 28)
      Res(n)(iR, 15) = Res(n)(iR, 15) + sArr(i, 27)
    
      Res(n)(101, 14) = Res(n)(101, 14) + sArr(i, 28)
      Res(n)(101, 15) = Res(n)(101, 15) + sArr(i, 27)
      TT = TT + sArr(i, 28):    TT2 = TT2 + sArr(i, 27)
    End If
  Next i
  fR = 1
  With Sheets("BienBan")
    For n = 1 To k
      sRow = Res(n)(101, 2)
      .Range("A1:O2").Copy .Range("A" & fR)
      .Range("A3:O3").Copy .Range("A" & fR + 2).Resize(sRow)
      .Range("Q2:AE2").Copy .Range("A" & fR + sRow + 2)
    
      .Range("A" & fR + 2).Resize(sRow, 15) = Res(n)
      .Range("J" & fR) = Res(n)(101, 1)
      .Range("N" & fR + sRow + 2) = Res(n)(101, 14)
      .Range("O" & fR + sRow + 2) = Res(n)(101, 15)
      If fR > 1 Then .Range("A" & fR).ClearContents
      fR = fR + sRow + 3
    Next n
    .Range("Q3:AE3").Copy .Range("A" & fR)
    .Range("N" & fR) = TT
    .Range("O" & fR) = TT2
    .Range("Q2:AE3").Clear
  End With
  Application.ScreenUpdating = True
End Sub
Em cảm ơn nhiều ạ. Đúng mong muốn cộng gộp các đơn hàng giống nhau rồi ạ.
Có điểm nhỏ này nữa ạ : về hệ size chạy : em đang thấy ở đây anh để cố định phải không ạ ? 3 dòng đầu tiên.
Để không quá phức tạp cho code và chạy tốt thì em sẽ điều chỉnh tay mục size số này cũng được ạ.
1618459932487.png

Em có sử dụng file kết quả này làm gốc để sử dụng chuyển đổi cho các lô hàng khác :
Nhưng code chạy chưa đúng yêu cầu :
Em có gửi tệp đính kèm ạ. Nếu muốn sử dụng code chạy cho các lô khác cần phải làm thao tác nào để đúng kết quả mong anh hướng dẫn ạ .
1618460376348.png
Bài đã được tự động gộp:

Mình nói chỉ là hướng cho bạn làm theo pivot table thôi mà, những cái bạn nói thực ra nếu bạn hiểu về pivot table thì rất đơn giản chưa đến một phút là xong, bạn chủ động chỉnh thì sẽ hiểu và tiện cho sau này nếu muốn chỉnh sửa. Còn dùng VBA thì nếu bạn không biết sau này nếu có thay đổi yêu cầu hay mẫu biểu sẽ không làm được.
Em cảm ơn nhiều ạ.
Vấn đề đã xảy ra khi lô hàng khác muốn chuyển đổi định dạng ạ.
Em đang vận dụng cách làm về pivot table ạ . Muốn làm được các trường dữ liệu dánh dấu này bắt buộc cần phải thiết lập phải không ạ ?
1618460748915.png
 

File đính kèm

  • 210414_CHUYEN doi dinh dang filevd khac.xlsm
    195.3 KB · Đọc: 5
Lần chỉnh sửa cuối:
Em cảm ơn nhiều ạ. Đúng mong muốn cộng gộp các đơn hàng giống nhau rồi ạ.
Có điểm nhỏ này nữa ạ : về hệ size chạy : em đang thấy ở đây anh để cố định phải không ạ ? 3 dòng đầu tiên.
Để không quá phức tạp cho code và chạy tốt thì em sẽ điều chỉnh tay mục size số này cũng được ạ.
View attachment 257113

Em có sử dụng file kết quả này làm gốc để sử dụng chuyển đổi cho các lô hàng khác :
Nhưng code chạy chưa đúng yêu cầu :
Em có gửi tệp đính kèm ạ. Nếu muốn sử dụng code chạy cho các lô khác cần phải làm thao tác nào để đúng kết quả mong anh hướng dẫn ạ .
View attachment 257118
Bài đã được tự động gộp:


Em cảm ơn nhiều ạ.
Vấn đề đã xảy ra khi lô hàng khác muốn chuyển đổi định dạng ạ.
Em đang vận dụng cách làm về pivot table ạ . Muốn làm được các trường dữ liệu dánh dấu này bắt buộc cần phải thiết lập phải không ạ ?
View attachment 257121
Chỉnh tiếp
Mã:
Sub XYZ()
  Dim sArr(), Arr(), Res(), Dic As Object, iKey$
  Dim sRow&, fR&, i&, iR&, n&, k&, TT#, TT2#
  Dim tmp, tDH$, soDH$, iCode$

  Set Dic = CreateObject("scripting.dictionary")
  Application.ScreenUpdating = False
  With Sheets("BienBan")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("A" & i - 1).Resize(2, 15).Copy .Range("Q2")
    If i > 3 Then .Range("A4:O" & i).Clear
  End With
 
  With Sheets("PKL")
    sArr = .Range("A8:AB" & .Range("D" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  ReDim Arr(1 To 101, 1 To 15)
  For i = 1 To sRow
    tmp = sArr(i, 1)
    If InStr(1, tmp, ")") > 0 Then
      soDH = Trim(Split(Split(tmp, "(")(1), ")")(0))
      iCode = Trim(Split(tmp, ":")(1))
      If Dic.exists(soDH) = False Then
        k = k + 1
        Dic.Add soDH, k
        ReDim Preserve Res(1 To k)
        Res(k) = Arr
        Res(k)(101, 1) = soDH
      End If
    ElseIf tmp <> Empty And IsNumeric(tmp) Then
      n = Dic.Item(soDH)
      iKey = soDH & "|" & iCode & "|" & sArr(i, 4)
      If Dic.exists(iKey) = False Then
        iR = Res(n)(101, 2) + 1
        Res(n)(101, 2) = iR
        Dic.Add iKey, iR
        Res(n)(iR, 1) = iCode: Res(n)(iR, 2) = sArr(i, 4)
      End If
      iR = Dic.Item(iKey)
      Res(n)(iR, 14) = Res(n)(iR, 14) + sArr(i, 28)
      Res(n)(iR, 15) = Res(n)(iR, 15) + sArr(i, 27)
      
      Res(n)(101, 14) = Res(n)(101, 14) + sArr(i, 28)
      Res(n)(101, 15) = Res(n)(101, 15) + sArr(i, 27)
      TT = TT + sArr(i, 28):    TT2 = TT2 + sArr(i, 27)
    End If
    
  Next i
  fR = 1
  With Sheets("BienBan")
    For n = 1 To k
      sRow = Res(n)(101, 2)
      .Range("A1:O2").Copy .Range("A" & fR)
      .Range("A3:O3").Copy .Range("A" & fR + 2).Resize(sRow)
      .Range("Q2:AE2").Copy .Range("A" & fR + sRow + 2)
      
      .Range("A" & fR + 2).Resize(sRow, 15) = Res(n)
      .Range("J" & fR) = Res(n)(101, 1)
      .Range("N" & fR + sRow + 2) = Res(n)(101, 14)
      .Range("O" & fR + sRow + 2) = Res(n)(101, 15)
      If fR > 1 Then .Range("A" & fR).ClearContents
      fR = fR + sRow + 3
    Next n
    .Range("Q3:AE3").Copy .Range("A" & fR)
    .Range("N" & fR) = TT
    .Range("O" & fR) = TT2
    .Range("Q2:AE3").Clear
  End With
  Application.ScreenUpdating = True
End Sub
 
Em cảm ơn nhiều ạ. Đúng mong muốn cộng gộp các đơn hàng giống nhau rồi ạ.
Có điểm nhỏ này nữa ạ : về hệ size chạy : em đang thấy ở đây anh để cố định phải không ạ ? 3 dòng đầu tiên.
Để không quá phức tạp cho code và chạy tốt thì em sẽ điều chỉnh tay mục size số này cũng được ạ.
View attachment 257113

Em có sử dụng file kết quả này làm gốc để sử dụng chuyển đổi cho các lô hàng khác :
Nhưng code chạy chưa đúng yêu cầu :
Em có gửi tệp đính kèm ạ. Nếu muốn sử dụng code chạy cho các lô khác cần phải làm thao tác nào để đúng kết quả mong anh hướng dẫn ạ .
View attachment 257118
Bài đã được tự động gộp:


Em cảm ơn nhiều ạ.
Vấn đề đã xảy ra khi lô hàng khác muốn chuyển đổi định dạng ạ.
Em đang vận dụng cách làm về pivot table ạ . Muốn làm được các trường dữ liệu dánh dấu này bắt buộc cần phải thiết lập phải không ạ ?
View attachment 257121
Chỉnh kết quả size
Mã:
Sub XYZ()
  Dim sArr(), Arr(), aSize(), Res(), Dic As Object, iKey$
  Dim sRow&, fR&, i&, j&, iR&, n&, k&, TT#, TT2#
  Dim tmp, tDH$, soDH$, iCode$

  ReDim aSize(1 To 1, 6 To 16)
  Set Dic = CreateObject("scripting.dictionary")
  Application.ScreenUpdating = False
  With Sheets("BienBan")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("A" & i - 1).Resize(2, 15).Copy .Range("Q2")
    If i > 3 Then .Range("A4:O" & i).Clear
  End With
 
  With Sheets("PKL")
    sArr = .Range("A7:AB" & .Range("D" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  ReDim Arr(1 To 101, 1 To 15)
  For i = 2 To sRow
    tmp = sArr(i, 1)
    If InStr(1, tmp, ")") > 0 Then
      soDH = Trim(Split(Split(tmp, "(")(1), ")")(0))
      iCode = Trim(Split(tmp, ":")(1))
      If Dic.exists(soDH) = False Then
        k = k + 1
        Dic.Add soDH, k
        ReDim Preserve Res(1 To k)
        Res(k) = Arr
        Res(k)(101, 1) = soDH
        Res(k)(101, 3) = aSize
        For j = 6 To 16
          Res(k)(101, 3)(1, j) = sArr(i - 1, j)
        Next j
      End If
    ElseIf tmp <> Empty And IsNumeric(tmp) Then
      n = Dic.Item(soDH)
      iKey = soDH & "|" & iCode & "|" & sArr(i, 4)
      If Dic.exists(iKey) = False Then
        iR = Res(n)(101, 2) + 1
        Res(n)(101, 2) = iR
        Dic.Add iKey, iR
        Res(n)(iR, 1) = iCode: Res(n)(iR, 2) = sArr(i, 4)
      End If
      
      iR = Dic.Item(iKey)
      Res(n)(iR, 14) = Res(n)(iR, 14) + sArr(i, 28)
      Res(n)(iR, 15) = Res(n)(iR, 15) + sArr(i, 27)
      
      Res(n)(101, 14) = Res(n)(101, 14) + sArr(i, 28)
      Res(n)(101, 15) = Res(n)(101, 15) + sArr(i, 27)
      TT = TT + sArr(i, 28):    TT2 = TT2 + sArr(i, 27)
    End If
  Next i
 
  fR = 1
  With Sheets("BienBan")
    For n = 1 To k
      sRow = Res(n)(101, 2)
      .Range("A1:O2").Copy .Range("A" & fR)
      .Range("A3:O3").Copy .Range("A" & fR + 2).Resize(sRow)
      .Range("Q2:AE2").Copy .Range("A" & fR + sRow + 2)
      
      .Range("C" & fR + 1).Resize(, 11) = Res(n)(101, 3)
      .Range("A" & fR + 2).Resize(sRow, 15) = Res(n)
      .Range("J" & fR).NumberFormat = "@"
      .Range("J" & fR) = Res(n)(101, 1)
      .Range("N" & fR + sRow + 2) = Res(n)(101, 14)
      .Range("O" & fR + sRow + 2) = Res(n)(101, 15)
      If fR > 1 Then .Range("A" & fR).ClearContents
      fR = fR + sRow + 3
    Next n
    .Range("Q3:AE3").Copy .Range("A" & fR)
    .Range("N" & fR) = TT
    .Range("O" & fR) = TT2
    .Range("Q2:AE3").Clear
  End With
  Application.ScreenUpdating = True
End Sub
 
Chỉnh kết quả size
Mã:
Sub XYZ()
  Dim sArr(), Arr(), aSize(), Res(), Dic As Object, iKey$
  Dim sRow&, fR&, i&, j&, iR&, n&, k&, TT#, TT2#
  Dim tmp, tDH$, soDH$, iCode$

  ReDim aSize(1 To 1, 6 To 16)
  Set Dic = CreateObject("scripting.dictionary")
  Application.ScreenUpdating = False
  With Sheets("BienBan")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("A" & i - 1).Resize(2, 15).Copy .Range("Q2")
    If i > 3 Then .Range("A4:O" & i).Clear
  End With

  With Sheets("PKL")
    sArr = .Range("A7:AB" & .Range("D" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  ReDim Arr(1 To 101, 1 To 15)
  For i = 2 To sRow
    tmp = sArr(i, 1)
    If InStr(1, tmp, ")") > 0 Then
      soDH = Trim(Split(Split(tmp, "(")(1), ")")(0))
      iCode = Trim(Split(tmp, ":")(1))
      If Dic.exists(soDH) = False Then
        k = k + 1
        Dic.Add soDH, k
        ReDim Preserve Res(1 To k)
        Res(k) = Arr
        Res(k)(101, 1) = soDH
        Res(k)(101, 3) = aSize
        For j = 6 To 16
          Res(k)(101, 3)(1, j) = sArr(i - 1, j)
        Next j
      End If
    ElseIf tmp <> Empty And IsNumeric(tmp) Then
      n = Dic.Item(soDH)
      iKey = soDH & "|" & iCode & "|" & sArr(i, 4)
      If Dic.exists(iKey) = False Then
        iR = Res(n)(101, 2) + 1
        Res(n)(101, 2) = iR
        Dic.Add iKey, iR
        Res(n)(iR, 1) = iCode: Res(n)(iR, 2) = sArr(i, 4)
      End If
     
      iR = Dic.Item(iKey)
      Res(n)(iR, 14) = Res(n)(iR, 14) + sArr(i, 28)
      Res(n)(iR, 15) = Res(n)(iR, 15) + sArr(i, 27)
     
      Res(n)(101, 14) = Res(n)(101, 14) + sArr(i, 28)
      Res(n)(101, 15) = Res(n)(101, 15) + sArr(i, 27)
      TT = TT + sArr(i, 28):    TT2 = TT2 + sArr(i, 27)
    End If
  Next i

  fR = 1
  With Sheets("BienBan")
    For n = 1 To k
      sRow = Res(n)(101, 2)
      .Range("A1:O2").Copy .Range("A" & fR)
      .Range("A3:O3").Copy .Range("A" & fR + 2).Resize(sRow)
      .Range("Q2:AE2").Copy .Range("A" & fR + sRow + 2)
     
      .Range("C" & fR + 1).Resize(, 11) = Res(n)(101, 3)
      .Range("A" & fR + 2).Resize(sRow, 15) = Res(n)
      .Range("J" & fR).NumberFormat = "@"
      .Range("J" & fR) = Res(n)(101, 1)
      .Range("N" & fR + sRow + 2) = Res(n)(101, 14)
      .Range("O" & fR + sRow + 2) = Res(n)(101, 15)
      If fR > 1 Then .Range("A" & fR).ClearContents
      fR = fR + sRow + 3
    Next n
    .Range("Q3:AE3").Copy .Range("A" & fR)
    .Range("N" & fR) = TT
    .Range("O" & fR) = TT2
    .Range("Q2:AE3").Clear
  End With
  Application.ScreenUpdating = True
End Sub
Đúng như yêu cầu rồi ạ
Em cảm ơn anh nhiều .
Em đã thứ nhiều lô hàng chạy ổn rồi, nhưng tới lô hàng có số giòng vượt quá 460 giòng, đồng thời cột nhiều hơn AL
Thì kết quả hiển thị không đúng như yêu cầu ạ.
Phiền anh chỉnh lại mục số giòng và số cột vượt quá so với mẫu VD ban đầu ạ . Em có đính kèm tệp ạ
1618468389123.png
1618468187185.png
 

File đính kèm

  • 210414_CHUYEN doi dinh dang filevd khac 2.xlsm
    252.2 KB · Đọc: 2
Đúng như yêu cầu rồi ạ
Em cảm ơn anh nhiều .
Em đã thứ nhiều lô hàng chạy ổn rồi, nhưng tới lô hàng có số giòng vượt quá 460 giòng, đồng thời cột nhiều hơn AL
Thì kết quả hiển thị không đúng như yêu cầu ạ.
Phiền anh chỉnh lại mục số giòng và số cột vượt quá so với mẫu VD ban đầu ạ . Em có đính kèm tệp ạ
View attachment 257125
View attachment 257124
Kiểm tra lại
Mã:
Sub XYZ()
  Dim sArr(), Arr(), aSize(), Res(), Dic As Object, iKey$
  Dim sRow&, fR&, i&, j&, iR&, n&, k&, TT#, TT2#
  Dim tmp, tDH$, soDH$, iCode$

  ReDim aSize(1 To 1, 6 To 16)
  Set Dic = CreateObject("scripting.dictionary")
  Application.ScreenUpdating = False
  With Sheets("BienBan")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("A" & i - 1).Resize(2, 15).Copy .Range("Q2")
    If i > 3 Then .Range("A4:O" & i).Clear
  End With
 
  With Sheets("PKL")
    sArr = .Range("A7:AB" & .Range("D" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  ReDim Arr(1 To 101, 1 To 15)
  For i = 2 To sRow
    tmp = sArr(i, 1)
    If InStr(1, tmp, ")/") > 0 Then
      soDH = Trim(Split(Split(tmp, "(")(1), ")")(0))
      iCode = Trim(Split(tmp, ":")(1))
      If Dic.exists(soDH) = False Then
        k = k + 1
        Dic.Add soDH, k
        ReDim Preserve Res(1 To k)
        Res(k) = Arr
        Res(k)(101, 1) = soDH
        Res(k)(101, 3) = aSize
        For j = 6 To 16
          Res(k)(101, 3)(1, j) = sArr(i - 1, j)
        Next j
      End If
    ElseIf tmp <> Empty And IsNumeric(tmp) Then
      n = Dic.Item(soDH)
      iKey = soDH & "|" & iCode & "|" & sArr(i, 4)
      If Dic.exists(iKey) = False Then
        iR = Res(n)(101, 2) + 1
        Res(n)(101, 2) = iR
        Dic.Add iKey, iR
        Res(n)(iR, 1) = iCode: Res(n)(iR, 2) = sArr(i, 4)
      End If
      
      iR = Dic.Item(iKey)
      Res(n)(iR, 14) = Res(n)(iR, 14) + sArr(i, 28)
      Res(n)(iR, 15) = Res(n)(iR, 15) + sArr(i, 27)
      
      Res(n)(101, 14) = Res(n)(101, 14) + sArr(i, 28)
      Res(n)(101, 15) = Res(n)(101, 15) + sArr(i, 27)
      TT = TT + sArr(i, 28):    TT2 = TT2 + sArr(i, 27)
    End If
  Next i
 
  fR = 1
  With Sheets("BienBan")
    For n = 1 To k
      sRow = Res(n)(101, 2)
      .Range("A1:O2").Copy .Range("A" & fR)
      .Range("A3:O3").Copy .Range("A" & fR + 2).Resize(sRow)
      .Range("Q2:AE2").Copy .Range("A" & fR + sRow + 2)
      
      .Range("C" & fR + 1).Resize(, 11) = Res(n)(101, 3)
      .Range("A" & fR + 2).Resize(sRow, 15) = Res(n)
      .Range("J" & fR).NumberFormat = "@"
      .Range("J" & fR) = Res(n)(101, 1)
      .Range("N" & fR + sRow + 2) = Res(n)(101, 14)
      .Range("O" & fR + sRow + 2) = Res(n)(101, 15)
      If fR > 1 Then .Range("A" & fR).ClearContents
      fR = fR + sRow + 3
    Next n
    .Range("Q3:AE3").Copy .Range("A" & fR)
    .Range("N" & fR) = TT
    .Range("O" & fR) = TT2
    .Range("Q2:AE3").Clear
  End With
  Application.ScreenUpdating = True
End Sub
 
Kiểm tra lại
Mã:
Sub XYZ()
  Dim sArr(), Arr(), aSize(), Res(), Dic As Object, iKey$
  Dim sRow&, fR&, i&, j&, iR&, n&, k&, TT#, TT2#
  Dim tmp, tDH$, soDH$, iCode$

  ReDim aSize(1 To 1, 6 To 16)
  Set Dic = CreateObject("scripting.dictionary")
  Application.ScreenUpdating = False
  With Sheets("BienBan")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("A" & i - 1).Resize(2, 15).Copy .Range("Q2")
    If i > 3 Then .Range("A4:O" & i).Clear
  End With

  With Sheets("PKL")
    sArr = .Range("A7:AB" & .Range("D" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  ReDim Arr(1 To 101, 1 To 15)
  For i = 2 To sRow
    tmp = sArr(i, 1)
    If InStr(1, tmp, ")/") > 0 Then
      soDH = Trim(Split(Split(tmp, "(")(1), ")")(0))
      iCode = Trim(Split(tmp, ":")(1))
      If Dic.exists(soDH) = False Then
        k = k + 1
        Dic.Add soDH, k
        ReDim Preserve Res(1 To k)
        Res(k) = Arr
        Res(k)(101, 1) = soDH
        Res(k)(101, 3) = aSize
        For j = 6 To 16
          Res(k)(101, 3)(1, j) = sArr(i - 1, j)
        Next j
      End If
    ElseIf tmp <> Empty And IsNumeric(tmp) Then
      n = Dic.Item(soDH)
      iKey = soDH & "|" & iCode & "|" & sArr(i, 4)
      If Dic.exists(iKey) = False Then
        iR = Res(n)(101, 2) + 1
        Res(n)(101, 2) = iR
        Dic.Add iKey, iR
        Res(n)(iR, 1) = iCode: Res(n)(iR, 2) = sArr(i, 4)
      End If
     
      iR = Dic.Item(iKey)
      Res(n)(iR, 14) = Res(n)(iR, 14) + sArr(i, 28)
      Res(n)(iR, 15) = Res(n)(iR, 15) + sArr(i, 27)
     
      Res(n)(101, 14) = Res(n)(101, 14) + sArr(i, 28)
      Res(n)(101, 15) = Res(n)(101, 15) + sArr(i, 27)
      TT = TT + sArr(i, 28):    TT2 = TT2 + sArr(i, 27)
    End If
  Next i

  fR = 1
  With Sheets("BienBan")
    For n = 1 To k
      sRow = Res(n)(101, 2)
      .Range("A1:O2").Copy .Range("A" & fR)
      .Range("A3:O3").Copy .Range("A" & fR + 2).Resize(sRow)
      .Range("Q2:AE2").Copy .Range("A" & fR + sRow + 2)
     
      .Range("C" & fR + 1).Resize(, 11) = Res(n)(101, 3)
      .Range("A" & fR + 2).Resize(sRow, 15) = Res(n)
      .Range("J" & fR).NumberFormat = "@"
      .Range("J" & fR) = Res(n)(101, 1)
      .Range("N" & fR + sRow + 2) = Res(n)(101, 14)
      .Range("O" & fR + sRow + 2) = Res(n)(101, 15)
      If fR > 1 Then .Range("A" & fR).ClearContents
      fR = fR + sRow + 3
    Next n
    .Range("Q3:AE3").Copy .Range("A" & fR)
    .Range("N" & fR) = TT
    .Range("O" & fR) = TT2
    .Range("Q2:AE3").Clear
  End With
  Application.ScreenUpdating = True
End Sub
eM ĐÃ cho chạy code.
Kết quả hiện thị có sự ngược : Cột Đôi thể hiện số lượng của giá trị thùng / cột thùng thể hiện giá trị của đôi.
Và Số S0 224547B / có các màu WAY / 244/T25 số lượng chuyển đổi sai so với dữ liệu gốc PKL.
Anh kiểm tra code ạ
1618470988239.png
 
Web KT
Back
Top Bottom