【问题标题】:VBA - struggling to calc and write StDev data into an array with a For Next loopVBA - 努力计算 StDev 数据并将其写入带有 For Next 循环的数组
【发布时间】:2015-01-20 01:54:48
【问题描述】:

11/24/14 - 如下......

仍在尝试解决这个问题 - 通过创建一个可以滚动通过较大数组的较小数组是否会更容易? ...然后可以对整个小阵列进行任何必要的计算。

我无法弄清楚如何仅隔离数组的(滚动)子集。滚动子集可用于移动平均线、标准开发、最大/最小等。


11/21/14 - 我做了几次尝试,这是最新的迭代。在循环通过最小周期 (stdev_periods = 10) 之前,它不应该产生有意义的输出。

--pct_chg_array() 是一个数组,其中包含来自i=2 to i = 2541...的百分比变化数据,声明为变量

--stdev_periods = 10 ...声明为整数

--i 是一个计数器...声明为整数

--stdev_array() 是一个空数组,我希望用滚动 n 周期范围的标准差计算来填充它...声明为变量

--Option Base 1Option Explicit 开启

For i = 2 To 2541
    If IsNumeric(i) And i <> 0 Then
        stdev_array(i, 1) = Application.WorksheetFunction.stdev(Range(pct_chg_array(i, 1).Offset(-stdev_periods, 0), pct_chg_array(i, 0)))
    Else
        stdev_array(i, 1) = 0
    End If
Next i

任何指导将不胜感激。谢谢!

----编辑----

为了简化,这就是我在工作表公式中的表达方式...

=IF(ISNUMBER(OFFSET($E3,-stdev_periods+1,0)),STDEV(OFFSET($E3,0,0,-stdev_periods)),0)

..."stdev_periods" = 10 和 E 列保存 1 个周期 %chg 数据 (ie =$E3/$E2-1)。

【问题讨论】:

  • 您认为您可以更改变量名称以反映它们在标准偏差公式中所起的作用吗?这可能对我们有帮助。谢谢。
  • 好建议 - 希望它现在更容易阅读。泰。
  • 更大的图景 - 我正在尝试分析股票的价格时间序列数据,并被建议收集和操作 3D 数组中的数据。我是 VBA 的新手,所以我只是想一次接一个。再次感谢。

标签: arrays vba for-loop offset


【解决方案1】:

将此函数放入模块中:

Public Function Slice(vntInputArray As Variant, lngStartIndex As Long, lngEndIndex As Long)   
    'Use to return an arbitrary-sized subset from a 1 dimensional array.
    'Assumes developer is using Option Base 1

    Dim vntSubArray() As Variant, lngInputIndex As Long
    Dim lngElementCountIndex As Long: lngElementCountIndex = 1


    For lngInputIndex = lngStartIndex To lngEndIndex
        ReDim Preserve vntSubArray(lngInputIndex)
        vntSubArray(lngElementCountIndex) = vntInputArray(lngInputIndex)
        lngElementCountIndex = (lngElementCountIndex + 1)
    Next lngInputIndex

    Slice = vntSubArray

End Function

将函数添加到您的代码中:

For i = 2 To 2541
    If IsNumeric(i) And i > stdev_periods Then     'Using greater than to account for Option Base 1
        stdev_array(i, 1) = WorksheetFunction.stdev(Slice( pct_chg_array, (i -stdev_periods), i))
    Else
        stdev_array(i, 1) = 0
    End If
Next i

【讨论】:

  • 我一直遇到的问题是我很难隔离数组中的一小部分数据。例如,如果我在一个单维数组(“price_array”)中有 100 个数据点,我无法弄清楚如何一次只获得 10 个的最大值、最小值或平均值。这似乎不起作用: application.max(range(price_array(1),price_array(10))) 我认为这只是给了我这两个坐标值的最大值 - 而不是那些之间所有值的最大值2. 不对吗?
  • 感谢您的解释。问题是,据我所知,没有一种方便的方法可以使用 VBA 对数组的任意子集进行“切片”。我在答案中添加了一个我认为可以解决问题的函数。
猜你喜欢
  • 2013-06-19
  • 2017-05-21
  • 2016-05-26
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多