Untitled

 avatar
Greg
plain_text
6 months ago
8.1 kB
4
Indexable
Sub UpdateLedgersWithValues()
    Dim reconWorkbook As Workbook
    Dim editedOutputWorkbook As Workbook
    Dim accountsSheet As Worksheet
    Dim ledgersSheet As Worksheet
    Dim pasteSheet As Worksheet
    Dim folderPath As String
    Dim folderName As String
    Dim editedOutputFilename As String
    Dim accountRow As Range
    Dim lastCol As Long
    Dim accountCell As Range
    Dim fundNumber As String
    Dim cusip As String
    Dim rValue As Variant
    Dim pasteRange As Range
    Dim lastRow As Long
    Dim yValues As Collection
    Dim zValues As Collection
    Dim i As Long

    ' Set folder path and extract folder name
    folderPath = ThisWorkbook.Path & "\"
    folderName = Mid(ThisWorkbook.Path, InStrRev(ThisWorkbook.Path, "\") + 1)

    ' Construct the edited output filename
    editedOutputFilename = folderPath & folderName & ".SS Daily Cash Transactions_Edited_Output.xlsx"

    ' Open the Edited Output workbook
    Set editedOutputWorkbook = Workbooks.Open(editedOutputFilename)
    Set accountsSheet = ThisWorkbook.Sheets("accounts")
    Set ledgersSheet = ThisWorkbook.Sheets("ledgers")
    Set pasteSheet = editedOutputWorkbook.Sheets("SS holdings-paste from SS file")

    ' Find the last column in Row 1 of the ledgers sheet
    lastCol = ledgersSheet.Cells(1, ledgersSheet.Columns.Count).End(xlToLeft).Column

    ' Loop through each account in Row 1
    For Each accountCell In ledgersSheet.Range("B1:" & ledgersSheet.Cells(1, lastCol).Address)
        If accountCell.Value <> "" Then
            ' Find account in the accounts sheet
            Set accountRow = accountsSheet.Columns("B").Find(What:=accountCell.Value, LookIn:=xlValues, LookAt:=xlWhole)

            If Not accountRow Is Nothing Then
                fundNumber = accountRow.Offset(0, -1).Value ' Column A
                cusip = accountRow.Offset(0, 1).Value ' Column C
                
                ' Debugging: Output fund number and CUSIP
                Debug.Print "Fund Number: " & fundNumber & ", CUSIP: " & cusip

                ' Find the row in the Paste SS Transactions sheet
                lastRow = pasteSheet.Cells(pasteSheet.Rows.Count, 1).End(xlUp).Row
                Set pasteRange = pasteSheet.Range("A1:R" & lastRow)

                ' Logic to collect invested cash amounts for row 2
                Set accountRow = pasteRange.Find(What:=fundNumber, LookIn:=xlValues, LookAt:=xlWhole)
                If Not accountRow Is Nothing Then
                    If accountRow.Offset(0, 10).Value = cusip Then ' Column K
                        If Not IsError(accountRow.Offset(0, 17).Value) Then ' Column R
                            rValue = accountRow.Offset(0, 17).Value ' Column R
                            ledgersSheet.Cells(2, accountCell.Column).Value = rValue
                            Debug.Print "Row 2 R Value: " & rValue
                        Else
                            ledgersSheet.Cells(2, accountCell.Column).Value = "Error"
                            Debug.Print "Error in Row 2 R Value for Fund Number: " & fundNumber
                        End If
                    End If
                End If

                ' Logic to collect uninvested cash amounts for row 3
                Set yValues = New Collection
                Set zValues = New Collection
                
                ' Iterate over each row in the Paste SS Transactions sheet
                For i = 2 To lastRow ' Assuming row 1 is headers
                    If pasteRange.Cells(i, 1).Value = fundNumber And _
                       Right(pasteRange.Cells(i, 6).Value, 4) = "/000" And _
                       pasteRange.Cells(i, 7).Value = "US DOLLAR" Then ' Columns F and G

                        If Not IsEmpty(pasteRange.Cells(i, 25).Value) Then ' Column Y
                            yValues.Add pasteRange.Cells(i, 25).Value
                        ElseIf Not IsEmpty(pasteRange.Cells(i, 26).Value) Then ' Column Z
                            zValues.Add -pasteRange.Cells(i, 26).Value ' Treat Z as negative
                        End If
                    End If
                Next i

                ' Determine the most common Y value if available
                If yValues.Count > 0 Then
                    rValue = GetMostCommonValue(yValues)
                ElseIf zValues.Count > 0 Then
                    rValue = GetMostCommonValue(zValues)
                Else
                    rValue = 0 ' No values found
                End If

                ' Assign uninvested cash value to row 3
                ledgersSheet.Cells(3, accountCell.Column).Value = rValue

                ' Logic to collect portia values for row 8
                Set accountRow = accountsSheet.Columns("B").Find(What:=accountCell.Value, LookIn:=xlValues, LookAt:=xlWhole)
                If Not accountRow Is Nothing Then
                    fundNumber = accountRow.Offset(0, -1).Value ' Column A
                    
                    ' Open the Portia Settled Cash Balances workbook
                    Dim portiaFilename As String
                    portiaFilename = folderPath & folderName & ".Portia Settled Cash Balances.xlsx"
                    Dim portiaWorkbook As Workbook
                    Set portiaWorkbook = Workbooks.Open(portiaFilename)
                    Dim portiaSheet As Worksheet
                    Set portiaSheet = portiaWorkbook.Sheets("prior day settled cash")

                    ' Find the last row in the Portia sheet
                    lastRow = portiaSheet.Cells(portiaSheet.Rows.Count, 1).End(xlUp).Row
                    Set pasteRange = portiaSheet.Range("A1:C" & lastRow)

                    ' Find portia value
                    Set accountRow = pasteRange.Find(What:=fundNumber, LookIn:=xlValues, LookAt:=xlWhole)
                    If Not accountRow Is Nothing Then
                        If accountRow.Offset(0, 1).Value = "-CASH-" Then ' Column B
                            rValue = accountRow.Offset(0, 2).Value ' Column C
                            ledgersSheet.Cells(8, accountCell.Column).Value = rValue
                            Debug.Print "Row 8 Portia Value: " & rValue
                        End If
                    End If
                    
                    ' Close the Portia workbook
                    portiaWorkbook.Close SaveChanges:=False
                End If
            Else
                Debug.Print "Account not found for: " & accountCell.Value
            End If
        End If
    Next accountCell

    ' Sum values for rows 2 and 3 into row 4
    For accountCell In ledgersSheet.Range("B1:" & ledgersSheet.Cells(1, lastCol).Address)
        If accountCell.Value <> "" Then
            Dim row2Value As Variant
            Dim row3Value As Variant
            
            row2Value = ledgersSheet.Cells(2, accountCell.Column).Value
            row3Value = ledgersSheet.Cells(3, accountCell.Column).Value
            
            ' Handle blanks as 0
            If IsEmpty(row2Value) Then row2Value = 0
            If IsEmpty(row3Value) Then row3Value = 0
            
            ledgersSheet.Cells(4, accountCell.Column).Value = row2Value + row3Value
        End If
    Next accountCell

    ' Close the Edited Output workbook
    editedOutputWorkbook.Close SaveChanges:=False

    MsgBox "Ledgers updated successfully!"
End Sub

Function GetMostCommonValue(col As Collection) As Variant
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
    Dim item As Variant
    
    ' Count occurrences of each item
    For Each item In col
        If dict.Exists(item) Then
            dict(item) = dict(item) + 1
        Else
            dict.Add item, 1
        End If
    Next item
    
    ' Find the most common item
    Dim mostCommonValue As Variant
    Dim maxCount As Long
    maxCount = 0
    
    For Each item In dict.Keys
        If dict(item) > maxCount Then
            mostCommonValue = item
            maxCount = dict(item)
        End If
    Next item
    
    GetMostCommonValue = mostCommonValue
End Function
Editor is loading...
Leave a Comment