मैं एक अकाउंटिंग वीबीए प्रोग्राम पर काम कर रहा हूं जो एक लेजर में जर्नल प्रविष्टियां पोस्ट करेगा, और फिर ट्रायल बैलेंस उत्पन्न करेगा (यानी लेजर में "बाल" के बाद एक नई शीट पर मूल्यों को प्रिंट करें)। ऐसा करने के लिए, मुझे एक चर या संग्रह के लिए संतुलन कोशिकाओं के संख्यात्मक भाग को असाइन करने का एक तरीका चाहिए। दुर्भाग्य से, जब मैं Debug.Print का उपयोग करता हूं तो मैं देखता हूं कि संग्रहीत एकमात्र मान 0 है (मैं केवल सामान्य स्टॉक के साथ परीक्षण कर रहा हूं)। मेरी अभिव्यक्ति है: y = Application.Evaluate("=SUM(R[-" & x & "]C:R[-1]C)-SUM(R[-" & x & "]C[1]:R[-1]C[1])") जहां y सामान्य स्टॉक के संतुलन का प्रतिनिधित्व करता है। मैं एक वैरिएबल में बैलेंस वैल्यू को ठीक से कैसे स्टोर करूं?

Screen Recording

' TODO BE ABLE TO RUN MULTIPLE TIMES
' CHECK FOR POSTED MARK & START WRITING WHEN
' r = "one of the keys", or just creates new Ledger Worksheet every time

Sub MacCompileData()
Application.ScreenUpdating = False
Dim lastRow As Long, x As Long
Dim data, Key
Dim r As Range
Dim cLedger As Collection, cList As Collection
Set cLedger = New Collection

With Worksheets("Journal")
    lastRow = .Range("B" & .Rows.Count).End(xlUp).Row

    For x = 2 To lastRow
        Key = Trim(.Cells(x, 2))
        On Error Resume Next
        Set cList = cLedger(Key)
        If Err.Number <> 0 Then
            Set cList = New Collection
            cLedger.Add cList, Key
        End If
        On Error GoTo 0

        cLedger(Key).Add Array(.Cells(x, 1).Value, .Cells(x, 3).Value, .Cells(x, 4).Value)
        Worksheets("Journal").Cells(x, 5).Value = ChrW(&H2713)

    Next
End With

With Worksheets("Ledger")

    Dim IsLiability As Boolean
    Dim y As Integer

    For Each r In .Range("A1", .Range("A" & .Rows.Count).End(xlUp))

        If r <> "" Then

        On Error Resume Next
        Key = Trim(r.Text)

        If Key = "LIABILITIES" Then
            IsLiability = True
        End If

        data = getLedgerArray(cLedger(Key))

        If Err.Number = 0 Then
            Set list = cLedger(Key)
            x = cLedger(Key).Count
            With r.Offset(2).Resize(x, 3)
                .Insert Shift:=xlDown, CopyOrigin:=r.Offset(1)
                .Offset(-x).Value = data

                If IsLiability Then
                    .Offset(0, 2).Resize(1, 1).FormulaR1C1 = "=""Bal. "" & TEXT(SUM(R[-" & x & "]C:R[-1]C)-SUM(R[-" & x & "]C[1]:R[-1]C[1]),""$#,###"")"

                    ' LOOK HERE FOR Y
                    y = Application.Evaluate("=SUM(R[-" & x & "]C:R[-1]C)-SUM(R[-" & x & "]C[1]:R[-1]C[1])")

                    Debug.Print "Common Stock Balance Equals "; y

                Else
                    .Offset(0, 1).Resize(1, 1).FormulaR1C1 = "=""Bal. "" & TEXT(SUM(R[-" & x & "]C:R[-1]C)-SUM(R[-" & x & "]C[1]:R[-1]C[1]),""$#,###"")"
                End If


                r.Offset(1).EntireRow.Delete
            End With
        End If

        On Error GoTo 0
        End If
    Next

End With
Application.ScreenUpdating = True

End Sub

Function getLedgerArray(c As Collection)
Dim data
Dim x As Long
ReDim data(1 To c.Count, 1 To 3)

For x = 1 To c.Count
    data(x, 1) = c(x)(0)
    data(x, 2) = c(x)(1)
    data(x, 3) = c(x)(2)
Next
getLedgerArray = data
End Function
0
cpage 22 अक्टूबर 2016, 18:41

1 उत्तर

सबसे बढ़िया उत्तर

यहां एक समाधान है जिसे मैं समझने में सक्षम था, हालांकि मुझे यकीन नहीं है कि यह सबसे कुशल है या नहीं। सूत्र के सेट होने से पहले, मैं उस कक्ष में Range नाम का BalanceCell सेट करता हूं जहां सूत्र लिखा जाएगा। मैंने तब Mid फ़ंक्शन का उपयोग सेल से स्ट्रिंग संख्या मान प्राप्त करने के लिए किया था (क्योंकि "बाल" की लंबाई हमेशा 5 वर्ण होती है) सूत्र को BalanceCell में डालने के बाद।

If IsLiability Then
                    Set BalanceCell = .Offset(0, 2).Resize(1, 1)
                    BalanceCell.FormulaR1C1 = "=""Bal. "" & TEXT(SUM(R[-" & x & "]C:R[-1]C)-SUM(R[-" & x & "]C[1]:R[-1]C[1]),""$#,###"")"

                    y = Mid(BalanceCell.Value, 6, Len(BalanceCell.Value))

                    Debug.Print "Common Stock Balance is "; y

ScreenRecording

0
cpage 22 अक्टूबर 2016, 20:20