Arrays 如何在Excel VBA中切片向量?

Arrays 如何在Excel VBA中切片向量?,arrays,excel,vba,Arrays,Excel,Vba,我只想在Microsoft Excel VBA中获取数组中少数项的平均值。例如,取向量中每对数字的平均值:45 21 63 12 19。这里的主要问题是,我希望能够使数字的数量是动态的,这样它也可以总是取每3个数字的平均值 我尝试使用索引函数或偏移函数,但两者都不起作用 Dim arrMarks(1 To 5) As Long arrMarks(1) = 45 arrMarks(2) = 21 arrMarks(3) = 63 arrMarks(4) = 12 arrMarks(5) = 19

我只想在Microsoft Excel VBA中获取数组中少数项的平均值。例如,取向量中每对数字的平均值:45 21 63 12 19。这里的主要问题是,我希望能够使数字的数量是动态的,这样它也可以总是取每3个数字的平均值

我尝试使用
索引
函数或
偏移
函数,但两者都不起作用

Dim arrMarks(1 To 5) As Long

arrMarks(1) = 45
arrMarks(2) = 21
arrMarks(3) = 63
arrMarks(4) = 12
arrMarks(5) = 19

length = UBound(arrMarks, 1) - LBound(arrMarks, 1) + 1

' take the average of m numbers

m = 3
m_length = length - (m-1)

Dim arravg(1 To m_length)

For i = 1 To m_length
    If (i + m) <= length Then
        arravg(i) = Application.WorksheetFunction.Average(arrMarks.Offset(m, 0))
    End If
Next i

我希望使代码
m
可以用任何数字填充(只要m获取连续数组元素组的平均值

Function getAverages(arrData, Optional groupSize As Long = 2) As Variant()
' count array elements
  Dim lg As Long
  lg = UBound(arrData, 2) - LBound(arrData, 2) + 1

' take the average of m numbers
  Dim m_lg As Long
  m_lg = lg - (groupSize - 1)

  ReDim arrAvg(1 To m_lg)
  Dim temp, i As Long
  For i = 1 To m_lg
      If (i + groupSize) <= lg + 1 Then
          temp = Application.Index(arrData, Array(1), getElements(i, groupSize))
          arrAvg(i) = Application.WorksheetFunction.Average(temp)
          Debug.Print i & ") current group: " & Join(temp, ", "), arrAvg(i)
      End If
  Next i
' return averages
  getAverages = arrAvg
End Function
Function getElements(ByVal start As Long, Optional ByVal groupSize As Long = 2)
ReDim temp(0 To groupSize - 1)
Dim i&
For i = 0 To groupSize - 1
    temp(i) = start + i
Next i
getElements = temp
End Function

允许灵活的组大小

示例呼叫

对您的帖子所做的唯一更改是,我使用了一个2维初始数组
arrMarks
,其可能的优点是您可以轻松地从给定范围(行)分配数据

结果

1) current group: 45, 21, 63               43 
2) current group: 21, 63, 12               32 
3) current group: 63, 12, 19               31,3333333333333 
~> 3 averages: 43|32|31,3333333333333
主函数getAverages()


你的问题我不清楚。编辑您的问题以显示示例输入和所需输出。使用
应用程序的高级可能性发布了解决方案。Index
功能。旁注:不可能像在OP:-中那样将
.Offset
方法应用于数组;仅供参考,建议阅读
Function getAverages(arrData, Optional groupSize As Long = 2) As Variant()
' count array elements
  Dim lg As Long
  lg = UBound(arrData, 2) - LBound(arrData, 2) + 1

' take the average of m numbers
  Dim m_lg As Long
  m_lg = lg - (groupSize - 1)

  ReDim arrAvg(1 To m_lg)
  Dim temp, i As Long
  For i = 1 To m_lg
      If (i + groupSize) <= lg + 1 Then
          temp = Application.Index(arrData, Array(1), getElements(i, groupSize))
          arrAvg(i) = Application.WorksheetFunction.Average(temp)
          Debug.Print i & ") current group: " & Join(temp, ", "), arrAvg(i)
      End If
  Next i
' return averages
  getAverages = arrAvg
End Function
Function getElements(ByVal start As Long, Optional ByVal groupSize As Long = 2)
ReDim temp(0 To groupSize - 1)
Dim i&
For i = 0 To groupSize - 1
    temp(i) = start + i
Next i
getElements = temp
End Function