Nhờ viết code trích xuất dữ liệu

Liên hệ QC
Xem file đính kèm. hy vọng lần này đúng ý. Nếu có vấn đề gì nữa thì liên hệ với tôi qua số zalo 0986997214
Lần sau phải mô tả kết quả mong muốn ngay từ đầu, và khi đưa file giả định lên cũng cần đưa thêm cả các trường hợp đặc biệt nữa thì người giúp mới hình dung được và code chính xác ý định.
Dạ em cám ơn anh nhiều ạ, em sẽ rút kinh nghiệm ạ.
Bài đã được tự động gộp:

Em chia sẽ thật nha thớt, nếu đây là form báo cáo thì em không thấy trực quan hơn là mấy.
Form của thớt sẽ có những ô trống, người đọc còn phải nhìn làm sao để canh từ ô dữ liệu nhìn qua ô ngày để không bị lệch ngày nữa.
Không phải em không giúp mà còn bày đặt ý kiến, nhưng chỉ là em chia sẽ quan điểm cá nhân thôi.
Cảm ơn bạn nhiều, tuy nhiên mỗi một đặc thù công ty có yêu cầu riêng bạn ạ.
 
Lần chỉnh sửa cuối:
Xin chào các Anh/Chị,

Em có một file tổng hợp dữ liệu, và có một form sẵn theo yêu cầu, đề bài yêu cầu khi tìm kiếm một giá trị (tức là đơn hàng ạ_Số OC) thì sẽ ra các thông số như file đính kèm.
Em rất mong được các anh/chị, các bạn hỗ trợ giúp em với ạ.
File em có 3 sheet, một sheet data (dữ liệu em lấy đại diện thôi ạ, còn số liệu thực tế khá nhiều ạ), 1 sheet form mẫu và 1 sheet em muốn ra kết quả.
Vậy nhờ các anh/chị hỗ trợ giúp giùm em với ạ, hoặc nếu có chỗ nào không ổn anh/chị góp ý giùm em với.
Em xin chân thành cảm ơn cả nhà.
Thử với sub khác tí
Mã:
Option Explicit
Sub XYZ()
  Dim sRow&, sR&, i&, j&, k&, ik&, jC&
  Dim arr(), td(), Res(), dic As Object
  Dim process$, ocNo$, act$, oc$, aName$, iTem$

  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  Set dic = CreateObject("Scripting.Dictionary")
  dic.CompareMode = vbTextCompare
  act = "Actual Qty":         oc = "OC Qty"
  With Sheets("All Data")
    arr = .Range("A6:L" & .Cells(Rows.Count, 1).End(3).Row).Value
  End With
  With Sheets("Form")
    td = .Range("C4:V6").Value
    ocNo = Range("D3").Value
  End With
  For j = 2 To UBound(td, 2)
    If td(1, j) <> Empty Then process = td(1, j)
    dic(process & td(3, j)) = j
  Next j
 
  sRow = UBound(arr)
  sR = sRow + 4
  ReDim Res(1 To sR, 1 To 21)
 
  For i = 2 To sRow
    If arr(i, 4) = ocNo Then
      If arr(i, 1) = act Then
        If Not dic.Exists(arr(i, 3)) Then
          k = k + 1
          dic.Add arr(i, 3), k
          Res(k, 1) = arr(i, 3)
        End If
        ik = dic(arr(i, 3))
      ElseIf arr(i, 1) = oc Then
        ik = sR
      End If
      For j = 10 To 12
        If arr(i, j) > 0 Then
          jC = dic(arr(i, 2) & arr(1, j))
          Res(ik, jC) = Res(ik, jC) + arr(i, j)
          If ik < sR Then Res(sR - 1, jC) = Res(sR - 1, jC) + arr(i, j)
        End If
      Next j
      If aName = Empty Then aName = arr(i, 9): iTem = arr(i, 6)
    End If
  Next i
  Res(k + 2, 1) = act: Res(k + 3, 1) = oc
  For j = 2 To 21
    Res(k + 2, j) = Res(sR - 1, j)
    Res(k + 3, j) = Res(sR, j)
  Next j
  With Sheets("Form")
    .Range("C7").Resize(1000, 21).ClearContents
    .Range("C7").Resize(k + 3, 21) = Res
    .Range("D2") = aName:   .Range("F3") = iTem
  End With
  Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic
End Sub
 

File đính kèm

  • Form mau 13062022.xlsm
    46.9 KB · Đọc: 18
Thử với sub khác tí
Mã:
Option Explicit
Sub XYZ()
  Dim sRow&, sR&, i&, j&, k&, ik&, jC&
  Dim arr(), td(), Res(), dic As Object
  Dim process$, ocNo$, act$, oc$, aName$, iTem$

  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  Set dic = CreateObject("Scripting.Dictionary")
  dic.CompareMode = vbTextCompare
  act = "Actual Qty":         oc = "OC Qty"
  With Sheets("All Data")
    arr = .Range("A6:L" & .Cells(Rows.Count, 1).End(3).Row).Value
  End With
  With Sheets("Form")
    td = .Range("C4:V6").Value
    ocNo = Range("D3").Value
  End With
  For j = 2 To UBound(td, 2)
    If td(1, j) <> Empty Then process = td(1, j)
    dic(process & td(3, j)) = j
  Next j
 
  sRow = UBound(arr)
  sR = sRow + 4
  ReDim Res(1 To sR, 1 To 21)
 
  For i = 2 To sRow
    If arr(i, 4) = ocNo Then
      If arr(i, 1) = act Then
        If Not dic.Exists(arr(i, 3)) Then
          k = k + 1
          dic.Add arr(i, 3), k
          Res(k, 1) = arr(i, 3)
        End If
        ik = dic(arr(i, 3))
      ElseIf arr(i, 1) = oc Then
        ik = sR
      End If
      For j = 10 To 12
        If arr(i, j) > 0 Then
          jC = dic(arr(i, 2) & arr(1, j))
          Res(ik, jC) = Res(ik, jC) + arr(i, j)
          If ik < sR Then Res(sR - 1, jC) = Res(sR - 1, jC) + arr(i, j)
        End If
      Next j
      If aName = Empty Then aName = arr(i, 9): iTem = arr(i, 6)
    End If
  Next i
  Res(k + 2, 1) = act: Res(k + 3, 1) = oc
  For j = 2 To 21
    Res(k + 2, j) = Res(sR - 1, j)
    Res(k + 3, j) = Res(sR, j)
  Next j
  With Sheets("Form")
    .Range("C7").Resize(1000, 21).ClearContents
    .Range("C7").Resize(k + 3, 21) = Res
    .Range("D2") = aName:   .Range("F3") = iTem
  End With
  Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic
End Sub
Dạ em đa tạ anh ạ, bài toán của em đã được giải đáp gọn gàng ạ. Có một chút xíu là trên sheet Form hình như đang lấy dữ liệu nào nhập trước chứ không tự động Sort ngày tháng từ old đến new ạ. Tuy nhiên cũng đã giải đáp được mong muốn của em rồi. Em cảm ơn anh và mọi người đã tận tình giúp đỡ ạ.
Bài đã được tự động gộp:

Làm đến cỡ code thế này mà còn phải "công ty có yêu cầu riêng"?
Dạ, em cũng tìm cách giải quyết bài toán mà sếp em yêu cầu ạ nên phải xin nhận sự giúp đỡ của mọi người ạ. Em cảm ơn.
 
Thử với sub khác tí
Mã:
Option Explicit
Sub XYZ()
  Dim sRow&, sR&, i&, j&, k&, ik&, jC&
  Dim arr(), td(), Res(), dic As Object
  Dim process$, ocNo$, act$, oc$, aName$, iTem$

  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  Set dic = CreateObject("Scripting.Dictionary")
  dic.CompareMode = vbTextCompare
  act = "Actual Qty":         oc = "OC Qty"
  With Sheets("All Data")
    arr = .Range("A6:L" & .Cells(Rows.Count, 1).End(3).Row).Value
  End With
  With Sheets("Form")
    td = .Range("C4:V6").Value
    ocNo = Range("D3").Value
  End With
  For j = 2 To UBound(td, 2)
    If td(1, j) <> Empty Then process = td(1, j)
    dic(process & td(3, j)) = j
  Next j
 
  sRow = UBound(arr)
  sR = sRow + 4
  ReDim Res(1 To sR, 1 To 21)
 
  For i = 2 To sRow
    If arr(i, 4) = ocNo Then
      If arr(i, 1) = act Then
        If Not dic.Exists(arr(i, 3)) Then
          k = k + 1
          dic.Add arr(i, 3), k
          Res(k, 1) = arr(i, 3)
        End If
        ik = dic(arr(i, 3))
      ElseIf arr(i, 1) = oc Then
        ik = sR
      End If
      For j = 10 To 12
        If arr(i, j) > 0 Then
          jC = dic(arr(i, 2) & arr(1, j))
          Res(ik, jC) = Res(ik, jC) + arr(i, j)
          If ik < sR Then Res(sR - 1, jC) = Res(sR - 1, jC) + arr(i, j)
        End If
      Next j
      If aName = Empty Then aName = arr(i, 9): iTem = arr(i, 6)
    End If
  Next i
  Res(k + 2, 1) = act: Res(k + 3, 1) = oc
  For j = 2 To 21
    Res(k + 2, j) = Res(sR - 1, j)
    Res(k + 3, j) = Res(sR, j)
  Next j
  With Sheets("Form")
    .Range("C7").Resize(1000, 21).ClearContents
    .Range("C7").Resize(k + 3, 21) = Res
    .Range("D2") = aName:   .Range("F3") = iTem
  End With
  Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic
End Sub
Anh ơi làm ơn cho em hỏi chút, khi em coppy thêm một số sheet vào và nhập dữ liệu vào thì báo lỗi như hình đính kèm, anh chỉ giúp giùm em lỗi khác phục được không ạ.
em cảm ơn nhiều ạ.
 

File đính kèm

  • error.PNG
    error.PNG
    253.1 KB · Đọc: 12
Anh ơi làm ơn cho em hỏi chút, khi em coppy thêm một số sheet vào và nhập dữ liệu vào thì báo lỗi như hình đính kèm, anh chỉ giúp giùm em lỗi khác phục được không ạ.
em cảm ơn nhiều ạ.
Lỗi do nhiều nguyên nhân, thường do dữ liệu không chuẩn
Thay 2 lệnh bị lỗi
Mã:
Res(ik, jC) = Res(ik, jC) + arr(i, j)
If ik < sR Then Res(sR - 1, jC) = Res(sR - 1, jC) + arr(i, j)
bằng các lệnh sau
Mã:
          If dic.exists(arr(i, 2) & arr(1, j)) Then
            jC = dic(arr(i, 2) & arr(1, j))
            If IsNumeric(arr(i, j)) Then
              arr(i, j) = Val(arr(i, j))
              Res(ik, jC) = Res(ik, jC) + arr(i, j)
              If ik < sR Then Res(sR - 1, jC) = Res(sR - 1, jC) + arr(i, j)
            End If
          End If
 
Lỗi do nhiều nguyên nhân, thường do dữ liệu không chuẩn
Thay 2 lệnh bị lỗi
Mã:
Res(ik, jC) = Res(ik, jC) + arr(i, j)
If ik < sR Then Res(sR - 1, jC) = Res(sR - 1, jC) + arr(i, j)
bằng các lệnh sau
Mã:
          If dic.exists(arr(i, 2) & arr(1, j)) Then
            jC = dic(arr(i, 2) & arr(1, j))
            If IsNumeric(arr(i, j)) Then
              arr(i, j) = Val(arr(i, j))
              Res(ik, jC) = Res(ik, jC) + arr(i, j)
              If ik < sR Then Res(sR - 1, jC) = Res(sR - 1, jC) + arr(i, j)
            End If
          End If
Dạ em cảm ơn nhiều anh nhiều ạ.
 
Web KT
Back
Top Bottom