Untitled

 avatar
Greg
plain_text
6 months ago
12 kB
3
Indexable
Sub UpdateLedgersWithValues()
    Dim reconWorkbook As Workbook
    Dim editedOutputWorkbook As Workbook
    Dim accountsSheet As Worksheet
    Dim ledgersSheet As Worksheet
    Dim pasteSheet As Worksheet
    Dim ssTransactionsSheet As Worksheet
    Dim portiaWorkbook As Workbook
    Dim folderPath As String
    Dim folderName As String
    Dim editedOutputFilename As String
    Dim portiaFilename As String
    Dim accountRow As Range
    Dim foundRow As Range
    Dim firstAddress As String
    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 matchFound As Boolean
    Dim cashValues As Collection
    Dim valueCount As Object
    Dim uninvestedCash As Variant
    Dim maxCount As Long
    Dim mostCommonValue As Variant
    Dim columnYValue As Double
    Dim columnZValue As Double
    Dim portiaValue As Variant
    
    ' 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"
    
    ' Construct the Portia filename
    portiaFilename = folderPath & folderName & ".Portia Settled Cash Balances.xlsx"

    ' Open the Edited Output workbook
    Set editedOutputWorkbook = Workbooks.Open(editedOutputFilename)
    Set accountsSheet = ThisWorkbook.Sheets("accounts")
    
    ' Check if the "ledgers" sheet exists
    On Error Resume Next
    Set ledgersSheet = ThisWorkbook.Sheets("ledgers")
    On Error GoTo 0
    
    If ledgersSheet Is Nothing Then
        MsgBox "The 'ledgers' sheet was not found!", vbCritical
        Exit Sub
    End If
    
    Set pasteSheet = editedOutputWorkbook.Sheets("SS holdings-paste from SS file")
    Set ssTransactionsSheet = editedOutputWorkbook.Sheets("Paste SS Transactions")

    ' 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 = CStr(accountRow.Offset(0, -1).Value) ' Column A, ensure it's a string
                cusip = CStr(accountRow.Offset(0, 1).Value) ' Column C, ensure it's a string
                
                ' Debugging: Output fund number
                Debug.Print "Fund Number: " & fundNumber

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

                ' Initialize the search for FundName in the Paste SS Transactions sheet
                Set foundRow = pasteRange.Find(What:=fundNumber, LookIn:=xlValues, LookAt:=xlWhole)
                
                matchFound = False ' Reset match flag for each account

                If Not foundRow Is Nothing Then
                    firstAddress = foundRow.Address ' Remember the first match to avoid looping endlessly

                    ' Loop through all matches of the FundNumber for invested cash
                    Do
                        If foundRow.Offset(0, 10).Value = cusip Then ' Column K for CUSIP
                            If Not IsError(foundRow.Offset(0, 17).Value) Then ' Column R for invested cash
                                rValue = foundRow.Offset(0, 17).Value ' Column R is the 18th column from A
                                ledgersSheet.Cells(2, accountCell.Column).Value = rValue
                                matchFound = True
                                
                                ' Debugging: Output the retrieved R value
                                Debug.Print "Invested Cash R Value: " & rValue
                            Else
                                ' Handle the error case
                                ledgersSheet.Cells(2, accountCell.Column).Value = "Error"
                                Debug.Print "Error in Invested Cash for Fund Number: " & fundNumber
                            End If
                        End If
                        
                        ' Continue searching for the next occurrence of the FundNumber
                        Set foundRow = pasteRange.FindNext(foundRow)
                    Loop While Not foundRow Is Nothing And foundRow.Address <> firstAddress
                End If
                
                If Not matchFound Then
                    ledgersSheet.Cells(2, accountCell.Column).Value = ""
                End If

                ' Reset for uninvested cash calculation
                Set foundRow = Nothing
                matchFound = False 
                Set cashValues = New Collection 

                ' Find the row in the Paste SS Transactions sheet for cash (without CUSIP matching)
                lastRow = ssTransactionsSheet.Cells(ssTransactionsSheet.Rows.Count, 1).End(xlUp).Row
                Set pasteRange = ssTransactionsSheet.Range("A1:Y" & lastRow)

                ' Initialize the search for FundName in the Paste SS Transactions sheet
                Set foundRow = pasteRange.Find(What:=fundNumber, LookIn:=xlValues, LookAt:=xlWhole)
                
                If Not foundRow Is Nothing Then
                    firstAddress = foundRow.Address ' Remember the first match to avoid looping endlessly

                    ' Loop through all matches of the FundNumber
                    Do
                        ' Ensure Column F ends with "/000" and Column G is "US DOLLAR"
                        If Right(CStr(foundRow.Offset(0, 5).Value), 4) = "/000" And CStr(foundRow.Offset(0, 6).Value) = "US DOLLAR" Then
                            
                            ' Handle blanks by assigning 0 if the cell is empty
                            If IsEmpty(foundRow.Offset(0, 24).Value) Then
                                columnYValue = 0
                            Else
                                columnYValue = foundRow.Offset(0, 24).Value
                            End If

                            If IsEmpty(foundRow.Offset(0, 25).Value) Then
                                columnZValue = 0
                            Else
                                columnZValue = foundRow.Offset(0, 25).Value
                            End If

                            ' Debugging: Output the values found
                            Debug.Print "Found FundNumber: " & fundNumber & " | Y: " & columnYValue & " | Z: " & columnZValue

                            ' Add Y value to the collection unless it's 0; if Y is 0, add negative Z
                            If columnYValue > 0 Then
                                cashValues.Add columnYValue
                            Else
                                cashValues.Add -columnZValue
                            End If
                            matchFound = True
                        End If
                        
                        ' Continue searching for the next occurrence of the FundNumber
                        Set foundRow = pasteRange.FindNext(foundRow)
                    Loop While Not foundRow Is Nothing And foundRow.Address <> firstAddress
                End If
                
                ' Debugging: Output how many values were found
                Debug.Print "Number of matches for FundNumber " & fundNumber & ": " & cashValues.Count

                ' If matches were found, calculate the most common value from Column Y
                If matchFound And cashValues.Count > 0 Then
                    Set valueCount = CreateObject("Scripting.Dictionary")
                    
                    ' Count occurrences of each cash value
                    For Each uninvestedCash In cashValues
                        If valueCount.Exists(uninvestedCash) Then
                            valueCount(uninvestedCash) = valueCount(uninvestedCash) + 1
                        Else
                            valueCount.Add uninvestedCash, 1
                        End If
                    Next uninvestedCash
                    
                    ' Find the most common cash value
                    maxCount = 0
                    For Each uninvestedCash In valueCount.Keys
                        If valueCount(uninvestedCash) > maxCount Then
                            maxCount = valueCount(uninvestedCash)
                            mostCommonValue = uninvestedCash
                        End If
                    Next uninvestedCash
                    
                    ' Set the most common value in Row 3 of the ledgers sheet
                    ledgersSheet.Cells(3, accountCell.Column).Value = mostCommonValue
                    
                    ' Debugging: Output the most common uninvested cash value
                    Debug.Print "Most Common Uninvested Cash: " & mostCommonValue
                Else
                    ' If no match was found, leave the cell blank
                    ledgersSheet.Cells(3, accountCell.Column).Value = ""
                    Debug.Print "No valid cash values found for FundNumber: " & fundNumber
                End If

                ' If invested and uninvested cash are found, sum them in row 4
                Dim valueRow2 As Variant
                Dim valueRow3 As Variant

                valueRow2 = ledgersSheet.Cells(2, accountCell.Column).Value
                valueRow3 = ledgersSheet.Cells(3, accountCell.Column).Value

                If IsNumeric(valueRow2) And IsNumeric(valueRow3) Then
                    ledgersSheet.Cells(4, accountCell.Column).Value = valueRow2 + valueRow3
                Else
                    ledgersSheet.Cells(4, accountCell.Column).Value = "N/A" ' Handle cases where values are not numeric
                End If

                ' Retrieve balance from the Portia workbook for row 8
                On Error Resume Next
                Set portiaWorkbook = Workbooks.Open(portiaFilename, ReadOnly:=True)
                On Error GoTo 0
                
                If Not portiaWorkbook Is Nothing Then
                    Dim portiaSheet As Worksheet
                    Set portiaSheet = portiaWorkbook.Sheets(1) ' Adjust the sheet index as necessary

                    ' Assuming the balance is in Column C and we're matching with Column A
                    lastRow = portiaSheet.Cells(portiaSheet.Rows.Count, 1).End(xlUp).Row
                    Set foundRow = portiaSheet.Range("A1:A" & lastRow).Find(What:=accountCell.Value, LookIn:=xlValues, LookAt:=xlWhole)

                    If Not foundRow Is Nothing Then
                        portiaValue = foundRow.Offset(0, 2).Value ' Column C
                        ledgersSheet.Cells(8, accountCell.Column).Value = portiaValue
                        Debug.Print "Portia Balance for " & accountCell.Value & ": " & portiaValue
                    Else
                        ledgersSheet.Cells(8, accountCell.Column).Value = "N/A" ' No match found
                        Debug.Print "No matching account in Portia for: " & accountCell.Value
                    End If
                    
                    portiaWorkbook.Close False
                Else
                    MsgBox "Failed to open the Portia workbook!", vbCritical
                End If
            End If
        End If
    Next accountCell

    ' Save and close the edited output workbook
    editedOutputWorkbook.Save
    editedOutputWorkbook.Close

    MsgBox "Update complete!", vbInformation
End Sub
Editor is loading...
Leave a Comment