2012-07-13 85 views
1

我想获得一个简单的VBA代码作为宏的一部分,它将在列B中放置每行的值的平均值。 我有代码生成一个时间序列,并填充每个模拟列,使每列是从列C开始的时间序列。 模拟的数量不同,所以我只需要一些东西,平均每个时间点的值(即对于所有模拟中的每一行),同时调整运行的模拟数量(填充的列)。然后,我会希望它生成一个高亮显示所计算平均值的所有时间序列的单个图。 非常感谢,如果你能帮助!可变长度VBA的平均行

例如,这里是从sheet1中获取时间步的值并将其放置在columnA sheet2中的代码。我想宏观到现在的地方的平均相应行落笔列B: Screenshot Of current output

Sheets("Sheet1").Select 
Range("E5").Select 
Range(Selection, Selection.End(xlDown)).Select 
Selection.Copy 
Sheets("Sheet2").Select 
Cells(1, 1).Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
+3

您可以使用AVERAGE公式。示例= AVERAGE(C1:AA1)。 AVERAGE将获得该值范围内每个单元格的平均值。所以如果你引用10个单元格,但只有2个单元格的值,它将提供2的平均值。 – 2012-07-13 02:04:51

+0

我同意Daniel的观点 - 为什么不直接使用内建的'AVERAGE'函数。你可以添加电子表格的屏幕截图吗? – whytheq 2012-07-13 06:48:08

+0

感谢您的意见。我想把这个功能作为一个宏的一部分,它可以自动生成这些时间序列。由于我不知道会有多少列(可能有数百个),我可能不得不多次重复模拟,因此需要将其作为此宏的一部分进行合并。我已更新了该问题,并提供了更多细节你的要求。 – Mary 2012-07-13 10:35:36

回答

1

试试这个

Sub Sample() 
    Dim ws As Worksheet 
    Dim lRow As Long 

    Set ws = Sheets("Sheet1") 

    With ws 
     lRow = .Range("A" & .Rows.Count).End(xlUp).Row 

     .Range("B2:B" & lRow).Formula = _ 
     "=IF(ISERROR(AVERAGE(C2:E2)),"""",AVERAGE(C2:E2))" 
    End With 
End Sub 

随访

试试这个

Sub Sample() 
    Dim ws As Worksheet 
    Dim lRow As Long, lCol As Long 
    Dim ColNm As String 

    Set ws = Sheets("Sheet1") 

    With ws 
     lRow = .Range("A" & .Rows.Count).End(xlUp).Row 
     lCol = .Cells(2, .Columns.Count).End(xlToLeft).Column 
     ColNm = Split(.Cells(, lCol).Address, "$")(1) 

     .Range("B2:B" & lRow).Formula = "=IF(ISERROR(AVERAGE(C2:" _ 
             & ColNm & _ 
             "2)),"""",AVERAGE(C2:" & _ 
             ColNm & "2))" 
    End With 
End Sub 
+0

谢谢你,Siddharth。效果很好。请参阅其他评论。 – Mary 2012-07-13 13:42:36

+0

@Mary:查看更新的代码。 – 2012-07-13 13:59:18

+0

完美!非常感谢.. – Mary 2012-07-13 14:17:07

1

试试这个,虽然会有很多不同的变种,在此代码:

Sub AddAvgFormula() 

With Sheets("Sheet2") 
     .Range("B2").FormulaR1C1 = "=AVERAGE(RC[1]:RC[3])" 
     .Range("B2").Copy 
     .Range("B2:B" & .Cells(Excel.Rows.Count, 1).End(Excel.xlUp).Row).PasteSpecial Excel.xlPasteFormulas 
End With 

End Sub 

在在End Sub之前你当前的代码的末尾添加这样的:

Call AddAvgFormula 

这里的原代码的变体光盘:

Sub AddAvgFormula() 

With Sheets("Sheet2") 
     .Range("B2") = "=AVERAGE(C2:E2)" 
     .Range("B2").Copy 
     .Range("B2:B" & .Cells(Excel.Rows.Count, 1).End(Excel.xlUp).Row).PasteSpecial Excel.xlPasteFormulas 
End With 

End Sub 

另一种变体,它是较短,但也许不是那么直观:

Sub AddAvgFormula() 

With Sheets("Sheet2") 
     .Range("B2:B" & .Cells(Excel.Rows.Count, 1).End(Excel.xlUp).Row) = "=AVERAGE(C2:E2)" 
End With 

End Sub 
+0

+ 1对于变化:) – 2012-07-13 12:40:03

+0

嗨,大家好。非常感谢。这两个贡献在计算所示示例的平均值方面非常有效。但是,列的数量会有所不同,因此根据模拟产生的重复次数,平均值需要从C列计算到“x”。在计算之前,我很难弄清楚有多少列需要进行平均,以便您的代码非常好。任何获得图表的帮助也会是一个很大的好处;)!非常感谢你对此的帮助。再次感谢! – Mary 2012-07-13 13:29:52

+0

x会因每行而有所不同?或者对于表单中的每一行,x都是一样的?也许只要改变最后一个变种'E2'到'Z2' ......只要其他行是空的,那么'AVERAGE'函数就会忽略它们。 – whytheq 2012-07-14 13:58:45