Advertisement
Guest User

Untitled

a guest
Mar 21st, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.54 KB | None | 0 0
  1. Option Explicit
  2. 'https://chat.stackoverflow.com/rooms/167099/discussion-between-qharr-and-i--newb
  3.  
  4. Public Sub PerformLogOperation2()
  5.  
  6. Dim wbTarget As Workbook
  7. Dim wsTarget As Worksheet
  8.  
  9. Set wbTarget = ThisWorkbook
  10. Set wsTarget = wbTarget.Worksheets("HistoricalDataandCalculations")
  11.  
  12. Dim namedRange As Range
  13. Dim namesArr()
  14.  
  15. Set namedRange = wsTarget.Range("HDaCReturns")
  16.  
  17. namesArr = GetNamedRangeNames(namedRange)
  18.  
  19. CreateNamedRanges namedRange, namesArr
  20.  
  21. With wsTarget
  22. .Range(.Cells(namedRange.Row + namedRange.Rows.Count, 1), .Cells(.Rows.Count, .Columns.Count)).ClearContents
  23. End With
  24.  
  25. PopulateFormulas namedRange
  26.  
  27. AddNamedRangeCalculations namesArr, namedRange, wsTarget
  28.  
  29. End Sub
  30.  
  31. Public Sub CreateNamedRanges(ByVal namedRange As Range, ByVal namesArr As Variant, Optional wbTarget As Workbook)
  32.  
  33. Dim currentNamedRange As Long
  34. Dim tempRange As Range
  35. Dim tempRangeName As String
  36.  
  37. If wbTarget Is Nothing Then Set wbTarget = ThisWorkbook
  38.  
  39. Dim sheetName As String
  40. Dim startRow As Long
  41. Dim endRow As Long
  42. Dim columnForCount
  43.  
  44. sheetName = namedRange.Parent.Name
  45. startRow = namedRange.Row + 2
  46. endRow = namedRange.Parent.Cells.Rows.Count
  47. columnForCount = namedRange.Column
  48.  
  49. For currentNamedRange = LBound(namesArr, 2) To UBound(namesArr, 2)
  50.  
  51. With namedRange
  52. Set tempRange = .Columns(currentNamedRange + 1).Offset(2, 0).Resize(.Rows.Count - 2, 1)
  53. End With
  54.  
  55. tempRangeName = Trim$(namesArr(1, currentNamedRange))
  56.  
  57. wbTarget.Names.Add Name:=tempRangeName, _
  58. RefersTo:="=OFFSET(" & sheetName & "!R" & startRow & "C" & columnForCount + currentNamedRange & _
  59. ",0,0,COUNT(" & sheetName & "!R" & startRow & "C" & columnForCount & ":R" & endRow & "C" & _
  60. columnForCount & ")-1,1)"
  61.  
  62. Set tempRange = Nothing
  63. tempRangeName = vbNullString
  64.  
  65. Next currentNamedRange
  66.  
  67. End Sub
  68.  
  69. Public Function GetNamedRangeNames(ByVal namedRange As Range) As Variant
  70.  
  71. Dim namesArr()
  72.  
  73. With namedRange.Rows(1)
  74.  
  75. namesArr = .Offset(, 1).Resize(1, .Columns.Count - 1).Value2
  76.  
  77. End With
  78.  
  79. GetNamedRangeNames = namesArr
  80.  
  81. End Function
  82.  
  83. Public Sub AddNamedRangeCalculations(ByVal namesArr As Variant, ByVal namedRange As Range, ByVal wsTarget As Worksheet)
  84.  
  85. Dim currentName As Long
  86.  
  87. With namedRange
  88. .Offset(.Rows.Count + 1, .Columns.Count).Resize(1, 1) = "Average"
  89. .Offset(.Rows.Count + 3, .Columns.Count).Resize(1, 1) = "StDev_P"
  90. .Offset(.Rows.Count + 5, .Columns.Count).Resize(1, 1) = "Excess Returns"
  91. End With
  92.  
  93. For currentName = LBound(namesArr, 2) To UBound(namesArr, 2)
  94.  
  95. With namedRange
  96. .Offset(.Rows.Count + 1, currentName).Resize(1, 1) = Application.WorksheetFunction.Average(wsTarget.Range(namesArr(1, currentName)))
  97. .Offset(.Rows.Count + 3, currentName).Resize(1, 1) = Application.WorksheetFunction.StDev_P(wsTarget.Range(namesArr(1, currentName)))
  98. End With
  99.  
  100. Next currentName
  101.  
  102. End Sub
  103.  
  104. Public Sub PopulateFormulas(ByVal namedRange As Range)
  105.  
  106. With namedRange
  107. .Offset(2, 1).Resize(.Rows.Count - 3, .Columns.Count - 1).FormulaR1C1 = "=LN(R[-103]C/R[-102]C)"
  108. .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]"
  109. End With
  110.  
  111. End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement