Untitled
Greg
plain_text
a year ago
11 kB
5
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 folderPath As String
Dim folderName As String
Dim editedOutputFilename 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 portiaWorkbook As Workbook
Dim portiaSheet As Worksheet
Dim portiaLastRow As Long
Dim portiaFoundRow As Range
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"
' 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 Not IsNumeric(valueRow2) Then valueRow2 = 0
If Not IsNumeric(valueRow3) Then valueRow3 = 0
' Calculate total in row 4
ledgersSheet.Cells(4, accountCell.Column).Value = valueRow2 + valueRow3
' Debugging: Output the total in Row 4
Debug.Print "Total Cash in Row 4: " & ledgersSheet.Cells(4, accountCell.Column).Value
End If
End If
Next accountCell
' Close the edited output workbook without saving changes
editedOutputWorkbook.Close SaveChanges:=False
' Debugging: Notify completion
Debug.Print "UpdateLedgersWithValues completed successfully!"
End Sub
Editor is loading...
Leave a Comment