Tổng hợp báo cáo - nhờ xử lý (3 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

caovanhau1507

Thành viên chính thức
Tham gia
17/7/12
Bài viết
79
Được thích
3
Chào các anh chị GPE,

Hiện tại em có 1 mẫu báo cáo lấy dữ liệu từ 3 sheet data khác nhau, cụ thể:
- 1 Sheet cho danh sách nợ theo KH,
- 1 sheet cho khai báo hạn mức theo danh mục sản phẩm,
- 1 sheet thống kê danh mục sản phẩm mà KH đang sở hữu.

Công việc là tính toán phân bổ nợ của khách hàng trên số dư sản phẩm mà KH đang sở hữu, bao gồm:
- Nợ tuyệt đối trên từng sản phẩm = Tỉ trọng của sản phẩm đó x tổng nợ,
- số sản phẩm bị đem đi cấn nợ (đảm bảo nợ) = số lượng sp hiện sở hữu x tỉ lệ cấn nợ, max = số dư hiện có,
- Hạn mức còn lại của từng sản phẩm.

Em có dùng macro để thực hiện thao tác nhưng do dữ liệu lớn (>100k dòng) nên cuối cùng xử lý rất chậm và bất tiện, nay muốn nhờ các anh chị GPE tư vấn cách dùng mảng trong VBA để xử lý tình huống này. Hoặc có ý tưởng nào khác có thể tối ưu tính toán thì tư vấn giúp em.

Em cảm ơn :D
 

File đính kèm

Không biết do em mô tả chưa đầy đủ hay có vấn đề gì khác mà cũng 2 tuần rồi không ai trả lời em :(
 
bạn nhấn ngôi sao để chạy code

C
Cảm ơn a.Hiếu đã giúp,
KHi em làm với dữ liệu thực tế thì phát sinh trường hợp KH A có tên trong danh sách "DSKH" nhưng không có trong "DMSP" ---> KH này có nợ nhưng ko có sp
Lúc này, code chạy sẽ báo lỗi "devision by zero". Trường hợp này thì trả về Tgt = 0 luôn như thế nào vậy a.
 
Lần chỉnh sửa cuối:
C
Cảm ơn a.Hiếu đã giúp,
KHi em làm với dữ liệu thực tế thì phát sinh trường hợp KH A có tên trong danh sách "DSKH" nhưng không có trong "DMSP" ---> KH này có nợ nhưng ko có sp
Lúc này, code chạy sẽ báo lỗi "devision by zero". Trường hợp này thì trả về Tgt = 0 luôn như thế nào vậy a.
code chỉ liệt kê các sản phẩm có trong sheet DMSP
Mã:
Sub TongHop()
Dim KH(), SP(), HM(), Arr(), Darr(), Dic As Object, DicSP As Object, DicHM As Object
Dim i As Long, k As Long, km As Long, Tgt
i = Sheets("DSKH").Range("B65500").End(xlUp).Row
Sheet5.Range("C4") = Application.Large(Sheets("DSKH").Range("C2:C" & i), 1)
Sheet5.Range("C5") = Application.Large(Sheets("DSKH").Range("C2:C" & i), 2)
Sheet5.Range("C6") = Application.Large(Sheets("DSKH").Range("C2:C" & i), 3)
KH = Sheets("DSKH").Range("B2:C" & i).Value
SP = Sheets("DMSP").Range("B2:I" & Sheets("DMSP").Range("B65500").End(xlUp).Row).Value
HM = Sheets("HM").Range("B2", Sheets("HM").Range("C65500").End(xlUp)).Value
ReDim Arr(1 To UBound(HM), 1 To 4)
ReDim Darr(1 To UBound(KH), 1 To 4)
Set Dic = CreateObject("Scripting.Dictionary")
Set DicSP = CreateObject("Scripting.Dictionary")
Set DicHM = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(HM)
  DicHM(HM(i, 1)) = HM(i, 2)
Next i
For i = 1 To UBound(SP)
  If Not DicSP.exists(SP(i, 1)) Then
    km = km + 1
    DicSP.Add SP(i, 1), km
    Arr(km, 1) = SP(i, 1)
  End If
  If Not Dic.exists(SP(i, 2)) Then
    k = k + 1
    Dic.Add SP(i, 2), k
    Darr(k, 1) = SP(i, 2)
  End If
  Darr(Dic.Item(SP(i, 2)), 2) = Darr(Dic.Item(SP(i, 2)), 2) + SP(i, 5)
Next i
For i = 1 To UBound(KH)
  If Dic.exists(KH(i, 1)) Then
    Darr(Dic.Item(KH(i, 1)), 3) = KH(i, 2)
  End If
  If KH(i, 2) = Sheet5.Range("C4") Then Sheet5.Range("D4") = KH(i, 1)
  If KH(i, 2) = Sheet5.Range("C5") Then Sheet5.Range("D5") = KH(i, 1)
  If KH(i, 2) = Sheet5.Range("C6") Then Sheet5.Range("D6") = KH(i, 1)
Next i
For i = 1 To UBound(Darr)
  Darr(i, 4) = Darr(i, 3) / Darr(i, 2)
  Tgt = Tgt + Darr(i, 3)
Next i
For i = 1 To UBound(SP)
  SP(i, 6) = SP(i, 5) / Darr(Dic.Item(SP(i, 2)), 2)
  SP(i, 7) = SP(i, 6) * Darr(Dic.Item(SP(i, 2)), 3)
  SP(i, 8) = SP(i, 3) * IIf(Darr(Dic.Item(SP(i, 2)), 4) > 1, 1, Darr(Dic.Item(SP(i, 2)), 4))
Next i
For i = 1 To UBound(SP)
    Arr(DicSP.Item(SP(i, 1)), 2) = Arr(DicSP.Item(SP(i, 1)), 2) + SP(i, 7)
    Arr(DicSP.Item(SP(i, 1)), 3) = Arr(DicSP.Item(SP(i, 1)), 3) + SP(i, 8)
Next i
For i = 1 To UBound(Arr)
  If DicHM.exists(Arr(i, 1)) Then
    Arr(i, 4) = DicHM.Item(Arr(i, 1))
  End If
  Arr(i, 4) = Arr(i, 4) - Arr(i, 3)
Next i
Sheet5.Range("C2") = Tgt
Sheet5.Range("E2:H2000").ClearContents
Sheet5.Range("E2").Resize(UBound(Arr), 4) = Arr
Set Dic = Nothing:    Set DicHM = Nothing:    Set DicSP = Nothing
Erase Arr:  Erase Darr:   Erase KH:  Erase SP:  Erase HM
End Sub
 
code chỉ liệt kê các sản phẩm có trong sheet DMSP
Mã:
Sub TongHop()
Dim KH(), SP(), HM(), Arr(), Darr(), Dic As Object, DicSP As Object, DicHM As Object
Dim i As Long, k As Long, km As Long, Tgt
i = Sheets("DSKH").Range("B65500").End(xlUp).Row
Sheet5.Range("C4") = Application.Large(Sheets("DSKH").Range("C2:C" & i), 1)
Sheet5.Range("C5") = Application.Large(Sheets("DSKH").Range("C2:C" & i), 2)
Sheet5.Range("C6") = Application.Large(Sheets("DSKH").Range("C2:C" & i), 3)
KH = Sheets("DSKH").Range("B2:C" & i).Value
SP = Sheets("DMSP").Range("B2:I" & Sheets("DMSP").Range("B65500").End(xlUp).Row).Value
HM = Sheets("HM").Range("B2", Sheets("HM").Range("C65500").End(xlUp)).Value
ReDim Arr(1 To UBound(HM), 1 To 4)
ReDim Darr(1 To UBound(KH), 1 To 4)
Set Dic = CreateObject("Scripting.Dictionary")
Set DicSP = CreateObject("Scripting.Dictionary")
Set DicHM = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(HM)
  DicHM(HM(i, 1)) = HM(i, 2)
Next i
For i = 1 To UBound(SP)
  If Not DicSP.exists(SP(i, 1)) Then
    km = km + 1
    DicSP.Add SP(i, 1), km
    Arr(km, 1) = SP(i, 1)
  End If
  If Not Dic.exists(SP(i, 2)) Then
    k = k + 1
    Dic.Add SP(i, 2), k
    Darr(k, 1) = SP(i, 2)
  End If
  Darr(Dic.Item(SP(i, 2)), 2) = Darr(Dic.Item(SP(i, 2)), 2) + SP(i, 5)
Next i
For i = 1 To UBound(KH)
  If Dic.exists(KH(i, 1)) Then
    Darr(Dic.Item(KH(i, 1)), 3) = KH(i, 2)
  End If
  If KH(i, 2) = Sheet5.Range("C4") Then Sheet5.Range("D4") = KH(i, 1)
  If KH(i, 2) = Sheet5.Range("C5") Then Sheet5.Range("D5") = KH(i, 1)
  If KH(i, 2) = Sheet5.Range("C6") Then Sheet5.Range("D6") = KH(i, 1)
Next i
For i = 1 To UBound(Darr)
  Darr(i, 4) = Darr(i, 3) / Darr(i, 2)
  Tgt = Tgt + Darr(i, 3)
Next i
For i = 1 To UBound(SP)
  SP(i, 6) = SP(i, 5) / Darr(Dic.Item(SP(i, 2)), 2)
  SP(i, 7) = SP(i, 6) * Darr(Dic.Item(SP(i, 2)), 3)
  SP(i, 8) = SP(i, 3) * IIf(Darr(Dic.Item(SP(i, 2)), 4) > 1, 1, Darr(Dic.Item(SP(i, 2)), 4))
Next i
For i = 1 To UBound(SP)
    Arr(DicSP.Item(SP(i, 1)), 2) = Arr(DicSP.Item(SP(i, 1)), 2) + SP(i, 7)
    Arr(DicSP.Item(SP(i, 1)), 3) = Arr(DicSP.Item(SP(i, 1)), 3) + SP(i, 8)
Next i
For i = 1 To UBound(Arr)
  If DicHM.exists(Arr(i, 1)) Then
    Arr(i, 4) = DicHM.Item(Arr(i, 1))
  End If
  Arr(i, 4) = Arr(i, 4) - Arr(i, 3)
Next i
Sheet5.Range("C2") = Tgt
Sheet5.Range("E2:H2000").ClearContents
Sheet5.Range("E2").Resize(UBound(Arr), 4) = Arr
Set Dic = Nothing:    Set DicHM = Nothing:    Set DicSP = Nothing
Erase Arr:  Erase Darr:   Erase KH:  Erase SP:  Erase HM
End Sub



Em gửi lại anh file, a xem giúp em lỗi trả về nha,
cảm ơn a!
 

File đính kèm

Em gửi lại anh file, a xem giúp em lỗi trả về nha,
cảm ơn a!
bạn kiểm tra lại code
Mã:
Sub TongHop()
Dim KH(), SP(), HM(), Arr(), Darr(), Dic As Object, DicSP As Object, DicHM As Object
Dim i As Long, k As Long, km As Long, Tgt
i = Sheets("DSKH").Range("B65500").End(xlUp).Row
Sheet5.Range("C4") = Application.Large(Sheets("DSKH").Range("C2:C" & i), 1)
Sheet5.Range("C5") = Application.Large(Sheets("DSKH").Range("C2:C" & i), 2)
Sheet5.Range("C6") = Application.Large(Sheets("DSKH").Range("C2:C" & i), 3)
KH = Sheets("DSKH").Range("B2:C" & i).Value
SP = Sheets("DMSP").Range("B2:I" & Sheets("DMSP").Range("B65500").End(xlUp).Row).Value
HM = Sheets("HM").Range("B2", Sheets("HM").Range("C65500").End(xlUp)).Value
ReDim Arr(1 To UBound(SP), 1 To 4)
ReDim Darr(1 To UBound(SP), 1 To 4)
Set Dic = CreateObject("Scripting.Dictionary")
Set DicSP = CreateObject("Scripting.Dictionary")
Set DicHM = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(HM)
  DicHM(HM(i, 1)) = HM(i, 2)
Next i
For i = 1 To UBound(SP)
  If Not DicSP.exists(SP(i, 1)) Then
    km = km + 1
    DicSP.Add SP(i, 1), km
    Arr(km, 1) = SP(i, 1)
  End If
  If Not Dic.exists(SP(i, 2)) Then
    k = k + 1
    Dic.Add SP(i, 2), k
    Darr(k, 1) = SP(i, 2)
  End If
  Darr(Dic.Item(SP(i, 2)), 2) = Darr(Dic.Item(SP(i, 2)), 2) + SP(i, 5)
Next i
For i = 1 To UBound(KH)
  If Dic.exists(KH(i, 1)) Then
    a = Dic.Item(KH(i, 1))
    Darr(Dic.Item(KH(i, 1)), 3) = KH(i, 2)
  End If
  If KH(i, 2) = Sheet5.Range("C4") Then Sheet5.Range("D4") = KH(i, 1)
  If KH(i, 2) = Sheet5.Range("C5") Then Sheet5.Range("D5") = KH(i, 1)
  If KH(i, 2) = Sheet5.Range("C6") Then Sheet5.Range("D6") = KH(i, 1)
Next i
For i = 1 To k
  Darr(i, 4) = Darr(i, 3) / Darr(i, 2)
  Tgt = Tgt + Darr(i, 3)
Next i
For i = 1 To UBound(SP)
  SP(i, 6) = SP(i, 5) / Darr(Dic.Item(SP(i, 2)), 2)
  SP(i, 7) = SP(i, 6) * Darr(Dic.Item(SP(i, 2)), 3)
  SP(i, 8) = SP(i, 3) * IIf(Darr(Dic.Item(SP(i, 2)), 4) > 1, 1, Darr(Dic.Item(SP(i, 2)), 4))
Next i
For i = 1 To UBound(SP)
    Arr(DicSP.Item(SP(i, 1)), 2) = Arr(DicSP.Item(SP(i, 1)), 2) + SP(i, 7)
    Arr(DicSP.Item(SP(i, 1)), 3) = Arr(DicSP.Item(SP(i, 1)), 3) + SP(i, 8)
Next i
For i = 1 To km
  If DicHM.exists(Arr(i, 1)) Then
    Arr(i, 4) = DicHM.Item(Arr(i, 1))
  End If
  Arr(i, 4) = Arr(i, 4) - Arr(i, 3)
Next i
Sheet5.Range("C2") = Tgt
Sheet5.Range("E2:H2000").ClearContents
Sheet5.Range("E2").Resize(UBound(Arr), 4) = Arr
Set Dic = Nothing:    Set DicHM = Nothing:    Set DicSP = Nothing
Erase Arr:  Erase Darr:   Erase KH:  Erase SP:  Erase HM
End Sub
 
Chuẩn luôn rồi anh ơi, cảm ơn a quá nhiều :D
 
bạn kiểm tra lại code
Mã:
Sub TongHop()
Dim KH(), SP(), HM(), Arr(), Darr(), Dic As Object, DicSP As Object, DicHM As Object
Dim i As Long, k As Long, km As Long, Tgt
i = Sheets("DSKH").Range("B65500").End(xlUp).Row
Sheet5.Range("C4") = Application.Large(Sheets("DSKH").Range("C2:C" & i), 1)
Sheet5.Range("C5") = Application.Large(Sheets("DSKH").Range("C2:C" & i), 2)
Sheet5.Range("C6") = Application.Large(Sheets("DSKH").Range("C2:C" & i), 3)
KH = Sheets("DSKH").Range("B2:C" & i).Value
SP = Sheets("DMSP").Range("B2:I" & Sheets("DMSP").Range("B65500").End(xlUp).Row).Value
HM = Sheets("HM").Range("B2", Sheets("HM").Range("C65500").End(xlUp)).Value
ReDim Arr(1 To UBound(SP), 1 To 4)
ReDim Darr(1 To UBound(SP), 1 To 4)
Set Dic = CreateObject("Scripting.Dictionary")
Set DicSP = CreateObject("Scripting.Dictionary")
Set DicHM = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(HM)
  DicHM(HM(i, 1)) = HM(i, 2)
Next i
For i = 1 To UBound(SP)
  If Not DicSP.exists(SP(i, 1)) Then
    km = km + 1
    DicSP.Add SP(i, 1), km
    Arr(km, 1) = SP(i, 1)
  End If
  If Not Dic.exists(SP(i, 2)) Then
    k = k + 1
    Dic.Add SP(i, 2), k
    Darr(k, 1) = SP(i, 2)
  End If
  Darr(Dic.Item(SP(i, 2)), 2) = Darr(Dic.Item(SP(i, 2)), 2) + SP(i, 5)
Next i
For i = 1 To UBound(KH)
  If Dic.exists(KH(i, 1)) Then
    a = Dic.Item(KH(i, 1))
    Darr(Dic.Item(KH(i, 1)), 3) = KH(i, 2)
  End If
  If KH(i, 2) = Sheet5.Range("C4") Then Sheet5.Range("D4") = KH(i, 1)
  If KH(i, 2) = Sheet5.Range("C5") Then Sheet5.Range("D5") = KH(i, 1)
  If KH(i, 2) = Sheet5.Range("C6") Then Sheet5.Range("D6") = KH(i, 1)
Next i
For i = 1 To k
  Darr(i, 4) = Darr(i, 3) / Darr(i, 2)
  Tgt = Tgt + Darr(i, 3)
Next i
For i = 1 To UBound(SP)
  SP(i, 6) = SP(i, 5) / Darr(Dic.Item(SP(i, 2)), 2)
  SP(i, 7) = SP(i, 6) * Darr(Dic.Item(SP(i, 2)), 3)
  SP(i, 8) = SP(i, 3) * IIf(Darr(Dic.Item(SP(i, 2)), 4) > 1, 1, Darr(Dic.Item(SP(i, 2)), 4))
Next i
For i = 1 To UBound(SP)
    Arr(DicSP.Item(SP(i, 1)), 2) = Arr(DicSP.Item(SP(i, 1)), 2) + SP(i, 7)
    Arr(DicSP.Item(SP(i, 1)), 3) = Arr(DicSP.Item(SP(i, 1)), 3) + SP(i, 8)
Next i
For i = 1 To km
  If DicHM.exists(Arr(i, 1)) Then
    Arr(i, 4) = DicHM.Item(Arr(i, 1))
  End If
  Arr(i, 4) = Arr(i, 4) - Arr(i, 3)
Next i
Sheet5.Range("C2") = Tgt
Sheet5.Range("E2:H2000").ClearContents
Sheet5.Range("E2").Resize(UBound(Arr), 4) = Arr
Set Dic = Nothing:    Set DicHM = Nothing:    Set DicSP = Nothing
Erase Arr:  Erase Darr:   Erase KH:  Erase SP:  Erase HM
End Sub


A.Hiếu có thể giải thích code giúp e 1 chút ko ah, e vẫn chưa hiểu so với code cũ nó khác nhau ntn.
Cảm ơn anh!
 
A.Hiếu có thể giải thích code giúp e 1 chút ko ah, e vẫn chưa hiểu so với code cũ nó khác nhau ntn.
Cảm ơn anh!
Mã:
...
KH = Sheets("DSKH").Range("B2:C" & i).Value
SP = Sheets("DMSP").Range("B2:I" & Sheets("DMSP").Range("B65500").End(xlUp).Row).Value
HM = Sheets("HM").Range("B2", Sheets("HM").Range("C65500").End(xlUp)).Value
[COLOR=#ff0000]ReDim Arr(1 To UBound(SP), 1 To 4)
ReDim Darr(1 To UBound(SP), 1 To 4)[/COLOR]
...
For i = 1 To UBound(SP)
[COLOR=#0000cd]  If Not DicSP.exists(SP(i, 1)) Then
    [/COLOR][COLOR=#b22222]km = km + 1[/COLOR][COLOR=#0000cd]
    DicSP.Add SP(i, 1), km
    Arr(km, 1) = SP(i, 1)
  End If
[/COLOR]Next i

[COLOR=#0000cd]  If Not Dic.exists(SP(i, 2)) Then
    [/COLOR][COLOR=#b22222]k = k + 1[/COLOR][COLOR=#0000cd]
    Dic.Add SP(i, 2), k
    Darr(k, 1) = SP(i, 2)
  End If[/COLOR]
  Darr(Dic.Item(SP(i, 2)), 2) = Darr(Dic.Item(SP(i, 2)), 2) + SP(i, 5)
Next i
For i = 1 To UBound(KH)
...
[COLOR=#ff0000]For i = 1 To k[/COLOR]
  Darr(i, 4) = Darr(i, 3) / Darr(i, 2)
  Tgt = Tgt + Darr(i, 3)
Next i
...
For i = 1 To UBound(SP)
    Arr(DicSP.Item(SP(i, 1)), 2) = Arr(DicSP.Item(SP(i, 1)), 2) + SP(i, 7)
    Arr(DicSP.Item(SP(i, 1)), 3) = Arr(DicSP.Item(SP(i, 1)), 3) + SP(i, 8)
Next i
[COLOR=#ff0000]For i = 1 To km[/COLOR]
  If DicHM.exists(Arr(i, 1)) Then
    Arr(i, 4) = DicHM.Item(Arr(i, 1))
  End If
  Arr(i, 4) = Arr(i, 4) - Arr(i, 3)
Next i
...
do chưa biết số khách hàng và số sản phẩm có trong sheet DMSP nên ban đầu phải tạm khai báo theo khả năng lớn nhất là số dòng của DMSP
ReDim Arr(1 To UBound(SP), 1 To 4)
ReDim Darr(1 To UBound(SP), 1 To 4)
Mã:
For i = 1 To UBound(SP)
[COLOR=#0000CD]  If Not DicSP.exists(SP(i, 1)) Then
    [/COLOR][COLOR=#B22222]km = km + 1[/COLOR][COLOR=#0000CD]
    DicSP.Add SP(i, 1), km
    Arr(km, 1) = SP(i, 1)
  End If
[/COLOR]Next i
ghi nhận từng sản phẩm vào DicSP, như vậy số sản phẩm là Km nhỏ hơn số dòng Arr
Mã:
[COLOR=#0000CD]  If Not Dic.exists(SP(i, 2)) Then
    [/COLOR][COLOR=#B22222]k = k + 1[/COLOR][COLOR=#0000CD]
    Dic.Add SP(i, 2), k
    Darr(k, 1) = SP(i, 2)
  End If[/COLOR]

ghi nhận từng khách hàng vào Dic, số khách hàng là K nhỏ hơn số dòng Darr

do đó phải chỉnh lại 2 vòng lập For phía dưới cho đúng với với số dòng của của Darr và Arr
nếu không thì chạy quá số dòng có dữ liệu và Darr(i,2)=0 nên chia cho số 0 bị lổi

Mã:
[COLOR=#FF0000]
For i = 1 To k[/COLOR]
  Darr(i, 4) = [COLOR=#0000cd]Darr(i, 3) / Darr(i, 2)[/COLOR]
  Tgt = Tgt + Darr(i, 3)
Next i
...
[COLOR=#FF0000]For i = 1 To km[/COLOR]
  If DicHM.exists(Arr(i, 1)) Then
    Arr(i, 4) = DicHM.Item(Arr(i, 1))
  End If
  Arr(i, 4) = Arr(i, 4) - Arr(i, 3)
Next i
a = Dic.Item(KH(i, 1)) là dòng lệnh mình thử nghiệm quên xóa, bạn xóa dòng nầy
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom