动态命名范围中每列中每天的日志返回计算

时间:2018-03-13 17:51:48

标签: excel vba excel-vba

我有两个动态命名范围 - HDaCClose和HDaCReturns。

在DNR HDaCClose中我有多个列,金融工具的每日收盘价为100天,因此有100行和X列,见下文。

HDaCClose

对于DNR HDaCReturns,我需要使用以下公式计算回报的自然对数:LN = n /(n - 1)。本质上,我需要今天收盘价的自然日志除以昨天的收盘价。

HDaCReturns

我试图获得循环通过列中每个单元格并执行计算的逻辑,然后再转到下一列中每个单元格的计算。

我从中获得的输出是:

OUTPUT

显然不准确......

循环通过HDaCReturns范围内每列中每个单元格的正确方法应该是什么,并执行我需要的计算?

1 个答案:

答案 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