Làm bảng cân đối số phát sinh = vba

Liên hệ QC

tranthanhktt

Thành viên chính thức
Tham gia
7/9/10
Bài viết
55
Được thích
20
Chào các bạn trên diễn đàn GPE
Hiện mình đang làm bảng cân đối số phát sinh tài khoản = hàm sumproduct nên chương trình chạy khá chậm .Nhờ các bạn viết dùm code thay thế hàm sumproduct để chương trình chạy nhanh hơn (chi tiết kèm theo file).
Cám ơn các bạn.
Chúc các bạn một buổi chiều vui vẻ!!!
 

File đính kèm

  • CAN DOI.xls
    779.5 KB · Đọc: 55
Bạn tham khảo nha, code chạy khá nhanh có chậm chăng là cái đoạn tô vẽ màu mè thôi

Mã:
Sub LapCDPS()
'====SEALAND: GIAIPHAPEXCEL=====
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Dim MaxCls, Tm, Kq(), Ch(1 To 3), Tn, Dn, ID, i, j, n
Application.ScreenUpdating = False
Tm = Sheet2.Range("A4:E" & Sheet2.[A65536].End(3).Row)
Tn = Sheet3.[G2]: Dn = Sheet3.[G3]
'Dua bang MaTK va so du vao mang
For i = 1 To UBound(Tm, 1)
If Not Dic.Exists(Tm(i, 1)) Then
ID = ID + 1
Dic.Add IIf(IsNumeric(Tm(i, 1)), CStr(Tm(i, 1)), Trim(Tm(i, 1))), ID
ReDim Preserve Kq(1 To 9, 1 To ID)
Kq(1, ID) = Tm(i, 1)
Kq(2, ID) = Tm(i, 2)
Kq(3, ID) = Tm(i, 4)
Kq(4, ID) = Tm(i, 5)
Kq(9, ID) = Tm(i, 3)
If MaxCls < Tm(i, 3) Then MaxCls = Tm(i, 3)
End If
Next
'Tap hop phat sinh trong ky
'ID = 0
Tm = Sheet1.Range("D3:L" & Sheet1.[D65536].End(3).Row)
For i = 1 To UBound(Tm, 1)
If Tm(i, 1) > Tn - 1 And Tm(i, 1) < Dn + 1 Then
ID = Dic.Item(Tm(i, 7))
Kq(5, ID) = Kq(5, ID) + Tm(i, 9)
ID = Dic.Item(Tm(i, 8))
Kq(6, ID) = Kq(6, ID) + Tm(i, 9)
End If
Next
'Tinh so du
For i = 1 To UBound(Kq, 2)
Kq(7, i) = IIf(Kq(3, i) - Kq(4, i) + Kq(5, i) - Kq(6, i) > 0, Kq(3, i) - Kq(4, i) + Kq(5, i) - Kq(6, i), 0)
Kq(8, i) = IIf(Kq(4, i) - Kq(3, i) + Kq(6, i) - Kq(5, i) > 0, Kq(4, i) - Kq(3, i) + Kq(6, i) - Kq(5, i), 0)
Next
'Tong cong bao cao
ReDim Preserve Kq(1 To 9, 1 To UBound(Kq, 2) + 1)
Kq(2, UBound(Kq, 2)) = Space(30) & "Tong cong :"
For i = 1 To UBound(Kq, 2)
For j = 3 To 9
Kq(j, UBound(Kq, 2)) = Kq(j, UBound(Kq, 2)) + Kq(j, i)
Next
Next

'Tong hop cho TK me
Do
MaxCls = MaxCls - 1
If MaxCls = 0 Then Exit Do
    For i = 1 To UBound(Kq, 2)
    If Kq(9, i) = MaxCls Then
        For j = 1 To UBound(Kq, 2)
        If Kq(9, j) = MaxCls + 1 And InStr(1, Kq(1, j), Kq(1, i)) = 1 Then
            For n = 3 To 8
            Kq(n, i) = Kq(n, i) + Kq(n, j)
            Next
        End If
        Next
    End If
    Next
Loop
'Don co du lieu
j = 0
For i = 1 To UBound(Kq, 2)
If Kq(3, i) <> 0 Or Kq(4, i) <> 0 Or Kq(5, i) <> 0 Or Kq(6, i) <> 0 Then
j = j + 1
For n = 1 To 9
Kq(n, j) = Kq(n, i)
Next
Select Case Kq(9, j)
Case Is = 1
Ch(1) = Ch(1) & IIf(Ch(1) = "", "", ",") & "A" & 10 + j & ":H" & 10 + j
Case Is = 2
Ch(2) = Ch(2) & IIf(Ch(2) = "", "", ",") & "A" & 10 + j & ":H" & 10 + j
Case Else
Ch(3) = Ch(3) & IIf(Ch(3) = "", "", ",") & "A" & 10 + j & ":H" & 10 + j
End Select

End If
Next
Sheet3.[A11:H2000].Clear
Sheet3.[A11:H11].Resize(j) = WorksheetFunction.Transpose(Kq)
'Dinh dang bao cao
    With Sheet3.Range(Ch(1))
        .Font.FontStyle = "Bold"
        .Interior.ColorIndex = 37
    End With
    With Sheet3.Range(Ch(2))
        .Font.ColorIndex = 5
        .Font.FontStyle = "Bold"
        .Interior.ColorIndex = 0
    End With
   With Sheet3.Range(Ch(3))
            .Font.FontStyle = "Italic"
        .Font.ColorIndex = 53
        .Interior.ColorIndex = 0
    End With
    Sheet3.[C11].Resize(j, 6).NumberFormat = "#,##0"
    
        With Sheet3.[A11].Resize(j, 8)
        .Font.Name = "Time New Roman"
        .Borders.Weight = xlThin
        .Borders(xlInsideHorizontal).Weight = xlHairline
        End With

With Sheet3.Cells(j + 10, 1).Resize(, 8)
        .Borders.Weight = xlThin
        .Font.FontStyle = "Bold"
        .Font.ColorIndex = 2
        .Font.Size = 12
        .Interior.ColorIndex = 11
        End With
        Application.ScreenUpdating = True
        Set Dic = Nothing
End Sub
 

File đính kèm

  • CAN DOI-1.rar
    111.5 KB · Đọc: 107
Upvote 0
Cảm ơn SEALAND rất nhiều. code của bạn chạy rất nhanh tuy nhiên công thức ở dòng tổng cộng không đúng, số dư đầu kỳ chưa thay đổi theo thời gian được. Code của bạn "cao siêu" quá mình "ngâm cứu" hoài mà vẫn chưa bít cách sửa.Bạn xem giúp mình với nhé
 

File đính kèm

  • CAN DOI-1.xls
    709 KB · Đọc: 13
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử xem có được không
Yêu cầu :
- Số dư đầu kỳ bạn điền hết số dư tài khoản các cấp
- Chỉ phát sinh số dư một bên (kể cả 131,331)
- Nếu cần ẩn cột C;D;E;F thì quét chọn rồi hide và ngược lại
 

File đính kèm

  • CAN DOI-1.zip
    186.7 KB · Đọc: 36
Lần chỉnh sửa cuối:
Upvote 0
Do vội xem bóng đá không test kỹ nên có 1 chút sai sót mong thông cảm:

-Chưa cập nhật số dư đầu kỳ.
-Do cộng cả dòng Tong cong nên kết quả gấp đôi.

Bạn kiểm tra lại giùm nha

Mã:
Option Explicit
Sub LapCDPS()
'====SEALAND: GIAIPHAPEXCEL=====
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Dim MaxCls, Tm, Kq(), Ch(1 To 3), Tn, Dn, ID, i, j, n
Application.ScreenUpdating = False
Tm = Sheet2.Range("A4:E" & Sheet2.[A65536].End(3).Row)
Tn = Sheet3.[G2]: Dn = Sheet3.[G3]
'Dua bang MaTK va so du vao mang
For i = 1 To UBound(Tm, 1)
If Not Dic.Exists(Tm(i, 1)) Then
ID = ID + 1
Dic.Add IIf(IsNumeric(Tm(i, 1)), CStr(Tm(i, 1)), Trim(Tm(i, 1))), ID
ReDim Preserve Kq(1 To 9, 1 To ID)
Kq(1, ID) = Tm(i, 1)
Kq(2, ID) = Tm(i, 2)
Kq(3, ID) = Tm(i, 4)
Kq(4, ID) = Tm(i, 5)
Kq(9, ID) = Tm(i, 3)
If MaxCls < Tm(i, 3) Then MaxCls = Tm(i, 3)
End If
Next
'Tap hop phat sinh trong ky
Tm = Sheet1.Range("D3:L" & Sheet1.[D65536].End(3).Row)
For i = 1 To UBound(Tm, 1)
If Tm(i, 1) < Tn Then
ID = Dic.Item(Tm(i, 7))
Kq(3, ID) = Kq(3, ID) + Tm(i, 9)
ID = Dic.Item(Tm(i, 8))
Kq(4, ID) = Kq(4, ID) + Tm(i, 9)
ElseIf Tm(i, 1) > Tn - 1 And Tm(i, 1) < Dn + 1 Then
ID = Dic.Item(Tm(i, 7))
Kq(5, ID) = Kq(5, ID) + Tm(i, 9)
ID = Dic.Item(Tm(i, 8))
Kq(6, ID) = Kq(6, ID) + Tm(i, 9)
End If
Next
'Tinh so du
For i = 1 To UBound(Kq, 2)
Kq(7, i) = IIf(Kq(3, i) - Kq(4, i) + Kq(5, i) - Kq(6, i) > 0, Kq(3, i) - Kq(4, i) + Kq(5, i) - Kq(6, i), 0)
Kq(8, i) = IIf(Kq(4, i) - Kq(3, i) + Kq(6, i) - Kq(5, i) > 0, Kq(4, i) - Kq(3, i) + Kq(6, i) - Kq(5, i), 0)
Next
'Tong cong bao cao
ReDim Preserve Kq(1 To 9, 1 To UBound(Kq, 2) + 1)
Kq(2, UBound(Kq, 2)) = Space(30) & "Tong cong :"
For i = 1 To UBound(Kq, 2) - 1
For j = 3 To 8
Kq(j, UBound(Kq, 2)) = Kq(j, UBound(Kq, 2)) + Kq(j, i)
Next
Next

'Tong hop cho TK me
Do
MaxCls = MaxCls - 1
If MaxCls = 0 Then Exit Do
    For i = 1 To UBound(Kq, 2)
    If Kq(9, i) = MaxCls Then
        For j = 1 To UBound(Kq, 2)
        If Kq(9, j) = MaxCls + 1 And InStr(1, Kq(1, j), Kq(1, i)) = 1 Then
            For n = 3 To 8
            Kq(n, i) = Kq(n, i) + Kq(n, j)
            Next
        End If
        Next
    End If
    Next
Loop
'Don co du lieu
j = 0
For i = 1 To UBound(Kq, 2)
If Kq(3, i) <> 0 Or Kq(4, i) <> 0 Or Kq(5, i) <> 0 Or Kq(6, i) <> 0 Then
j = j + 1
For n = 1 To 9
Kq(n, j) = Kq(n, i)
Next
Select Case Kq(9, j)
Case Is = 1
Ch(1) = Ch(1) & IIf(Ch(1) = "", "", ",") & "A" & 10 + j & ":H" & 10 + j
Case Is = 2
Ch(2) = Ch(2) & IIf(Ch(2) = "", "", ",") & "A" & 10 + j & ":H" & 10 + j
Case Else
Ch(3) = Ch(3) & IIf(Ch(3) = "", "", ",") & "A" & 10 + j & ":H" & 10 + j
End Select

End If
Next
Sheet3.[A11:H2000].Clear
Sheet3.[A11:H11].Resize(j) = WorksheetFunction.Transpose(Kq)
'Dinh dang bao cao
    With Sheet3.Range(Ch(1))
        .Font.FontStyle = "Bold"
        .Interior.ColorIndex = 37
    End With
    With Sheet3.Range(Ch(2))
        .Font.ColorIndex = 5
        .Font.FontStyle = "Bold"
        .Interior.ColorIndex = 0
    End With
   With Sheet3.Range(Ch(3))
            .Font.FontStyle = "Italic"
        .Font.ColorIndex = 53
        .Interior.ColorIndex = 0
    End With
    Sheet3.[C11].Resize(j, 6).NumberFormat = "#,##0"
    
        With Sheet3.[A11].Resize(j, 8)
        .Font.Name = "Time New Roman"
        .Borders.Weight = xlThin
        .Borders(xlInsideHorizontal).Weight = xlHairline
        End With

With Sheet3.Cells(j + 10, 1).Resize(, 8)
        .Borders.Weight = xlThin
        .Font.FontStyle = "Bold"
        .Font.ColorIndex = 2
        .Font.Size = 12
        .Interior.ColorIndex = 11
        End With
        Application.ScreenUpdating = True
        Set Dic = Nothing
End Sub

Tạm thời vậy đã, sau điều chỉnh cho phần cập nhật số dư 2 bên đối với TK công nợ.
 

File đính kèm

  • CAN DOI-1.rar
    112.1 KB · Đọc: 65
Lần chỉnh sửa cuối:
Upvote 0
Do vội xem bóng đá không test kỹ nên có 1 chút sai sót mong thông cảm:

-Chưa cập nhật số dư đầu kỳ.
-Do cộng cả dòng Tong cong nên kết quả gấp đôi.

Bạn kiểm tra lại giùm nha

Mã:
Option Explicit
Sub LapCDPS()
'====SEALAND: GIAIPHAPEXCEL=====
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Dim MaxCls, Tm, Kq(), Ch(1 To 3), Tn, Dn, ID, i, j, n
Application.ScreenUpdating = False
Tm = Sheet2.Range("A4:E" & Sheet2.[A65536].End(3).Row)
Tn = Sheet3.[G2]: Dn = Sheet3.[G3]
'Dua bang MaTK va so du vao mang
For i = 1 To UBound(Tm, 1)
If Not Dic.Exists(Tm(i, 1)) Then
ID = ID + 1
Dic.Add IIf(IsNumeric(Tm(i, 1)), CStr(Tm(i, 1)), Trim(Tm(i, 1))), ID
ReDim Preserve Kq(1 To 9, 1 To ID)
Kq(1, ID) = Tm(i, 1)
Kq(2, ID) = Tm(i, 2)
Kq(3, ID) = Tm(i, 4)
Kq(4, ID) = Tm(i, 5)
Kq(9, ID) = Tm(i, 3)
If MaxCls < Tm(i, 3) Then MaxCls = Tm(i, 3)
End If
Next
'Tap hop phat sinh trong ky
Tm = Sheet1.Range("D3:L" & Sheet1.[D65536].End(3).Row)
For i = 1 To UBound(Tm, 1)
If Tm(i, 1) < Tn Then
ID = Dic.Item(Tm(i, 7))
Kq(3, ID) = Kq(3, ID) + Tm(i, 9)
ID = Dic.Item(Tm(i, 8))
Kq(4, ID) = Kq(4, ID) + Tm(i, 9)
ElseIf Tm(i, 1) > Tn - 1 And Tm(i, 1) < Dn + 1 Then
ID = Dic.Item(Tm(i, 7))
Kq(5, ID) = Kq(5, ID) + Tm(i, 9)
ID = Dic.Item(Tm(i, 8))
Kq(6, ID) = Kq(6, ID) + Tm(i, 9)
End If
Next
'Tinh so du
For i = 1 To UBound(Kq, 2)
Kq(7, i) = IIf(Kq(3, i) - Kq(4, i) + Kq(5, i) - Kq(6, i) > 0, Kq(3, i) - Kq(4, i) + Kq(5, i) - Kq(6, i), 0)
Kq(8, i) = IIf(Kq(4, i) - Kq(3, i) + Kq(6, i) - Kq(5, i) > 0, Kq(4, i) - Kq(3, i) + Kq(6, i) - Kq(5, i), 0)
Next
'Tong cong bao cao
ReDim Preserve Kq(1 To 9, 1 To UBound(Kq, 2) + 1)
Kq(2, UBound(Kq, 2)) = Space(30) & "Tong cong :"
For i = 1 To UBound(Kq, 2) - 1
For j = 3 To 8
Kq(j, UBound(Kq, 2)) = Kq(j, UBound(Kq, 2)) + Kq(j, i)
Next
Next

'Tong hop cho TK me
Do
MaxCls = MaxCls - 1
If MaxCls = 0 Then Exit Do
    For i = 1 To UBound(Kq, 2)
    If Kq(9, i) = MaxCls Then
        For j = 1 To UBound(Kq, 2)
        If Kq(9, j) = MaxCls + 1 And InStr(1, Kq(1, j), Kq(1, i)) = 1 Then
            For n = 3 To 8
            Kq(n, i) = Kq(n, i) + Kq(n, j)
            Next
        End If
        Next
    End If
    Next
Loop
'Don co du lieu
j = 0
For i = 1 To UBound(Kq, 2)
If Kq(3, i) <> 0 Or Kq(4, i) <> 0 Or Kq(5, i) <> 0 Or Kq(6, i) <> 0 Then
j = j + 1
For n = 1 To 9
Kq(n, j) = Kq(n, i)
Next
Select Case Kq(9, j)
Case Is = 1
Ch(1) = Ch(1) & IIf(Ch(1) = "", "", ",") & "A" & 10 + j & ":H" & 10 + j
Case Is = 2
Ch(2) = Ch(2) & IIf(Ch(2) = "", "", ",") & "A" & 10 + j & ":H" & 10 + j
Case Else
Ch(3) = Ch(3) & IIf(Ch(3) = "", "", ",") & "A" & 10 + j & ":H" & 10 + j
End Select

End If
Next
Sheet3.[A11:H2000].Clear
Sheet3.[A11:H11].Resize(j) = WorksheetFunction.Transpose(Kq)
'Dinh dang bao cao
    With Sheet3.Range(Ch(1))
        .Font.FontStyle = "Bold"
        .Interior.ColorIndex = 37
    End With
    With Sheet3.Range(Ch(2))
        .Font.ColorIndex = 5
        .Font.FontStyle = "Bold"
        .Interior.ColorIndex = 0
    End With
   With Sheet3.Range(Ch(3))
            .Font.FontStyle = "Italic"
        .Font.ColorIndex = 53
        .Interior.ColorIndex = 0
    End With
    Sheet3.[C11].Resize(j, 6).NumberFormat = "#,##0"
    
        With Sheet3.[A11].Resize(j, 8)
        .Font.Name = "Time New Roman"
        .Borders.Weight = xlThin
        .Borders(xlInsideHorizontal).Weight = xlHairline
        End With

With Sheet3.Cells(j + 10, 1).Resize(, 8)
        .Borders.Weight = xlThin
        .Font.FontStyle = "Bold"
        .Font.ColorIndex = 2
        .Font.Size = 12
        .Interior.ColorIndex = 11
        End With
        Application.ScreenUpdating = True
        Set Dic = Nothing
End Sub

Tạm thời vậy đã, sau điều chỉnh cho phần cập nhật số dư 2 bên đối với TK công nợ.

Cám ơn bạn đã dành thời gian để giúp mình.code chạy nhanh kinh hoàngluôn. nhưng mà ở cộtsố dư đầu kỳ vẫn chưa đúng nhờ bạn xem giúp mình với nhé (chi tiết kèm theo file).nếu điều chỉnh được cho phần cập nhật số dư 2 bên đối với TK công nợ nữa thì tuyệt vời... cám ơn bạn rất nhiều...
 

File đính kèm

  • CAN DOI-1.xls
    706.5 KB · Đọc: 18
Upvote 0
-Đã Đ/c code tập hợp số dư đầu kỳ kỹ hơn.
-Đã Đ/chỉnh số dư 2 bên đối với TK 131,331 (Mình tạm tách tại bảng mã đối với TK 331 vì TK này cần thêm chi tiết. Nếu cần thiết bạn bổ xung cho TK 138,338)

Bạn kiểm tra lại giùm nha, soát dữ liệu nhiều ngại quá.


Dữ liệu của bạn có vấn đề 1 chút:
-Tại 1 số thời điểm TK tiền gửi của bạn dư có?
-Đáng lẽ bạn chỉ cần để 2 cột chi tiết Nợ và chi tiết Có là đủ trong khi bạn để 131: 2 cột, 331: 2 cột . Rồi đây 138, 338, 311 v.v... lại cứ mỗi TK lại phải thêm 2 cột nữa hay sao???
 

File đính kèm

  • CAN DOI-2.rar
    112.8 KB · Đọc: 161
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn rất nhiều. để mình text kỹ lại, nhưng mà ý tưởng đưa chi tiết công nợ vào nhìn bảng tính hơi "rối " nhỉ nếu có 100 nhà cung cấp, 100 khách hàng thì bảng tính rất dài, có lẽ công nợ chúng ta nên làm bảng tổng hợp riêng, trên bảng phát sinh tk nên thể hiện số tổng hợp thì bảng tính nhìn đẹp hơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Thích thì để, không thích thì xóa có sao đâu. Nhưng danh mục và phát sinh thì buộc phải có chi tiết mới biết ai dư nợ ai du có mà tổng hợp chứ.
 
Upvote 0
Thích thì để, không thích thì xóa có sao đâu. Nhưng danh mục và phát sinh thì buộc phải có chi tiết mới biết ai dư nợ ai du có mà tổng hợp chứ.
Cám ơn ban nhiều...code của bạn hoàn hảo rùi,tốc độ thì khỏi chê. Vấn đề công nợ mình sẽ ngâm cứu tiếp.
 
Upvote 0
[QUOTEdaigai;ình454]Mình laị hấy bỏ hẳn các cột 131 , 331, 154 đi thì đỡ rối mắt hơn và nhập liệu đỡ mất công hơn-\\/.-\\/.
- Một là thêm 2 cột chi tiết nợ chi tiết có và bạn tạo thêm các danh mục tương ứng
Hai là ko cần côt chi tiết nào cả lợi dụng luôn cái danh mục tài khoản mà mở thêm tài khoản con . Ví dụ bạn theo dõi chi tiết cho công ty A thì tạo thêm 13110A001, đâu ai cấm bạn làm điều ấy,Sợ tên dài quá khó quản thì search diễn đàn mấy cái combo box vs listbox thông minh, giữ quy tắc tài khoản cấp 1 thì 3 ký tự số , 2 thì 4 và 3 thì 5 ký tự. Theo cách này thì bạn sẽ thấy đc cái lợi của bảng cdps có đối tượng chi tiết[/QUOTE]
Cám ơn ban. Minh se nghiên cưu thu cach cua ban
 
Upvote 0
em muốn dùng code của file trên mà chỉnh sửa mãi mà không được. do form nhập liệu của em có khác đôi chút. chỗ mã khách hàng em để chung vào cột định khoản, chỉ là khi lên bảng cân đối phát sinh sẽ không có chi tiết nhưng khách hàng này mà em sẽ chuyển sang bảng tổng hợp công nợ để tiện theo dõi. nhờ các bác giúp em với ạ.
 

File đính kèm

  • CDPS.xlsm
    46.7 KB · Đọc: 7
Upvote 0
em có sử dụng mã và đã áp dụng được vào file của minh. nhưng do danh mục khách hàng nhiều. em muốn tách riêng ra một sheet để quản lý riêng nhưng không biết làm thế nào. nhờ các bác có thể tách giúp em với được không ạ!
 

File đính kèm

  • PMKT_CDPS.xlsm
    227.6 KB · Đọc: 21
Upvote 0
Code trên xử lý khi dữ liệu rỗng thế nào ae nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom