Untitled
Greg
plain_text
5 months ago
8.9 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 portiaWorkbook As Workbook Dim portiaSheet As Worksheet Dim folderPath As String Dim folderName As String Dim editedOutputFilename As String Dim portiaFilename As String Dim accountCell As Range Dim lastCol As Long Dim fundNumber As String Dim cusip As String Dim rValue As Variant Dim pasteRange As Range Dim lastRow As Long Dim foundRow As Range Dim firstAddress As String Dim portiaValue As Variant Dim accountRow As Range Dim yValues As Collection Dim zValues As Collection Dim value As Variant Dim maxCount As Long Dim mostCommonValue As Variant Dim dict As Object 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") ' Open the Portia workbook portiaFilename = folderPath & folderName & ".Portia Settled Cash Balances.xlsx" On Error Resume Next Set portiaWorkbook = Workbooks.Open(portiaFilename) On Error GoTo 0 If portiaWorkbook Is Nothing Then MsgBox "The Portia Settled Cash Balances file was not found!", vbCritical Exit Sub End If Set portiaSheet = portiaWorkbook.Sheets("prior day settled cash") ' 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 ' Update Row 2 (Invested Cash) lastRow = pasteSheet.Cells(pasteSheet.Rows.Count, 1).End(xlUp).Row Set pasteRange = pasteSheet.Range("A1:R" & lastRow) Set foundRow = pasteRange.Find(What:=fundNumber, LookIn:=xlValues, LookAt:=xlWhole) If Not foundRow Is Nothing Then ' Get values for invested cash from pasteSheet If foundRow.Offset(0, 10).Value = cusip Then ' Column K If Not IsError(foundRow.Offset(0, 17).Value) Then ' Column R rValue = foundRow.Offset(0, 17).Value ledgersSheet.Cells(2, accountCell.Column).Value = rValue Debug.Print "Row 2 - R Value: " & rValue Else ledgersSheet.Cells(2, accountCell.Column).Value = "Error" Debug.Print "Row 2 - Error in R Value for Fund Number: " & fundNumber End If Else Debug.Print "Row 2 - CUSIP mismatch for Fund Number: " & fundNumber End If Else Debug.Print "Row 2 - Fund Number not found in Paste Sheet: " & fundNumber End If ' Initialize collections for Y and Z values Set yValues = New Collection Set zValues = New Collection ' Update Row 3 (Uninvested Cash) lastRow = pasteSheet.Cells(pasteSheet.Rows.Count, 1).End(xlUp).Row Set pasteRange = pasteSheet.Range("A1:R" & lastRow) Set foundRow = pasteRange.Find(What:=fundNumber, LookIn:=xlValues, LookAt:=xlWhole) If Not foundRow Is Nothing Then firstAddress = foundRow.Address Do ' Check the conditions for Y and Z values If Right(foundRow.Offset(0, 5).Value, 4) = "/000" And foundRow.Offset(0, 6).Value = "US DOLLAR" Then If IsNumeric(foundRow.Offset(0, 24).Value) And Not IsEmpty(foundRow.Offset(0, 24).Value) Then yValues.Add foundRow.Offset(0, 24).Value ' Add Column Y ElseIf IsNumeric(foundRow.Offset(0, 25).Value) And Not IsEmpty(foundRow.Offset(0, 25).Value) Then zValues.Add -foundRow.Offset(0, 25).Value ' Add Column Z as negative End If End If Set foundRow = pasteRange.FindNext(foundRow) Loop While Not foundRow Is Nothing And foundRow.Address <> firstAddress End If ' Calculate the most common value for Row 3 If yValues.Count > 0 Then Set dict = CreateObject("Scripting.Dictionary") For Each value In yValues If Not dict.Exists(value) Then dict(value) = 1 Else dict(value) = dict(value) + 1 End If Next value ' Find the most common value for Y For Each value In dict.Keys If dict(value) > maxCount Then maxCount = dict(value) mostCommonValue = value End If Next value ledgersSheet.Cells(3, accountCell.Column).Value = mostCommonValue ElseIf zValues.Count > 0 Then ' If no valid Y values, check Z values Set dict = CreateObject("Scripting.Dictionary") For Each value In zValues If Not dict.Exists(value) Then dict(value) = 1 Else dict(value) = dict(value) + 1 End If Next value ' Find the most common value for Z maxCount = 0 For Each value In dict.Keys If dict(value) > maxCount Then maxCount = dict(value) mostCommonValue = value End If Next value ledgersSheet.Cells(3, accountCell.Column).Value = mostCommonValue Else ledgersSheet.Cells(3, accountCell.Column).Value = 0 ' Default to 0 if no matches End If ' Update Row 8 (Portia Values) lastRow = portiaSheet.Cells(portiaSheet.Rows.Count, 1).End(xlUp).Row Set foundRow = portiaSheet.Range("A1:C" & lastRow).Find(What:=accountCell.Value, LookIn:=xlValues, LookAt:=xlWhole) ' Match account number If Not foundRow Is Nothing Then firstAddress = foundRow.Address Do If CStr(foundRow.Offset(0, 1).Value) Like "*-CASH-*" Then portiaValue = foundRow.Offset(0, 2).Value ' Column C ledgersSheet.Cells(8, accountCell.Column).Value = portiaValue Debug.Print "Row 8 - Portia Value: " & portiaValue End If Set foundRow = portiaSheet.Range("A1:C" & lastRow).FindNext(foundRow) Loop While Not foundRow Is Nothing And foundRow.Address <> firstAddress Else Debug.Print "Row 8 - Account Number not found in Portia Sheet: " & accountCell.Value End If Else Debug.Print "Account not found for: " & accountCell.Value End If End If Next accountCell ' Close the workbooks editedOutputWorkbook.Close SaveChanges:=False portiaWorkbook.Close SaveChanges:=False MsgBox "Ledgers updated successfully!" End Sub
Editor is loading...
Leave a Comment