【问题标题】:Storing an average in an array将平均值存储在数组中
【发布时间】:2018-01-31 15:00:09
【问题描述】:

我正在寻找一种方法来创建一个数组,它可以在其中找到 E、F、G 和 H 列的平均值,然后将平均值存储在一个数组中。唯一的问题是每列中的行数因每个文件而异,我将在其上运行此数组(尽管所有列的行数相同),所以我强调它将是一个动态数组,我也想要平均从第二行开始,因为我在第一行有标题。如果有人知道如何做到这一点,我将非常感激帮助,因为我完全糊涂了。

【问题讨论】:

    标签: arrays vba excel average


    【解决方案1】:

    据我所知,空单元格不算数。所以没有必要定义lastrow。试试这个:

    Sub AvToArray()
        Dim rng As Range
        Dim col As Range
        Dim arrAv()
        Dim i As Long
    
        Set rng = Range("E:H")
        ReDim arrAv(rng.Columns.Count)
    
        For Each col In rng.Columns
            arrAv(i) = WorksheetFunction.Average(col)
            i = i + 1
        Next col
    
    End Sub
    

    【讨论】:

      【解决方案2】:

      您可以对Average() 使用WorksheetFunction 方法。

      根据我从您的问题中了解到的情况,您希望将平均值存储在一个数组中,所以就这样吧..

      Public Function lastRow(ByVal ws As Worksheet, Optional ByVal col As Variant = 1)
          With ws
              lastRow = .Cells(.Rows.Count, col).End(xlUp).Row
          End With
      End Function
      
      Sub test()
      
          Dim ws As Worksheet, aveArr(4) As Double
          Set ws = ThisWorkbook.Worksheets(1)
      
          'You said that you wanted to store the values to be inside an array...
          With WorksheetFunction
              aveArr(0) = .Average(ws.Range("E2:E" & lastRow(ws, "E")))
              aveArr(1) = .Average(ws.Range("F2:E" & lastRow(ws, "F")))
              aveArr(2) = .Average(ws.Range("G2:E" & lastRow(ws, "G")))
              aveArr(3) = .Average(ws.Range("H2:E" & lastRow(ws, "H")))
          End With
      
          MsgBox aveArr(0) & vbNewLine & _
                  aveArr(1) & vbNewLine & _
                  aveArr(2) & vbNewLine & _
                  aveArr(3)
      
      End Sub
      

      【讨论】:

      • 这个问题的有趣竞争。我可以说如果列中有错误数据并且您得到#Num!然后将结果数组定义为 Double 将引发错误。
      【解决方案3】:

      我的(非常相似的)解决方案与此处发布的其他解决方案:

      Sub AverageArray()
      
      Dim myarray As Variant, sht As Worksheet, lastrow As Long
      
      Set sht = ThisWorkbook.Worksheets("Sheet1")
      lastrow = sht.Cells(sht.Rows.Count, "E").End(xlUp).Row 'or F, G, H, etc.
      
      myarray = Array(Application.Average(Range("E2:E" & lastrow)), _
                      Application.Average(Range("F2:F" & lastrow)), _
                      Application.Average(Range("G2:G" & lastrow)), _
                      Application.Average(Range("H2:H" & lastrow)))
      
      Debug.Print myarray(0)
      Debug.Print myarray(1)
      Debug.Print myarray(2)
      Debug.Print myarray(3)
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多