Hello,
I am working on a non-profit accounting program - and my last bit was to create a list of year end adjustments to close (zero) income and expense accounts with the balance going to Retained Earnings. What follows is the method I used, but it is somewhat slow... perhaps 2 lines on the General Ledger (GL) per second. I am wondering if there is a faster method?
On my Chart of Accounts (CoA) I have a year-to-date total of debits and credits for each budget area. I use the Filter command to find all debits in the GL, and the same line subtracts all credits found in the GL. The HidStartLYr and HidEndLYr come from a hidden sheet that defines the society's start and end fiscal period.
So for the VBA, I chose to find all Budget Areas (for all rows within the CoA Table) where the account type is "Income" or "Expense", where the Account Status is "Active", and the Total of the account at year end is not zero. The VBA then saves those items in the GL using Global variables defined for saving entries to the GL. The total difference at the end is put to Retained Earnings.dynamic formula in last column of the CoA - [Note: Budget Area is a column in that Table]: =SUM(FILTER(TableGL[Debit],(TableGL[Budget Area]=[@[Budget Area]])*(TableGL[Date]>=HidStartLYr)*(TableGL[Date]<=HidEndLYr),0))-SUM(FILTER(TableGL[Credit],(TableGL[Budget Area]=[@[Budget Area]])*(TableGL[Date]>=HidStartLYr)*(TableGL[Date]<=HidEndLYr),0))
Here is the code if you can make sense of it.
Thanks for any pointers on how to speed this up. I only had about 20 items - but some saves could be much longer if there are 100 or more entries.Sub DoYearEnd() Dim wks As Worksheet, wkGL Set wks = Sheet1 'CoA sheet Set wkGL = Sheet5 'GL sheet Dim rw As ListRow Dim rwGL As ListObject Set rwGL = wkGL.ListObjects("TableGL") Dim cl As Range Dim myType As String, myActive Dim myTBal As Double, myTotal Dim LastRwGL As Integer GLTNo = Application.WorksheetFunction.Max(Range("GLTransNo")) + 1 'use the next available Transaction No for all entries for this Year End Adjustment GLIt = "Year End Adjustments" 'set Global variable for Item for all entries in Transaction GLDt = Range("HidEndLYr").Value 'set Global variable for Date for all entries in Transaction For Each rw In wks.ListObjects("Table18").ListRows 'Loop through all rows of Table18 (CoA table. (I just noticed I didn't set this as a ListObject) myType = wks.Cells(rw.Range.Row, Range("CATypeCol").Column).Value myActive = wks.Cells(rw.Range.Row, Range("CAActiveCol").Column).Value If myType = "Income" Or myType = "Expense" And myActive = "Yes" Then 'check for type to be income or expense and account to be active. if so then... GLBA = wks.Cells(rw.Range.Row, Range("CAAcctCol").Column).Value 'set that lines Global var. for Budget Area myTBal = wks.Cells(rw.Range.Row, Range("CATrialBalCol").Column).Value 'set that lines Global var. for the total year end balance If myTBal < 0 Then GLDr = -myTBal: GLCr = Empty 'if the balance is negative then it is a credit balance and must be a debit to zero If myTBal > 0 Then GLCr = myTBal: GLDr = Empty 'if balance is positive then it is a debit balance and must be a credit to zero If myTBal = 0 Then GoTo JmpOver 'if balance is zero, then there is no need to zero, so jump the next line GoSub SaveYEData 'send to SaveYEData Subroutine that writes to Gen Ledger End If JmpOver: Next rw 'get next row of CoA 'Next line formula: After all row entries, get difference of Debit and Credit totals of GL and write to Retained Earnings myTotal = Sheet5.ListObjects("TableGL").TotalsRowRange(Sheet5.ListObjects("TableGL").ListColumns("Debit").Index).Value - _ Sheet5.ListObjects("TableGL").TotalsRowRange(Sheet5.ListObjects("TableGL").ListColumns("Credit").Index).Value If myTotal > 0 Then GLDr = myTotal: GLCr = 0 Else: GLCr = myTotal: GLDr = 0 End If GLBA = "Retained Earnings" GoSub SaveYEData Set wks = Nothing Set wkGL = Nothing Set rwGL = Nothing Exit Sub SaveYEData: 'Save to GJ rwGL.ListRows.Add 'Add new row LastRwGL = rwGL.ListRows.Count + wkGL.Range("GLTNo").Row - 1 'Get last row (LastRwGL) for use in saving next lines If GLTNo <> "" Then Cells(LastRwGL, Range("GLTNo").Column) = GLTNo 'Save Transaction No If Not IsEmpty(GLDt) Then Cells(LastRwGL, Range("GLDt").Column) = GLDt 'Save Date If GLBA <> "" Then Cells(LastRwGL, Range("GLBA").Column) = GLBA 'Save Budget Area If GLIt <> "" Then Cells(LastRwGL, Range("GLIt").Column) = GLIt 'Save Item If Not IsEmpty(GLDr) Then Cells(LastRwGL, Range("GLDr").Column) = GLDr 'If applicable save Debit amount If Not IsEmpty(GLCr) Then Cells(LastRwGL, Range("GLCr").Column) = GLCr 'If applicable save Credit amount Return 'Return from subroutine End Sub
Gary J




Reply With Quote