Xin giúp em tổng họp dữ liệu 2 sheet vào 1 sheet

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

happyghost2000

Thành viên chính thức
Tham gia
24/5/08
Bài viết
70
Được thích
6
Xin giúp em tổng họp dữ liệu 2 sheet ONVSUIK , Plan vào Sheet Plan_Stock
Nội dung tổng họp mong muốn
1. tự động điền số thứ tự
2. Các nội dung Line, code , Ten_sp & Giacong có trong Sheet ONVSUIK & Plan thể hiện tất cả trong bảng Plan_Stock
Khi thể hiện : Mỗi sản phẩm phải có 2 dòng ( Plan & Stock )
Nếu số liệu không có 1 trong 2 bảng ONVSUIK , PLAN , thì vẫn hiển thị trong bảng Plan_Stock
Plan : Có thì số , Stock : Không có thì ghi số 0
Ngược lại : Plan không có thì ghi số 0, Stock có thì điền số

Em cũng có làm 1 code bên dưới. Nhưng khi chạy Nó thiếu thông tin của những sp bên bảng Plan. hic. hic

Mong Anh, Chị giúp em code mới. Hoặc sữa dùm em code hiện tại ạ.

Em xin cám ơn rất nhiều.


Mã:
Sub CreateMasterTable3()
    Dim wsPlan As Worksheet
    Dim wsStock As Worksheet
    Dim wsMaster As Worksheet
    Dim dict As Object
    Dim lastRowPlan As Long
    Dim lastRowStock As Long
    Dim i As Long
   
    Set wsPlan = ThisWorkbook.Worksheets("Plan")
    Set wsStock = ThisWorkbook.Worksheets("ONVSUIK")

    Set wsMaster = ThisWorkbook.Worksheets("Plan_Stock")
   

     Sheet3.Range("A5:V100000").ClearContents
   

    lastRowPlan = wsPlan.Cells(wsPlan.Rows.Count, 1).End(xlUp).row
    lastRowStock = wsStock.Cells(wsStock.Rows.Count, 1).End(xlUp).row
   

    Set dict = CreateObject("Scripting.Dictionary")
   

    For i = 5 To lastRowPlan
        dict.Add wsPlan.Cells(i, 1).Value & wsPlan.Cells(i, 2).Value & wsPlan.Cells(i, 3).Value & wsPlan.Cells(i, 4).Value, i
    Next i
   
      Dim masterRow As Long
    masterRow = 5
    For i = 3 To lastRowStock
        Dim key As String
        key = wsStock.Cells(i, 1).Value & wsStock.Cells(i, 2).Value & wsStock.Cells(i, 3).Value & wsStock.Cells(i, 4).Value ' Sua wsStock = wsPlan
       

        If dict.Exists(key) Then
            Dim planRow As Long
            planRow = dict(key)
           

            wsMaster.Cells(masterRow, 1).Resize(1, 4).Value = wsStock.Cells(i, 1).Resize(1, 4).Value ' Sua wsStock = wsPlan
           
            wsMaster.Cells(masterRow, 5).Value = "Plan"
            wsMaster.Cells(masterRow, 6).Resize(1, 16).Value = wsPlan.Cells(planRow, 6).Resize(1, 16).Value
           
            wsMaster.Cells(masterRow + 1, 5).Value = "Stock"
            wsMaster.Cells(masterRow + 1, 6).Resize(1, 16).Value = wsStock.Cells(i, 6).Resize(1, 16).Value
           
            masterRow = masterRow + 2
        Else

            wsMaster.Cells(masterRow, 1).Resize(1, 4).Value = wsStock.Cells(i, 1).Resize(1, 4).Value
            wsMaster.Cells(masterRow, 5).Value = "Plan" ' C?t 5 ch?a ch? "Plan"

            wsMaster.Cells(masterRow, 6).Resize(1, 16).Value = 0
            wsMaster.Cells(masterRow + 1, 5).Value = "Stock"
            wsMaster.Cells(masterRow + 1, 6).Resize(1, 16).Value = wsStock.Cells(i, 6).Resize(1, 16).Value
         
           
            masterRow = masterRow + 2
        End If
    Next i
   


    MsgBox "Hoàn thành Plan và Stock!"
End Sub
 

File đính kèm

  • Book1.xlsx
    15.9 KB · Đọc: 5
Lần chỉnh sửa cuối:
Xin giúp em tổng họp dữ liệu 2 sheet ONVSUIK , Plan vào Sheet Plan_Stock
Nội dung tổng họp mong muốn
1. tự động điền số thứ tự
2. Các nội dung Line, code , Ten_sp & Giacong có trong Sheet ONVSUIK & Plan thể hiện tất cả trong bảng Plan_Stock
Khi thể hiện : Mỗi sản phẩm phải có 2 dòng ( Plan & Stock )
Nếu số liệu không có 1 trong 2 bảng ONVSUIK , PLAN , thì vẫn hiển thị trong bảng Plan_Stock
Plan : Có thì số , Stock : Không có thì ghi số 0
Ngược lại : Plan không có thì ghi số 0, Stock có thì điền số

Em cũng có làm 1 code bên dưới. Nhưng khi chạy Nó thiếu thông tin của những sp bên bảng Plan. hic. hic

Mong Anh, Chị giúp em code mới. Hoặc sữa dùm em code hiện tại ạ.

Em xin cám ơn rất nhiều.


Mã:
Sub CreateMasterTable3()
    Dim wsPlan As Worksheet
    Dim wsStock As Worksheet
    Dim wsMaster As Worksheet
    Dim dict As Object
    Dim lastRowPlan As Long
    Dim lastRowStock As Long
    Dim i As Long
   
    Set wsPlan = ThisWorkbook.Worksheets("Plan")
    Set wsStock = ThisWorkbook.Worksheets("ONVSUIK")

    Set wsMaster = ThisWorkbook.Worksheets("Plan_Stock")
   

     Sheet3.Range("A5:V100000").ClearContents
   

    lastRowPlan = wsPlan.Cells(wsPlan.Rows.Count, 1).End(xlUp).row
    lastRowStock = wsStock.Cells(wsStock.Rows.Count, 1).End(xlUp).row
   

    Set dict = CreateObject("Scripting.Dictionary")
   

    For i = 5 To lastRowPlan
        dict.Add wsPlan.Cells(i, 1).Value & wsPlan.Cells(i, 2).Value & wsPlan.Cells(i, 3).Value & wsPlan.Cells(i, 4).Value, i
    Next i
   
      Dim masterRow As Long
    masterRow = 5
    For i = 3 To lastRowStock
        Dim key As String
        key = wsStock.Cells(i, 1).Value & wsStock.Cells(i, 2).Value & wsStock.Cells(i, 3).Value & wsStock.Cells(i, 4).Value ' Sua wsStock = wsPlan
       

        If dict.Exists(key) Then
            Dim planRow As Long
            planRow = dict(key)
           

            wsMaster.Cells(masterRow, 1).Resize(1, 4).Value = wsStock.Cells(i, 1).Resize(1, 4).Value ' Sua wsStock = wsPlan
           
            wsMaster.Cells(masterRow, 5).Value = "Plan"
            wsMaster.Cells(masterRow, 6).Resize(1, 16).Value = wsPlan.Cells(planRow, 6).Resize(1, 16).Value
           
            wsMaster.Cells(masterRow + 1, 5).Value = "Stock"
            wsMaster.Cells(masterRow + 1, 6).Resize(1, 16).Value = wsStock.Cells(i, 6).Resize(1, 16).Value
           
            masterRow = masterRow + 2
        Else

            wsMaster.Cells(masterRow, 1).Resize(1, 4).Value = wsStock.Cells(i, 1).Resize(1, 4).Value
            wsMaster.Cells(masterRow, 5).Value = "Plan" ' C?t 5 ch?a ch? "Plan"

            wsMaster.Cells(masterRow, 6).Resize(1, 16).Value = 0
            wsMaster.Cells(masterRow + 1, 5).Value = "Stock"
            wsMaster.Cells(masterRow + 1, 6).Resize(1, 16).Value = wsStock.Cells(i, 6).Resize(1, 16).Value
         
           
            masterRow = masterRow + 2
        End If
    Next i
   


    MsgBox "Hoàn thành Plan và Stock!"
End Sub
Nhập tay thật chính xác kết quả mong muôn và gởi lại file
 
Upvote 0
Dạ em đã nhập tay kết quả mong muốn vào Sheet Plan_Stock.
Nhờ Anh giúp em ạ .
Cám ơn Thật nhiều ạ.
Kiểm tra lại . .
Mã:
Sub XYZ()
  Dim aStock(), aPlan(), S, res(), dic As Object
  Dim srSt&, srPl&, sCol&, i&, k&, r&, rowST$, j&, c&
 
  Set dic = CreateObject("Scripting.Dictionary")
  With Sheets("ONVSUIK")
    aStock = .Range("A3:U" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("Plan")
    aPlan = .Range("A5:U" & .Range("A" & Rows.Count).End(xlUp).Row + 1).Value
  End With
  srSt = UBound(aStock):     srPl = UBound(aPlan) - 1:    sCol = UBound(aPlan, 2)
  ReDim res(1 To (srSt + srPl) * 2, 1 To sCol + 1)
  For i = 1 To srSt
    dic(aStock(i, 2)) = dic(aStock(i, 2)) & "," & i
    dic(aStock(i, 2) & "|" & aStock(i, 4)) = i
  Next i
  For i = 1 To srPl
    rowST = dic(aPlan(i, 2)) & ","
    k = k + 2
    res(k - 1, 1) = k / 2
    For j = 1 To sCol
      res(k - 1, j + 1) = aPlan(i, j)
    Next j

    r = dic(aPlan(i, 2) & "|" & aPlan(i, 4))
    If r > 0 Then 'Có Plan có Stock
      For j = 5 To sCol
        res(k, j + 1) = aStock(r, j)
      Next j
      rowST = Replace(rowST, "," & r & ",", ",")
    Else 'Có Plan khong có Stock
      res(k, 6) = "Stock"
      For j = 7 To sCol + 1
        res(k, j) = 0
      Next j
    End If
    
    If aPlan(i, 2) <> aPlan(i + 1, 2) Then 'khong có Plan có Stock
    S = Split(rowST, ",")
    For c = 1 To UBound(S) - 1
      r = S(c)
      k = k + 2
      res(k - 1, 1) = k / 2
      For j = 1 To 4
        res(k - 1, j + 1) = aStock(r, j)
      Next j
      res(k - 1, 6) = "Plan"
      For j = 7 To sCol + 1
        res(k - 1, j) = 0
      Next j
      
      For j = 5 To sCol
        res(k, j + 1) = aStock(r, j)
      Next j
    Next c
    End If
  Next i
 
  With Sheets("Plan_Stock")
    i = .Range("F" & Rows.Count).End(xlUp).Row
    If i > 2 Then Range("A3:V" & i).ClearContents
    .Range("A3").Resize(k, sCol + 1) = res
  End With
    MsgBox "Hoàn thành Plan và Stock!"
End Sub
 
Upvote 0
Kiểm tra lại . .
Mã:
Sub XYZ()
  Dim aStock(), aPlan(), S, res(), dic As Object
  Dim srSt&, srPl&, sCol&, i&, k&, r&, rowST$, j&, c&
 
  Set dic = CreateObject("Scripting.Dictionary")
  With Sheets("ONVSUIK")
    aStock = .Range("A3:U" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("Plan")
    aPlan = .Range("A5:U" & .Range("A" & Rows.Count).End(xlUp).Row + 1).Value
  End With
  srSt = UBound(aStock):     srPl = UBound(aPlan) - 1:    sCol = UBound(aPlan, 2)
  ReDim res(1 To (srSt + srPl) * 2, 1 To sCol + 1)
  For i = 1 To srSt
    dic(aStock(i, 2)) = dic(aStock(i, 2)) & "," & i
    dic(aStock(i, 2) & "|" & aStock(i, 4)) = i
  Next i
  For i = 1 To srPl
    rowST = dic(aPlan(i, 2)) & ","
    k = k + 2
    res(k - 1, 1) = k / 2
    For j = 1 To sCol
      res(k - 1, j + 1) = aPlan(i, j)
    Next j

    r = dic(aPlan(i, 2) & "|" & aPlan(i, 4))
    If r > 0 Then 'Có Plan có Stock
      For j = 5 To sCol
        res(k, j + 1) = aStock(r, j)
      Next j
      rowST = Replace(rowST, "," & r & ",", ",")
    Else 'Có Plan khong có Stock
      res(k, 6) = "Stock"
      For j = 7 To sCol + 1
        res(k, j) = 0
      Next j
    End If
   
    If aPlan(i, 2) <> aPlan(i + 1, 2) Then 'khong có Plan có Stock
    S = Split(rowST, ",")
    For c = 1 To UBound(S) - 1
      r = S(c)
      k = k + 2
      res(k - 1, 1) = k / 2
      For j = 1 To 4
        res(k - 1, j + 1) = aStock(r, j)
      Next j
      res(k - 1, 6) = "Plan"
      For j = 7 To sCol + 1
        res(k - 1, j) = 0
      Next j
     
      For j = 5 To sCol
        res(k, j + 1) = aStock(r, j)
      Next j
    Next c
    End If
  Next i
 
  With Sheets("Plan_Stock")
    i = .Range("F" & Rows.Count).End(xlUp).Row
    If i > 2 Then Range("A3:V" & i).ClearContents
    .Range("A3").Resize(k, sCol + 1) = res
  End With
    MsgBox "Hoàn thành Plan và Stock!"
End Sub
Dạ kết trùng nhau bác @HieuCD ơi
1691248488575.png
 
Upvote 0
Chỉnh lại . . . :)
Mã:
Sub XYZ()
  Dim aStock(), aPlan(), S, res(), dic As Object
  Dim srSt&, srPl&, sCol&, i&, k&, r&, rowST$, code, j&, c&
 
  Set dic = CreateObject("Scripting.Dictionary")
  With Sheets("ONVSUIK")
    aStock = .Range("A3:U" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("Plan")
    aPlan = .Range("A5:U" & .Range("A" & Rows.Count).End(xlUp).Row + 1).Value
  End With
  srSt = UBound(aStock):     srPl = UBound(aPlan) - 1:    sCol = UBound(aPlan, 2)
  ReDim res(1 To (srSt + srPl) * 2, 1 To sCol + 1)
  For i = 1 To srSt
    dic(aStock(i, 2)) = dic(aStock(i, 2)) & "," & i
    dic(aStock(i, 2) & "|" & aStock(i, 4)) = i
  Next i
  For i = 1 To srPl
    If code <> aPlan(i, 2) Then
      code = aPlan(i, 2)
      rowST = dic(code) & ","
    End If
    k = k + 2
    res(k - 1, 1) = k / 2
    For j = 1 To sCol
      res(k - 1, j + 1) = aPlan(i, j)
    Next j

    r = dic(code & "|" & aPlan(i, 4))
    If r > 0 Then 'Có Plan có Stock
      For j = 5 To sCol
        res(k, j + 1) = aStock(r, j)
      Next j
      rowST = Replace(rowST, "," & r & ",", ",")
    Else 'Có Plan khong có Stock
      res(k, 6) = "Stock"
      For j = 7 To sCol + 1
        res(k, j) = 0
      Next j
    End If
    
    If code <> aPlan(i + 1, 2) Then 'khong có Plan có Stock
      S = Split(rowST, ",")
      For c = 1 To UBound(S) - 1
        r = S(c)
        k = k + 2
        res(k - 1, 1) = k / 2
        For j = 1 To 4
          res(k - 1, j + 1) = aStock(r, j)
        Next j
        res(k - 1, 6) = "Plan"
        For j = 7 To sCol + 1
          res(k - 1, j) = 0
        Next j
      
        For j = 5 To sCol
          res(k, j + 1) = aStock(r, j)
        Next j
      Next c
    End If
  Next i
 
  With Sheets("Plan_Stock")
    i = .Range("F" & Rows.Count).End(xlUp).Row
    If i > 2 Then Range("A3:V" & i).ClearContents
    .Range("A3").Resize(k, sCol + 1) = res
  End With
    MsgBox "Hoàn thành Plan và Stock!"
End Sub
 
Upvote 0
Chỉnh lại . . . :)
Mã:
Sub XYZ()
  Dim aStock(), aPlan(), S, res(), dic As Object
  Dim srSt&, srPl&, sCol&, i&, k&, r&, rowST$, code, j&, c&
 
  Set dic = CreateObject("Scripting.Dictionary")
  With Sheets("ONVSUIK")
    aStock = .Range("A3:U" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("Plan")
    aPlan = .Range("A5:U" & .Range("A" & Rows.Count).End(xlUp).Row + 1).Value
  End With
  srSt = UBound(aStock):     srPl = UBound(aPlan) - 1:    sCol = UBound(aPlan, 2)
  ReDim res(1 To (srSt + srPl) * 2, 1 To sCol + 1)
  For i = 1 To srSt
    dic(aStock(i, 2)) = dic(aStock(i, 2)) & "," & i
    dic(aStock(i, 2) & "|" & aStock(i, 4)) = i
  Next i
  For i = 1 To srPl
    If code <> aPlan(i, 2) Then
      code = aPlan(i, 2)
      rowST = dic(code) & ","
    End If
    k = k + 2
    res(k - 1, 1) = k / 2
    For j = 1 To sCol
      res(k - 1, j + 1) = aPlan(i, j)
    Next j

    r = dic(code & "|" & aPlan(i, 4))
    If r > 0 Then 'Có Plan có Stock
      For j = 5 To sCol
        res(k, j + 1) = aStock(r, j)
      Next j
      rowST = Replace(rowST, "," & r & ",", ",")
    Else 'Có Plan khong có Stock
      res(k, 6) = "Stock"
      For j = 7 To sCol + 1
        res(k, j) = 0
      Next j
    End If
   
    If code <> aPlan(i + 1, 2) Then 'khong có Plan có Stock
      S = Split(rowST, ",")
      For c = 1 To UBound(S) - 1
        r = S(c)
        k = k + 2
        res(k - 1, 1) = k / 2
        For j = 1 To 4
          res(k - 1, j + 1) = aStock(r, j)
        Next j
        res(k - 1, 6) = "Plan"
        For j = 7 To sCol + 1
          res(k - 1, j) = 0
        Next j
     
        For j = 5 To sCol
          res(k, j + 1) = aStock(r, j)
        Next j
      Next c
    End If
  Next i
 
  With Sheets("Plan_Stock")
    i = .Range("F" & Rows.Count).End(xlUp).Row
    If i > 2 Then Range("A3:V" & i).ClearContents
    .Range("A3").Resize(k, sCol + 1) = res
  End With
    MsgBox "Hoàn thành Plan và Stock!"
End Sub
Dạ . Khi Sheet ONVSUIK , em thêm 1 dòng dữ liệu nó khác Line vd Line 13 . Thì Kết quả không hiện thị.
Bác giúp em với .
1691289159029.png
 

File đính kèm

  • Book1.xlsm
    26.8 KB · Đọc: 16
Upvote 0
Dạ . Khi Sheet ONVSUIK , em thêm 1 dòng dữ liệu nó khác Line vd Line 13 . Thì Kết quả không hiện thị.
Bác giúp em với .
Chỉnh tiếp :) :):)
Mã:
Sub XYZ()
  Dim astock(), aPlan(), S, res(), dic As Object
  Dim srSt&, srPl&, sCol&, i&, k&, r&, rowST$, code, j&, c&
 
  Set dic = CreateObject("Scripting.Dictionary")
  With Sheets("ONVSUIK")
    astock = .Range("A3:U" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("Plan")
    aPlan = .Range("A5:U" & .Range("A" & Rows.Count).End(xlUp).Row + 1).Value
  End With
  srSt = UBound(astock):     srPl = UBound(aPlan) - 1:    sCol = UBound(aPlan, 2)
  ReDim res(1 To (srSt + srPl) * 2, 1 To sCol + 1)
  For i = 1 To srSt
    dic(astock(i, 2)) = dic(astock(i, 2)) & "," & i
    dic(astock(i, 2) & "|" & astock(i, 4)) = i
  Next i
  For i = 1 To srPl
    dic(aPlan(i, 2) & "|||") = Empty
    If code <> aPlan(i, 2) Then
      code = aPlan(i, 2)
      rowST = dic(code) & ","
    End If
    k = k + 2
    res(k - 1, 1) = k / 2
    For j = 1 To sCol
      res(k - 1, j + 1) = aPlan(i, j)
    Next j

    r = dic(code & "|" & aPlan(i, 4))
    If r > 0 Then 'Có Plan có Stock
      For j = 5 To sCol
        res(k, j + 1) = astock(r, j)
      Next j
      rowST = Replace(rowST, "," & r & ",", ",")
    Else 'Có Plan khong có Stock
      res(k, 6) = "Stock"
      For j = 7 To sCol + 1
        res(k, j) = 0
      Next j
    End If
    
    If code <> aPlan(i + 1, 2) Then 'khong có Plan có Stock
      S = Split(rowST, ",")
      For c = 1 To UBound(S) - 1
        r = S(c)
        Call AddStock_nonPlan(astock, res, sCol, k, j, S(c))
      Next c
    End If
  Next i
 
  For i = 1 To srSt 'khong có Plan có Stock
    If dic.exists(astock(i, 2) & "|||") = False Then
      Call AddStock_nonPlan(astock, res, sCol, k, j, i)
    End If
  Next i
 
  With Sheets("Plan_Stock")
    i = .Range("F" & Rows.Count).End(xlUp).Row
    If i > 2 Then Range("A3:V" & i).ClearContents
    .Range("A3").Resize(k, sCol + 1) = res
  End With
    MsgBox "Hoàn thành Plan và Stock!"
End Sub

Private Sub AddStock_nonPlan(astock, res, sCol, k, j, ByVal r&)
  k = k + 2
        res(k - 1, 1) = k / 2
        For j = 1 To 4
          res(k - 1, j + 1) = astock(r, j)
        Next j
        res(k - 1, 6) = "Plan"
        For j = 7 To sCol + 1
          res(k - 1, j) = 0
        Next j
      
        For j = 5 To sCol
          res(k, j + 1) = astock(r, j)
        Next j
End Sub
 
Upvote 0
Số liệu KQ hoàn toàn đúng .
Nhưng số liệu em muốn Sort theo trật tự : Line , Code, Giacong
Anh @HieuCD Giúp em nhé.
Cám ơn Anh rất nhiều .
 
Upvote 0
Số liệu KQ hoàn toàn đúng .
Nhưng số liệu em muốn Sort theo trật tự : Line , Code, Giacong
Anh @HieuCD Giúp em nhé.
Cám ơn Anh rất nhiều .
Sort dữ liệu code gọn hơn
Mã:
Sub XYZ()
  Dim arr(), res(), key$
  Dim sRow&, sCol&, i&, k&, j&
 
  Application.ScreenUpdating = False
  With Sheets("ONVSUIK")
    arr = .Range("A3:U" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(arr):   sCol = UBound(arr, 2)
  With Sheets("Plan")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    res = .Range("A5:U" & i + sRow).Value
    .Range("A" & i + 1).Resize(sRow, sCol).Value = arr
    .Range("A5:U" & i + sRow).Sort .Range("A5"), 1, .Range("B5"), , 1, .Range("D5"), 1, Header:=xlNo
    arr = .Range("A5:U" & i + sRow + 1).Value
    .Range("A5:U" & i + sRow).Value = res 'Tra ve gia tri goc
  End With
  sRow = UBound(arr) - 1
  ReDim res(1 To sRow * 2, 1 To sCol + 1)
  For i = 1 To sRow
    key = arr(i, 1) & "|" & arr(i, 2) & "|" & arr(i, 4)
    If arr(i, 5) = "Plan" Then
      k = k + 2
      res(k - 1, 1) = k / 2
      For j = 1 To sCol
        res(k - 1, j + 1) = arr(i, j)
      Next j
      If key = arr(i + 1, 1) & "|" & arr(i + 1, 2) & "|" & arr(i + 1, 4) Then
        For j = 5 To sCol
          res(k, j + 1) = arr(i + 1, j)
        Next j
        i = i + 1
      Else
        res(k, 6) = "Stock"
        For j = 7 To sCol + 1
          res(k, j) = 0
        Next j
      End If
    Else
      k = k + 2
      res(k - 1, 1) = k / 2
      For j = 1 To 4
        res(k - 1, j + 1) = arr(i, j)
      Next j
      res(k - 1, 6) = "Plan"
      For j = 7 To sCol + 1
        res(k - 1, j) = 0
      Next j
      For j = 5 To sCol
        res(k, j + 1) = arr(i, j)
      Next j
    End If
  Next i
  With Sheets("Plan_Stock")
    i = .Range("F" & Rows.Count).End(xlUp).Row
    If i > 2 Then .Range("A3:V" & i).ClearContents
    .Range("A3").Resize(k, sCol + 1) = res
  End With
  Application.ScreenUpdating = True
  MsgBox
 
Upvote 0
Sort dữ liệu code gọn hơn
Mã:
Sub XYZ()
  Dim arr(), res(), key$
  Dim sRow&, sCol&, i&, k&, j&
 
  Application.ScreenUpdating = False
  With Sheets("ONVSUIK")
    arr = .Range("A3:U" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(arr):   sCol = UBound(arr, 2)
  With Sheets("Plan")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    res = .Range("A5:U" & i + sRow).Value
    .Range("A" & i + 1).Resize(sRow, sCol).Value = arr
    .Range("A5:U" & i + sRow).Sort .Range("A5"), 1, .Range("B5"), , 1, .Range("D5"), 1, Header:=xlNo
    arr = .Range("A5:U" & i + sRow + 1).Value
    .Range("A5:U" & i + sRow).Value = res 'Tra ve gia tri goc
  End With
  sRow = UBound(arr) - 1
  ReDim res(1 To sRow * 2, 1 To sCol + 1)
  For i = 1 To sRow
    key = arr(i, 1) & "|" & arr(i, 2) & "|" & arr(i, 4)
    If arr(i, 5) = "Plan" Then
      k = k + 2
      res(k - 1, 1) = k / 2
      For j = 1 To sCol
        res(k - 1, j + 1) = arr(i, j)
      Next j
      If key = arr(i + 1, 1) & "|" & arr(i + 1, 2) & "|" & arr(i + 1, 4) Then
        For j = 5 To sCol
          res(k, j + 1) = arr(i + 1, j)
        Next j
        i = i + 1
      Else
        res(k, 6) = "Stock"
        For j = 7 To sCol + 1
          res(k, j) = 0
        Next j
      End If
    Else
      k = k + 2
      res(k - 1, 1) = k / 2
      For j = 1 To 4
        res(k - 1, j + 1) = arr(i, j)
      Next j
      res(k - 1, 6) = "Plan"
      For j = 7 To sCol + 1
        res(k - 1, j) = 0
      Next j
      For j = 5 To sCol
        res(k, j + 1) = arr(i, j)
      Next j
    End If
  Next i
  With Sheets("Plan_Stock")
    i = .Range("F" & Rows.Count).End(xlUp).Row
    If i > 2 Then .Range("A3:V" & i).ClearContents
    .Range("A3").Resize(k, sCol + 1) = res
  End With
  Application.ScreenUpdating = True
  MsgBox
Great !!!!!!!!!!!!.
Thật tuyệt vời ....
Cám ơn Bác @HieuCD Thật nhiều.
Hoàn toàn tuyệt vời.
Một lần nữa cám ơn Bác nhé.
 
Upvote 0
Thanks Bác @HieuCD nhiều lắm .
Code sử dụng để xử lý dữ liệu vài chục ngàn dòng thì hiệu mang lại rất tuyệt vời.
Thanks bác nhiều lắm ạ.
 
Upvote 0
Web KT

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

Back
Top Bottom