在已定义的动态命名范围内使用 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' 中的每一列命名,因为:
我需要遍历动态命名范围 'HDaERReturns' 中每一列中的每个单元格,并在其中执行正常日志 return 计算,它引用另一个动态命名范围称为 'HDaERClose',我必须将其分成几列并用 header 命名。
这样我就可以通过编码来参考计算阶段:
For Each Column In Range("HDaERReturns")
' Set header as .Name
Next
For Each Cell In Columns
' Perform calculations
Next
并得到这样的输出:
- 在代码的后期阶段,我需要 运行 多元回归分析并排除每个包含 P-Value > 0.15 的数组(参见 THIS 问题)。为了排除具有不可满足的相关值 (P-Value) 的数组,我需要列 headers 作为列 DNR 的名称。
我还没有到MLR阶段,所以我没有正确纠正问题,但那是另一个话题。现在我需要创建列动态命名范围,并将它们的 header 作为名称。
header是ever-changing,它们对应的列中的值也是ever-changing,所以它必须是动态方法。
到目前为止还没有真正得到有意义的代码,但我想知道是否有人可以给我一些关于如何解决这个问题的指示。
这是为了您的命名范围创建。
注:
- 我正在使用您的日期列来设置每个动态范围的高度,以防列中缺少数据(假设日期列最完整)。
- 我假设您的日期列实际上是文本,因此使用
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
我有动态命名范围 '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' 中的每一列命名,因为:
我需要遍历动态命名范围 'HDaERReturns' 中每一列中的每个单元格,并在其中执行正常日志 return 计算,它引用另一个动态命名范围称为 'HDaERClose',我必须将其分成几列并用 header 命名。 这样我就可以通过编码来参考计算阶段:
For Each Column In Range("HDaERReturns") ' Set header as .Name Next
For Each Cell In Columns ' Perform calculations Next
并得到这样的输出:
- 在代码的后期阶段,我需要 运行 多元回归分析并排除每个包含 P-Value > 0.15 的数组(参见 THIS 问题)。为了排除具有不可满足的相关值 (P-Value) 的数组,我需要列 headers 作为列 DNR 的名称。
我还没有到MLR阶段,所以我没有正确纠正问题,但那是另一个话题。现在我需要创建列动态命名范围,并将它们的 header 作为名称。
header是ever-changing,它们对应的列中的值也是ever-changing,所以它必须是动态方法。
到目前为止还没有真正得到有意义的代码,但我想知道是否有人可以给我一些关于如何解决这个问题的指示。
这是为了您的命名范围创建。
注:
- 我正在使用您的日期列来设置每个动态范围的高度,以防列中缺少数据(假设日期列最完整)。
- 我假设您的日期列实际上是文本,因此使用
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