Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Option Explicit
- 'https://chat.stackoverflow.com/rooms/167099/discussion-between-qharr-and-i--newb
- Public Sub PerformLogOperation2()
- Dim wbTarget As Workbook
- Dim wsTarget As Worksheet
- Set wbTarget = ThisWorkbook
- Set wsTarget = wbTarget.Worksheets("HistoricalDataandCalculations")
- Dim namedRange As Range
- Dim namesArr()
- Set namedRange = wsTarget.Range("HDaCReturns")
- namesArr = GetNamedRangeNames(namedRange)
- CreateNamedRanges namedRange, namesArr
- With wsTarget
- .Range(.Cells(namedRange.Row + namedRange.Rows.Count, 1), .Cells(.Rows.Count, .Columns.Count)).ClearContents
- End With
- PopulateFormulas namedRange
- AddNamedRangeCalculations namesArr, namedRange, wsTarget
- End Sub
- Public Sub CreateNamedRanges(ByVal namedRange As Range, ByVal namesArr As Variant, Optional wbTarget As Workbook)
- Dim currentNamedRange As Long
- Dim tempRange As Range
- Dim tempRangeName As String
- If wbTarget Is Nothing Then Set wbTarget = ThisWorkbook
- Dim sheetName As String
- Dim startRow As Long
- Dim endRow As Long
- Dim columnForCount
- sheetName = namedRange.Parent.Name
- startRow = namedRange.Row + 2
- endRow = namedRange.Parent.Cells.Rows.Count
- columnForCount = namedRange.Column
- For currentNamedRange = LBound(namesArr, 2) To UBound(namesArr, 2)
- With namedRange
- Set tempRange = .Columns(currentNamedRange + 1).Offset(2, 0).Resize(.Rows.Count - 2, 1)
- End With
- tempRangeName = Trim$(namesArr(1, currentNamedRange))
- wbTarget.Names.Add Name:=tempRangeName, _
- RefersTo:="=OFFSET(" & sheetName & "!R" & startRow & "C" & columnForCount + currentNamedRange & _
- ",0,0,COUNT(" & sheetName & "!R" & startRow & "C" & columnForCount & ":R" & endRow & "C" & _
- columnForCount & ")-1,1)"
- Set tempRange = Nothing
- tempRangeName = vbNullString
- Next currentNamedRange
- End Sub
- Public Function GetNamedRangeNames(ByVal namedRange As Range) As Variant
- Dim namesArr()
- With namedRange.Rows(1)
- namesArr = .Offset(, 1).Resize(1, .Columns.Count - 1).Value2
- End With
- GetNamedRangeNames = namesArr
- End Function
- Public Sub AddNamedRangeCalculations(ByVal namesArr As Variant, ByVal namedRange As Range, ByVal wsTarget As Worksheet)
- Dim currentName As Long
- With namedRange
- .Offset(.Rows.Count + 1, .Columns.Count).Resize(1, 1) = "Average"
- .Offset(.Rows.Count + 3, .Columns.Count).Resize(1, 1) = "StDev_P"
- .Offset(.Rows.Count + 5, .Columns.Count).Resize(1, 1) = "Excess Returns"
- End With
- For currentName = LBound(namesArr, 2) To UBound(namesArr, 2)
- With namedRange
- .Offset(.Rows.Count + 1, currentName).Resize(1, 1) = Application.WorksheetFunction.Average(wsTarget.Range(namesArr(1, currentName)))
- .Offset(.Rows.Count + 3, currentName).Resize(1, 1) = Application.WorksheetFunction.StDev_P(wsTarget.Range(namesArr(1, currentName)))
- End With
- Next currentName
- End Sub
- Public Sub PopulateFormulas(ByVal namedRange As Range)
- With namedRange
- .Offset(2, 1).Resize(.Rows.Count - 3, .Columns.Count - 1).FormulaR1C1 = "=LN(R[-103]C/R[-102]C)"
- .Offset(.Rows.Count + 5, 1).Resize(.Rows.Count - 3, .Columns.Count - 1).FormulaArray = "=R[-104]C:R[-7]C[3]*R[-4]C:R[-4]C[3]"
- End With
- End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement