在已定义的动态命名范围内使用 headers as .Name 定义动态命名范围

Defining Dynamic Named Ranges with their headers as .Name within an already defined Dynamic Named Range

我有动态命名范围 'HDaERReturns' 从 .Cells(108,2) 开始到该范围内的最后一个单元格,我想将它分成几列并用 [=54 命名每一列=] 它位于第 106 行。

Range 的当前外观示例:

|    Item    |   EURUSD   |   GBPUSD   |   USDCHF   |   XAUUSD   |
|:----------:|:----------:|:----------:|:----------:|:----------:|
|    Date    | Volatility | Volatility | Volatility | Volatility |
| 06.03.2018 |            |            |            |            |
| 05.03.2018 |            |            |            |            |
| 04.03.2018 |            |            |            |            |
| 02.03.2018 |            |            |            |            |
| 01.03.2018 |            |            |            |            |
| 28.02.2018 |            |            |            |            |
| 27.02.2018 |            |            |            |            |
| 26.02.2018 |            |            |            |            |
| 25.02.2018 |            |            |            |            |

我需要为动态命名范围 'HDaERReturns' 中的每一列命名,因为:

  1. 我需要遍历动态命名范围 'HDaERReturns' 中每一列中的每个单元格,并在其中执行正常日志 return 计算,它引用另一个动态命名范围称为 'HDaERClose',我必须将其分成几列并用 header 命名。 这样我就可以通过编码来参考计算阶段:

    For Each Column In Range("HDaERReturns") ' Set header as .Name Next

    For Each Cell In Columns ' Perform calculations Next

并得到这样的输出:

  1. 在代码的后期阶段,我需要 运行 多元回归分析并排除每个包含 P-Value > 0.15 的数组(参见 THIS 问题)。为了排除具有不可满足的相关值 (P-Value) 的数组,我需要列 headers 作为列 DNR 的名称。

我还没有到MLR阶段,所以我没有正确纠正问题,但那是另一个话题。现在我需要创建列动态命名范围,并将它们的 header 作为名称。

header是ever-changing,它们对应的列中的值也是ever-changing,所以它必须是动态方法。

到目前为止还没有真正得到有意义的代码,但我想知道是否有人可以给我一些关于如何解决这个问题的指示。

这是为了您的命名范围创建。

注:

  1. 我正在使用您的日期列来设置每个动态范围的高度,以防列中缺少数据(假设日期列最完整)。
  2. 我假设您的日期列实际上是文本,因此使用 COUNTA。否则将 COUNTA 替换为 COUNT.

版本 1 这会创建动态命名范围,但如果您在列中缺少数据,可能会导致问题。

Option Explicit

Public Sub PerformLogOperation()

    Dim wbTarget As Workbook
    Dim wsTarget As Worksheet

    Set wbTarget = ThisWorkbook
    Set wsTarget = wbTarget.Worksheets("Sheet1")

    Dim namedRange As Range
    Dim namesArr()

    Set namedRange = wsTarget.Range("HDaERReturns")

    namesArr = GetNamedRangeNames(namedRange)

    CreateNamedRanges namedRange, namesArr

    ''TODO Your log operation code goes here

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
    sheetName = namedRange.Parent.Name
    Dim startRow As Long
    Dim endRow As Long
    Dim columnForCount

    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,COUNTA(" & sheetName & "!R" & startRow & "C" & columnForCount & ":R" & endRow & "C" & _
                  columnForCount & "),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

固定长度的版本 2

Option Explicit

Public Sub CreateNamedRanges2(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

    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:=tempRange

        Set tempRange = Nothing
        tempRangeName = vbNullString

    Next currentNamedRange

End Sub