Tổng hợp dữ liệu theo điều kiện?

Liên hệ QC

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,895
Được thích
1,219
Xin chào tất các bạn,
Như tiêu đề O.Thơ đã nêu ở trên và điều kiện cụ thể O,Thơ viết chi tiết trong file đính kèm rồi ạ.
Rất mong nhận được sự trợ giúp của các bạn.
O.Thơ xin cảm ơn rất nhiều.

 

File đính kèm

Xin chào HieuCD,
Cảm ơn bạn đã thông tin, dạ bê từ "DMSP" qua ạ.
Xin lỗi bạn vì OT giải thích chưa đủ ý.
Chỉnh lại cột
Mã:
Sub GPE_2()
' HieuCD
  Dim Res(), DuLieu(), TongHop()
  Dim khStr As String, iKey As String
  Dim i As Long, ik As Long, j As Long, sCol As Long, jCol As Long
  Dim Ngay As Date
 
  With Sheets("DU_LIEU")
    i = .Range("E1000000").End(xlUp).Row
    DuLieu = .Range("E6:BA" & i).Value
    Ngay = .Range("D2").Value
  End With
  With Sheets("TONG_HOP")
    i = .Range("B8").End(xlDown).Row
    sCol = .Range("AAA8").End(xlToLeft).Column
    On Error Resume Next
    jCol = Application.Match(Ngay, .Range("A8").Resize(, sCol).Value, 0)
    On Error GoTo 0
    TongHop = .Range("A8:A" & i).Resize(, sCol).Value
    .Range("A9:A" & i).Resize(, sCol).ClearContents
  End With
  With Sheets("DMSP")
    i = .Range("B8").End(xlDown).Row
    Res = .Range("A9:A" & i).Resize(, sCol).Value
  End With

  With CreateObject("scripting.dictionary")
    For i = 2 To UBound(Res) - 1
      If Len(Res(i, 4)) > 0 Then  'Chinh so 4
        If Len(Res(i - 1, 4)) = 0 Then khStr = Res(i - 1, 2) 'Chinh so 4
        .Item(khStr & "#" & Res(i, 5)) = i  'Chinh so 5
      End If
    Next i
    For i = 2 To UBound(TongHop) - 1
      If Len(TongHop(i, 4)) > 0 Then 'Chinh so 4
        If Len(TongHop(i - 1, 4)) = 0 Then khStr = TongHop(i - 1, 2) 'Chinh so 4
        ik = .Item(khStr & "#" & TongHop(i, 5)) 'Chinh so 5
        If ik Then
          For j = 13 To sCol
            If Len(TongHop(i, j)) Then Res(ik, j) = TongHop(i, j)
          Next j
        End If
      End If
    Next i
    If jCol Then
      For i = 1 To UBound(DuLieu) Step 8
        ik = .Item(DuLieu(i, 1) & "#" & DuLieu(i, 2))
        If ik Then Res(ik, jCol) = DuLieu(i, 49)
      Next i
    End If
  End With
  Sheets("TONG_HOP").Range("A9").Resize(UBound(Res), UBound(Res, 2)) = Res
End Sub
 
Upvote 0
Xin chào hpkhuong,HieuCD
Nhờ 2 bạn xem giúp nếu máy tính không để đúng định dạng: "mm/dd/yyy" thì code sẽ không lấy được dữ liệu của tháng cần lấy.
 
Upvote 0
máy tính không để đúng định dạng: "mm/dd/yyy" thì code sẽ không lấy được dữ liệu của tháng cần lấy.
Thử chỉnh code trong bài của anh @HieuCD
Đổi
PHP:
Dim i As Long, ik As Long, j As Long, sCol As Long, jCol As Long
Dim Ngay As Date

DuLieu = .Range("E6:BA" & i).Value
Ngay = .Range("D2").Value
thành
PHP:
Dim i As Long, ik As Long, j As Long, sCol As Long, jCol As Variant
Dim Ngay as Long

DuLieu = .Range("E6:BA" & i).Value2
Ngay = .Range("D2").Value2
Đổi
PHP:
On Error Resume Next
jCol = Application.Match(Ngay, .Range("A8").Resize(, sCol).Value, 0)
On Error GoTo 0
thành
PHP:
jCol = Application.Match(Ngay, .Range("A8").Resize(, sCol).Value2, 0)
If TypeName(jCol) = "Error" Then jCol = 0
Đổi
PHP:
If jCol Then
thành
PHP:
If jCol>0 Then
 
Upvote 0
Xin chào hpkhuong,HieuCD
Nhờ 2 bạn xem giúp nếu máy tính không để đúng định dạng: "mm/dd/yyy" thì code sẽ không lấy được dữ liệu của tháng cần lấy.
Không rỏ nhập liệu như thế nào, nên chỉ điều chỉnh khai báo
Dim Ngay ' bo "As Date"
Nếu cách nhập thống nhất code sẽ chạy được
 
Upvote 0
Xin chào HieuCD,befaint,hpkhuong
Oanh Thơ muốn mở rộng việc theo dõi thêm phần dữ liệu , hình thức form mẫu dữ liệu gi như ờ bài trước (bài 19), có một điểm khác dữ liệu tổng hợp từ nhiều cột vào một.

Nhờ ba bạn và cùng các bạn khác xem giúp ạ.
 

File đính kèm

Upvote 0
Xin chào HieuCD,befaint,hpkhuong
Oanh Thơ muốn mở rộng việc theo dõi thêm phần dữ liệu , hình thức form mẫu dữ liệu gi như ờ bài trước (bài 19), có một điểm khác dữ liệu tổng hợp từ nhiều cột vào một.

Nhờ ba bạn và cùng các bạn khác xem giúp ạ.
Không rỏ đặc điểm tạo mã hàng, nên ghép Khách hàng và mã hàng làm key của Dic
Sheet DuLieu dùng 2 mảng để giảm dữ liệu gán vào mảng
Mã:
Sub GPE_3()
  Dim Res(), DuLieuKey(), DuLieuSum(), TongHop()
  Dim khStr As String, iKey As String
  Dim i As Long, ik As Long, j As Long, sCol As Long, jCol As Long
  Dim Ngay As Date
 
  With Sheets("DU_LIEU")
    i = .Range("E1000000").End(xlUp).Row
    DuLieuKey = .Range("E6:F" & i).Value
    DuLieuSum = .Range("BG6:BK" & i).Value
    Ngay = .Range("D2").Value
  End With
  With Sheets("TONG_HOP")
    i = .Range("B8").End(xlDown).Row
    sCol = .Range("AAA8").End(xlToLeft).Column
    On Error Resume Next
    jCol = Application.Match(Ngay, .Range("A8").Resize(, sCol).Value, 0)
    On Error GoTo 0
    TongHop = .Range("A8:A" & i).Resize(, sCol).Value
    .Range("A9:A" & i).Resize(, sCol).ClearContents
  End With
  With Sheets("DMSP")
    i = .Range("B8").End(xlDown).Row
    Res = .Range("A9:G" & i).Value
    ReDim Preserve Res(1 To UBound(Res), 1 To sCol)
  End With

  With CreateObject("scripting.dictionary")
    For i = 2 To UBound(Res) - 1
      If Len(Res(i, 5)) > 0 Then
        If Len(Res(i - 1, 5)) = 0 Then khStr = Res(i - 1, 2)
        .Item(khStr & "#" & Res(i, 5)) = i
      End If
    Next i
    For i = 2 To UBound(TongHop) - 1
      If Len(TongHop(i, 5)) > 0 Then
        If Len(TongHop(i - 1, 5)) = 0 Then khStr = TongHop(i - 1, 2)
        ik = .Item(khStr & "#" & TongHop(i, 5))
        If ik > 0 Then
          For j = 13 To sCol
            If Len(TongHop(i, j)) Then Res(ik, j) = TongHop(i, j)
          Next j
        End If
      End If
    Next i
    If jCol Then
      For i = 1 To UBound(DuLieuKey) Step 8
        ik = .Item(DuLieuKey(i, 1) & "#" & DuLieuKey(i, 2))
        If ik > 0 Then Res(ik, jCol) = DuLieuSum(i, 1) + DuLieuSum(i, 4) + DuLieuSum(i, 5)
      Next i
    End If
  End With
  Sheets("TONG_HOP").Range("A9").Resize(UBound(Res), UBound(Res, 2)) = Res
End Sub
 
Upvote 0
Không rỏ đặc điểm tạo mã hàng, nên ghép Khách hàng và mã hàng làm key của Dic
Sheet DuLieu dùng 2 mảng để giảm dữ liệu gán vào mảng
Mã:
Sub GPE_3()
  Dim Res(), DuLieuKey(), DuLieuSum(), TongHop()
  Dim khStr As String, iKey As String
  Dim i As Long, ik As Long, j As Long, sCol As Long, jCol As Long
  Dim Ngay As Date

  With Sheets("DU_LIEU")
    i = .Range("E1000000").End(xlUp).Row
    DuLieuKey = .Range("E6:F" & i).Value
    DuLieuSum = .Range("BG6:BK" & i).Value
    Ngay = .Range("D2").Value
  End With
  With Sheets("TONG_HOP")
    i = .Range("B8").End(xlDown).Row
    sCol = .Range("AAA8").End(xlToLeft).Column
    On Error Resume Next
    jCol = Application.Match(Ngay, .Range("A8").Resize(, sCol).Value, 0)
    On Error GoTo 0
    TongHop = .Range("A8:A" & i).Resize(, sCol).Value
    .Range("A9:A" & i).Resize(, sCol).ClearContents
  End With
  With Sheets("DMSP")
    i = .Range("B8").End(xlDown).Row
    Res = .Range("A9:G" & i).Value
    ReDim Preserve Res(1 To UBound(Res), 1 To sCol)
  End With

  With CreateObject("scripting.dictionary")
    For i = 2 To UBound(Res) - 1
      If Len(Res(i, 5)) > 0 Then
        If Len(Res(i - 1, 5)) = 0 Then khStr = Res(i - 1, 2)
        .Item(khStr & "#" & Res(i, 5)) = i
      End If
    Next i
    For i = 2 To UBound(TongHop) - 1
      If Len(TongHop(i, 5)) > 0 Then
        If Len(TongHop(i - 1, 5)) = 0 Then khStr = TongHop(i - 1, 2)
        ik = .Item(khStr & "#" & TongHop(i, 5))
        If ik > 0 Then
          For j = 13 To sCol
            If Len(TongHop(i, j)) Then Res(ik, j) = TongHop(i, j)
          Next j
        End If
      End If
    Next i
    If jCol Then
      For i = 1 To UBound(DuLieuKey) Step 8
        ik = .Item(DuLieuKey(i, 1) & "#" & DuLieuKey(i, 2))
        If ik > 0 Then Res(ik, jCol) = DuLieuSum(i, 1) + DuLieuSum(i, 4) + DuLieuSum(i, 5)
      Next i
    End If
  End With
  Sheets("TONG_HOP").Range("A9").Resize(UBound(Res), UBound(Res, 2)) = Res
End Sub

Xin chào hpkhuong,HieuCD
Cảm ơn 2 bạn đã giúp đỡ Oanh Thơ áp dụng code của 2 bạn vào tập tin thực ra kết quả đúng với kết quả mong đợi rồi ạ.
--
Không rỏ đặc điểm tạo mã hàng, nên ghép Khách hàng và mã hàng làm key của Dic
Sheet DuLieu dùng 2 mảng để giảm dữ liệu gán vào mảng
@HieuCD
Dạ cảm ơn bạn đã quan tâm, Oanh Thơ cũng định hỏi bạn và hpkhuong về vấn đề này từ bài các bài ,nhưng cảm thấy hơi ngại vì những vấn đề thay đổi do OT không nêu rõ hết được tường tận các vấn đề từ trước, nên ráng chịu ạ.
Nhờ thắc mắc của bạn mà OT muốn giải thích và nhờ bạn bỏ thông tin khách hàng ra khỏi key của Dic được không ạ?

Vì hiện tại thì dữ liệu minh họa gửi lên chuẩn hóa là như vậy nhưng thực tế tên khách hàng nhập vào có lúc không được chuẩn hóa, và phải chuẩn hóa lại dữ liệu bằng tay,và dữ liệu là rất nhiều.
Mã hàng là duy nhất (và cũng là chìa khóa để tìm kiếm cho mọi thông tin khác liên quan đến mã hàng ạ),tại sheets("DMSP") sẽ thường xuyên cập nhật mã danh mục sản phẩm, bao gồm thông tin mã hàng (cột E), đôi khi các thông tin khác như tên hàng, tên khách hàng v.v.. có thể viết không theo 1 tiêu chuẩn sai ký tự, số lượng ký tự... nhưng mã hàng thì không thể sai ạ.
Khi có mã hàng mới sheets("DMSP") này sẽ thêm mã hàng mới vào (kèm theo các thông tin liên quan như tên hàng, tên khách hàng v.v... có thể các thông tin này không có bị thiếu thông tin, thậm trí có thể bị trùng thông tin khác) nhưng mã hàng bắt buộc phải có và khác mã hàng khác.
Khi mã hàng không còn sử dụng hết hạn sản xuất thì trong sheets("DMSP") sẽ xóa mã hàng này đi ạ.
và các thông tin thay đổi trong sheets("DMSP") sẽ được cập nhật mới sang sheets("TONG_HOP") mới như code của 2 bạn đã đáp đứng được đó ạ.

Cảm ơn các bạn rất nhiều
 
Upvote 0
Xin chào hpkhuong,HieuCD
Cảm ơn 2 bạn đã giúp đỡ Oanh Thơ áp dụng code của 2 bạn vào tập tin thực ra kết quả đúng với kết quả mong đợi rồi ạ.
--

@HieuCD
Dạ cảm ơn bạn đã quan tâm, Oanh Thơ cũng định hỏi bạn và hpkhuong về vấn đề này từ bài các bài ,nhưng cảm thấy hơi ngại vì những vấn đề thay đổi do OT không nêu rõ hết được tường tận các vấn đề từ trước, nên ráng chịu ạ.
Nhờ thắc mắc của bạn mà OT muốn giải thích và nhờ bạn bỏ thông tin khách hàng ra khỏi key của Dic được không ạ?

Vì hiện tại thì dữ liệu minh họa gửi lên chuẩn hóa là như vậy nhưng thực tế tên khách hàng nhập vào có lúc không được chuẩn hóa, và phải chuẩn hóa lại dữ liệu bằng tay,và dữ liệu là rất nhiều.
Mã hàng là duy nhất (và cũng là chìa khóa để tìm kiếm cho mọi thông tin khác liên quan đến mã hàng ạ),tại sheets("DMSP") sẽ thường xuyên cập nhật mã danh mục sản phẩm, bao gồm thông tin mã hàng (cột E), đôi khi các thông tin khác như tên hàng, tên khách hàng v.v.. có thể viết không theo 1 tiêu chuẩn sai ký tự, số lượng ký tự... nhưng mã hàng thì không thể sai ạ.
Khi có mã hàng mới sheets("DMSP") này sẽ thêm mã hàng mới vào (kèm theo các thông tin liên quan như tên hàng, tên khách hàng v.v... có thể các thông tin này không có bị thiếu thông tin, thậm trí có thể bị trùng thông tin khác) nhưng mã hàng bắt buộc phải có và khác mã hàng khác.
Khi mã hàng không còn sử dụng hết hạn sản xuất thì trong sheets("DMSP") sẽ xóa mã hàng này đi ạ.
và các thông tin thay đổi trong sheets("DMSP") sẽ được cập nhật mới sang sheets("TONG_HOP") mới như code của 2 bạn đã đáp đứng được đó ạ.

Cảm ơn các bạn rất nhiều
Thêm bẩy lỗi
Mã:
Sub GPE_3()
  Dim Res(), DuLieuKey As Variant, DuLieuSum(), TongHop As Variant
  Dim iKey As String
  Dim i As Long, ik As Long, j As Long, sCol As Long, jCol As Long
  Dim Ngay

  With Sheets("TONG_HOP")
    sCol = .Range("AAA8").End(xlToLeft).Column
    On Error Resume Next
    jCol = Application.Match(Ngay, .Range("A8").Resize(, sCol).Value, 0)
    On Error GoTo 0
    i = .Range("B8").End(xlDown).Row
    If i < Rows.Count Then
      TongHop = .Range("A8:A" & i).Resize(, sCol).Value
      .Range("A9:A" & i).Resize(, sCol).ClearContents
    End If
  End With

  With Sheets("DMSP")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 9 Then MsgBox ("Khong co du lieu"): Exit Sub
    Res = .Range("A9:G" & i).Value
    ReDim Preserve Res(1 To UBound(Res), 1 To sCol)
  End With
 
  With Sheets("DU_LIEU")
    i = .Range("F1000000").End(xlUp).Row
    If i > 5 Then
      DuLieuKey = .Range("F6:F" & i).Value
      DuLieuSum = .Range("BG6:BK" & i).Value
      Ngay = .Range("D2").Value
    End If
  End With

  With CreateObject("scripting.dictionary")
    For i = 2 To UBound(Res) - 1
      iKey = Res(i, 5)
      If Len(iKey) > 0 Then .Item(iKey) = i
    Next i
    If TypeName(TongHop) = "Variant()" Then
      For i = 2 To UBound(TongHop) - 1
        iKey = TongHop(i, 5)
        If Len(iKey) > 0 Then
          ik = .Item(iKey)
          If ik > 0 Then
            For j = 13 To sCol
              If Len(TongHop(i, j)) Then Res(ik, j) = TongHop(i, j)
            Next j
          End If
        End If
      Next i
    End If
    If jCol And TypeName(DuLieuKey) = "Variant()" Then
      For i = 1 To UBound(DuLieuKey) Step 8
        ik = .Item(DuLieuKey(i, 1))
        If ik > 0 Then Res(ik, jCol) = DuLieuSum(i, 1) + DuLieuSum(i, 4) + DuLieuSum(i, 5)
      Next i
    End If
  End With
  Sheets("TONG_HOP").Range("A9").Resize(UBound(Res), UBound(Res, 2)) = Res
End Sub
 
Upvote 0
Thêm bẩy lỗi
Mã:
Sub GPE_3()
  Dim Res(), DuLieuKey As Variant, DuLieuSum(), TongHop As Variant
  Dim iKey As String
  Dim i As Long, ik As Long, j As Long, sCol As Long, jCol As Long
  Dim Ngay

  With Sheets("TONG_HOP")
    sCol = .Range("AAA8").End(xlToLeft).Column
    On Error Resume Next
    jCol = Application.Match(Ngay, .Range("A8").Resize(, sCol).Value, 0)
    On Error GoTo 0
    i = .Range("B8").End(xlDown).Row
    If i < Rows.Count Then
      TongHop = .Range("A8:A" & i).Resize(, sCol).Value
      .Range("A9:A" & i).Resize(, sCol).ClearContents
    End If
  End With

  With Sheets("DMSP")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 9 Then MsgBox ("Khong co du lieu"): Exit Sub
    Res = .Range("A9:G" & i).Value
    ReDim Preserve Res(1 To UBound(Res), 1 To sCol)
  End With

  With Sheets("DU_LIEU")
    i = .Range("F1000000").End(xlUp).Row
    If i > 5 Then
      DuLieuKey = .Range("F6:F" & i).Value
      DuLieuSum = .Range("BG6:BK" & i).Value
      Ngay = .Range("D2").Value
    End If
  End With

  With CreateObject("scripting.dictionary")
    For i = 2 To UBound(Res) - 1
      iKey = Res(i, 5)
      If Len(iKey) > 0 Then .Item(iKey) = i
    Next i
    If TypeName(TongHop) = "Variant()" Then
      For i = 2 To UBound(TongHop) - 1
        iKey = TongHop(i, 5)
        If Len(iKey) > 0 Then
          ik = .Item(iKey)
          If ik > 0 Then
            For j = 13 To sCol
              If Len(TongHop(i, j)) Then Res(ik, j) = TongHop(i, j)
            Next j
          End If
        End If
      Next i
    End If
    If jCol And TypeName(DuLieuKey) = "Variant()" Then
      For i = 1 To UBound(DuLieuKey) Step 8
        ik = .Item(DuLieuKey(i, 1))
        If ik > 0 Then Res(ik, jCol) = DuLieuSum(i, 1) + DuLieuSum(i, 4) + DuLieuSum(i, 5)
      Next i
    End If
  End With
  Sheets("TONG_HOP").Range("A9").Resize(UBound(Res), UBound(Res, 2)) = Res
End Sub

Xin chào HieuCD,

Cảm ơn bạn nhiều, code trên chạy kết quả OK rồi, nhưng chỉ chạy được 1 lần .
ví dụ sau khi chạy lần thứ nhất, sửa lại số liệu bên sheets("DU_LIEU") thay đổi thay đổi BK62 từ 2 thành 200 chẳng hạn và chạy lại code trên thì không thấy hiệu ứng thay đổi kết quả của code.

Nhờ bạn xem giúp ạ.
 
Upvote 0
ví dụ sau khi chạy lần thứ nhất, sửa lại số liệu bên sheets("DU_LIEU") thay đổi thay đổi BK62 từ 2 thành 200 chẳng hạn và chạy lại code trên thì không thấy hiệu ứng thay đổi kết quả của code.
Bạn chạy thử Sub "Cùi Bắp" này xem sao.
PHP:
Public Sub LuXuBu()
Const Col As Long = 12
Dim Dic As Object, Txt As String
Dim sArr(), tArr(), dArr()
Dim I As Long, J As Long, K As Long, N As Long, R As Long, R2 As Long, Thang As Long
Set Dic = CreateObject("Scripting.Dictionary")
Thang = Month(Sheets("DU_LIEU").Range("D2"))
With Sheets("DMSP")
    sArr = .Range("A9", .Range("B9").End(xlDown)).Resize(, 7).Value
    R = UBound(sArr)
    ReDim dArr(1 To R, 1 To Thang + Col)
    For I = 1 To R
        Txt = sArr(I, 5)
        If Len(Txt) Then Dic.Item(Txt) = I
        For J = 1 To 7
            dArr(I, J) = sArr(I, J)
        Next J
    Next I
End With
With Sheets("DU_LIEU")
    sArr = .Range("F6", .Range("F100000").End(xlUp)).Resize(, 58).Value
    R2 = UBound(sArr)
    For I = 1 To R2 Step 8
        Txt = sArr(I, 1)
        If Dic.Exists(Txt) Then
            N = Dic.Item(Txt)
            dArr(N, Thang + Col) = sArr(I, 54) + sArr(I, 57) + sArr(I, 58)
        End If
    Next I
End With
With Sheets("TONG_HOP")
    sArr = .Range("A9", .Range("B9").End(xlDown)).Resize(, Thang + Col - 1).Value
    R2 = UBound(sArr)
    For I = 2 To R2
        Txt = sArr(I, 5)
        If Dic.Exists(Txt) Then
            N = Dic.Item(Txt)
            For J = 1 To Thang - 1
                dArr(N, J + Col) = sArr(I, J + Col)
            Next J
        End If
    Next I
    .Range("A9").Resize(1000, 24).ClearContents
    .Range("A9").Resize(R, Thang + Col) = dArr
End With
Set Dic = Nothing
End Sub
 
Upvote 0
Bạn chạy thử Sub "Cùi Bắp" này xem sao.
PHP:
Public Sub LuXuBu()
Const Col As Long = 12
Dim Dic As Object, Txt As String
Dim sArr(), tArr(), dArr()
Dim I As Long, J As Long, K As Long, N As Long, R As Long, R2 As Long, Thang As Long
Set Dic = CreateObject("Scripting.Dictionary")
Thang = Month(Sheets("DU_LIEU").Range("D2"))
With Sheets("DMSP")
    sArr = .Range("A9", .Range("B9").End(xlDown)).Resize(, 7).Value
    R = UBound(sArr)
    ReDim dArr(1 To R, 1 To Thang + Col)
    For I = 1 To R
        Txt = sArr(I, 5)
        If Len(Txt) Then Dic.Item(Txt) = I
        For J = 1 To 7
            dArr(I, J) = sArr(I, J)
        Next J
    Next I
End With
With Sheets("DU_LIEU")
    sArr = .Range("F6", .Range("F100000").End(xlUp)).Resize(, 58).Value
    R2 = UBound(sArr)
    For I = 1 To R2 Step 8
        Txt = sArr(I, 1)
        If Dic.Exists(Txt) Then
            N = Dic.Item(Txt)
            dArr(N, Thang + Col) = sArr(I, 54) + sArr(I, 57) + sArr(I, 58)
        End If
    Next I
End With
With Sheets("TONG_HOP")
    sArr = .Range("A9", .Range("B9").End(xlDown)).Resize(, Thang + Col - 1).Value
    R2 = UBound(sArr)
    For I = 2 To R2
        Txt = sArr(I, 5)
        If Dic.Exists(Txt) Then
            N = Dic.Item(Txt)
            For J = 1 To Thang - 1
                dArr(N, J + Col) = sArr(I, J + Col)
            Next J
        End If
    Next I
    .Range("A9").Resize(1000, 24).ClearContents
    .Range("A9").Resize(R, Thang + Col) = dArr
End With
Set Dic = Nothing
End Sub

Xin chào thầy Ba Tê
Code "cùi bắp" mà thầy gọi, chạy không nhữnng Ok mà còn rất nhanh & khỏe nữa ạ.
Cảm ơn thầy Ba Tê đã giúp đỡ ạ,
 
Upvote 0
Xin chào HieuCD,

Cảm ơn bạn nhiều, code trên chạy kết quả OK rồi, nhưng chỉ chạy được 1 lần .
ví dụ sau khi chạy lần thứ nhất, sửa lại số liệu bên sheets("DU_LIEU") thay đổi thay đổi BK62 từ 2 thành 200 chẳng hạn và chạy lại code trên thì không thấy hiệu ứng thay đổi kết quả của code.

Nhờ bạn xem giúp ạ.
Chỉnh lại
Mã:
Sub GPE_3()
  Dim Res As Variant, DuLieuKey As Variant, DuLieuSum As Variant, TongHop As Variant
  Dim iKey As String
  Dim i As Long, ik As Long, j As Long, sCol As Long, jCol As Long
  Dim Ngay
 
  With Sheets("DU_LIEU")
    i = .Range("F1000000").End(xlUp).Row
    If i > 5 Then
      DuLieuKey = .Range("F6:F" & i).Value
      DuLieuSum = .Range("BG6:BK" & i).Value
      Ngay = .Range("D2").Value
    End If
  End With
 
  With Sheets("TONG_HOP")
    sCol = .Range("AAA8").End(xlToLeft).Column
    On Error Resume Next
    jCol = Application.Match(Ngay, .Range("A8").Resize(, sCol).Value, 0)
    On Error GoTo 0
    i = .Range("B8").End(xlDown).Row
    If i < Rows.Count Then
      TongHop = .Range("A8:A" & i).Resize(, sCol).Value
      .Range("A9:A" & i).Resize(, sCol).ClearContents
    End If
  End With

  With Sheets("DMSP")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 9 Then MsgBox ("Khong co du lieu"): Exit Sub
    Res = .Range("A9:G" & i).Value
    ReDim Preserve Res(1 To UBound(Res), 1 To sCol)
  End With

  With CreateObject("scripting.dictionary")
    For i = 2 To UBound(Res) - 1
      iKey = CStr(Res(i, 5))
      If Len(iKey) > 0 Then .Item(iKey) = i
    Next i
    If TypeName(TongHop) = "Variant()" Then
      For i = 2 To UBound(TongHop) - 1
        iKey = CStr(TongHop(i, 5))
        If Len(iKey) > 0 Then
          ik = .Item(iKey)
          If ik > 0 Then
            For j = 13 To sCol
              If Len(TongHop(i, j)) Then Res(ik, j) = TongHop(i, j)
            Next j
          End If
        End If
      Next i
    End If
    If jCol And TypeName(DuLieuKey) = "Variant()" Then
      For i = 1 To UBound(DuLieuKey) Step 8
        ik = .Item(CStr(DuLieuKey(i, 1)))
        If ik > 0 Then Res(ik, jCol) = DuLieuSum(i, 1) + DuLieuSum(i, 4) + DuLieuSum(i, 5)
      Next i
    End If
  End With
  Sheets("TONG_HOP").Range("A9").Resize(UBound(Res), UBound(Res, 2)) = Res
End Sub
 
Upvote 0
Chỉnh lại
Mã:
Sub GPE_3()
  Dim Res As Variant, DuLieuKey As Variant, DuLieuSum As Variant, TongHop As Variant
  Dim iKey As String
  Dim i As Long, ik As Long, j As Long, sCol As Long, jCol As Long
  Dim Ngay

  With Sheets("DU_LIEU")
    i = .Range("F1000000").End(xlUp).Row
    If i > 5 Then
      DuLieuKey = .Range("F6:F" & i).Value
      DuLieuSum = .Range("BG6:BK" & i).Value
      Ngay = .Range("D2").Value
    End If
  End With

  With Sheets("TONG_HOP")
    sCol = .Range("AAA8").End(xlToLeft).Column
    On Error Resume Next
    jCol = Application.Match(Ngay, .Range("A8").Resize(, sCol).Value, 0)
    On Error GoTo 0
    i = .Range("B8").End(xlDown).Row
    If i < Rows.Count Then
      TongHop = .Range("A8:A" & i).Resize(, sCol).Value
      .Range("A9:A" & i).Resize(, sCol).ClearContents
    End If
  End With

  With Sheets("DMSP")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 9 Then MsgBox ("Khong co du lieu"): Exit Sub
    Res = .Range("A9:G" & i).Value
    ReDim Preserve Res(1 To UBound(Res), 1 To sCol)
  End With

  With CreateObject("scripting.dictionary")
    For i = 2 To UBound(Res) - 1
      iKey = CStr(Res(i, 5))
      If Len(iKey) > 0 Then .Item(iKey) = i
    Next i
    If TypeName(TongHop) = "Variant()" Then
      For i = 2 To UBound(TongHop) - 1
        iKey = CStr(TongHop(i, 5))
        If Len(iKey) > 0 Then
          ik = .Item(iKey)
          If ik > 0 Then
            For j = 13 To sCol
              If Len(TongHop(i, j)) Then Res(ik, j) = TongHop(i, j)
            Next j
          End If
        End If
      Next i
    End If
    If jCol And TypeName(DuLieuKey) = "Variant()" Then
      For i = 1 To UBound(DuLieuKey) Step 8
        ik = .Item(CStr(DuLieuKey(i, 1)))
        If ik > 0 Then Res(ik, jCol) = DuLieuSum(i, 1) + DuLieuSum(i, 4) + DuLieuSum(i, 5)
      Next i
    End If
  End With
  Sheets("TONG_HOP").Range("A9").Resize(UBound(Res), UBound(Res, 2)) = Res
End Sub

Xin chào HieuCD,
Cảm ơn bạn rất nhiều , code chay OK rồi ạ.
Chúc bạn nhiều sức khỏe.
 
Upvote 0
Xin chào tất cả các bạn.

Oanh Thơ (OT) có một tập tin tổng hợp dữ liệu khác, chi tiết OT nêu cụ thể trong tập tin gửi kèm.
Nhờ các bạn xem và giúp đỡ ạ
 

File đính kèm

Upvote 0
Sao bạn không tách ra chủ để khác, để chung vậy nhìn vào cso thể mọi người nghĩ là một bài?
Xin chào Miền Cát Trắng
Dạ, để chung như thế này khi cần đến Oanh Thơ(OT) dễ tìm.
Hơn nữa bài 40 cũng là dạng bài tổng hợp theo điều kiện.
Và một lý do nữa OT mong muốn nhận được sự hỗ trợ từ những cái tên thân quen trong chủ đề, trên GPE các bạn ấy đã giúp OT nhiều lên có thể các bạn ấy sẽ hiểu nhu cầu của OT hơn :)
Cảm ơn bạn đã quan tâm.
Mong nhận được sự giúp đỡ.
 
Upvote 0

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom