从多个工作表中获取多个范围的平均值

时间:2015-08-11 14:41:58

标签: excel vba excel-vba

我有一个工作簿,其中包含一个订单表单,可以将订单生成订单作为新工作表的副本。我需要平均这些工作表中的信息,以便找出典型的顺序。

到目前为止,这是我想到的,只是尝试将所有值一起添加到趋势数据工作表中显示:

Sub CalculateAvg()

        Dim WS_Count As Integer
        Dim I As Integer

        Dim wsTrend As Worksheet, wsTemp As Worksheet
        Set wsTrend = ThisWorkbook.Sheets("Trend Data")

        WS_Count = ActiveWorkbook.Worksheets.Count

         For I = 1 To WS_Count
            If ActiveWorkbook.Worksheets(I).Name = "Order Form" Then Exit For 'exit loop if order form reached

            Set wsTemp = ActiveWorkbook.Worksheets(I)
            wsTrend.Range("D4:D53").Value = wsTrend.Range("D4:D53").Value + wsTemp.Range("F4:F53").Value

         Next I
End Sub

我得到一个错误13 - 在range1 = range1 + range2行上输入不匹配,我不太明白。

如果我将该行更改为just wsTrend.Range("D4:D53").Value = wsTemp.Range("F4:F53").Value

我没有出现类型不匹配的问题,而且有效。

我可能以错误的方式解决这个问题或者遗漏了一些简单的事情,但我不确定应该采取什么方向。

任何帮助将不胜感激。 谢谢。

编辑,稍微澄清一下: 基本上,我可以有100个看起来像这样但有不同数字的工作表:

apples 2
bananas 5
oranges 3
mangoes 10

我需要遍历所有工作表并获得每个项目的平均值并显示

avg apples 3
avg bananas 4
avg oranges 4
avg mangoes 8

2 个答案:

答案 0 :(得分:0)

可以尝试修改下面的

通过将值读入数组,然后对数组中的值执行平均值

Sub avg_test()
Dim Val1(), Val2(), Val3()

Val1 = Sheets("Sheet1").Range("A1:A10").Value
Val2 = Sheets("Sheet2").Range("A1:A10").Value
Val3 = Sheets("Sheet3").Range("A1:A10").Value

avg = Application.WorksheetFunction.Average(Val1, Val2, Val3)

End Sub

答案 1 :(得分:0)

好的,所以Grade'Eh'Bacon让我以不同的方式思考问题。

这就是我所拥有的:

Sub CalculateAvg()

    Dim WS_Count As Integer
    Dim I As Integer
    Dim App_WS_Count As Integer
    App_WS_Count = 0

    Dim wsTrend As Worksheet
    Dim wsTemp As Worksheet

    Set wsTrend = ThisWorkbook.Sheets("Trend Data")

    Dim TrendRange As Range
    Set TrendRange = wsTrend.Range("D4:D53")


    For A = 1 To TrendRange.Rows.Count
        TrendRange.Cells(A, 1).Clear
    Next A

     ' Set WS_Count equal to the number of worksheets in the active workbook.
     WS_Count = ActiveWorkbook.Worksheets.Count
     For I = 1 To WS_Count
        If ActiveWorkbook.Worksheets(I).Name = "Order Form" Then Exit For 'exit loop if order form reached
        App_WS_Count = App_WS_Count + 1


        Set wsTemp = ActiveWorkbook.Worksheets(I)
        Dim TempRange As Range
        Set TempRange = wsTemp.Range("F4:F53")     

        For C = 1 To TempRange.Rows.Count
            TrendRange.Cells(C, 1).Value = TrendRange.Cells(C, 1).Value + TempRange.Cells(C, 1).Value
        Next C

     Next I

     For A = 1 To TrendRange.Rows.Count
        TrendRange.Cells(A, 1).Value = TrendRange.Cells(A, 1).Value / App_WS_Count
     Next A
End Sub

逻辑上这可能效率很低。并且可能会出现令人烦恼的问题,为新订单添加更多行,这些新订单会在未来的订单中添加,但现在正在运行。