我有两个动态命名范围 - HDaCClose和HDaCReturns。
在DNR HDaCClose中我有多个列,金融工具的每日收盘价为100天,因此有100行和X列,见下文。
对于DNR HDaCReturns,我需要使用以下公式计算回报的自然对数:LN = n /(n - 1)。本质上,我需要今天收盘价的自然日志除以昨天的收盘价。
我试图获得循环通过列中每个单元格并执行计算的逻辑,然后再转到下一列中每个单元格的计算。
我从中获得的输出是:
显然不准确......
循环通过HDaCReturns范围内每列中每个单元格的正确方法应该是什么,并执行我需要的计算?
答案 0 :(得分:1)
我碰巧从你的另一个问题中知道你可以使用.FormulaR1C1将公式分配给正确的单元格范围,而不需要循环。最后一行将从输出计算中排除,因为没有要与之比较的行。
With ThisWorkbook.Worksheets("HistoricalDataandCalculations").Range ("HDaCReturns")
.Offset(2, 1).Resize(.Rows.Count - 3, .Columns.Count - 1).FormulaR1C1 = "=LN(R[-103]C/R[-102]C)"
End With
公式的R [-103] C / R [-102]部分引用当前上下文中的闭合值。您可以将其替换为命名范围引用。
查看它的一种非常详细的方法如下,您使用命名范围并使用数组公式(.FormulaArray
)进行计算:
Sub AddLnCalcs()
Dim wb As Workbook
Dim ws As Worksheet
Dim returnRange As Range
Dim closeRange As Range
Dim closedRangeData As Range
Set wb = ThisWorkbook
Set ws = wb.Worksheets("HistoricalDataandCalculations")
Set returnRange = ws.Range("HDaCReturns")
Set closeRange = ws.Range("HDaCClose")
With closeRange
Set closedRangeData = .Offset(2, 1).Resize(.Rows.Count - 3, .Columns.Count - 1) '.Address 'offset 2 to avoid headers of e.g. EURUSD and close and resize to exclude headers and last row and exclude date column
End With
Dim formulaOutputArea As Range
With returnRange
Set formulaOutputArea = .Offset(2, 1).Resize(.Rows.Count - 3, .Columns.Count - 1)
formulaOutputArea.FormulaArray = "=LN(" & closedRangeData.Address & "/" & closedRangeData.Offset(1, 0).Address & ")"
End With
End Sub