2012-02-09 94 views
1

我想从单元格2到19的测试分数,并设置等于20.但是,当我输入代码时,它只打印出#NAME?。我如何解决它以确保它能打印出平均分数?VBA错误与取得一组分数的平均值

Sub Scores() 
    Dim ws As Worksheet 
    Set ws = Worksheets("Sheet3") 
    ws.Activate 
    Dim rngStart As Range 
    Dim rngEnd As Range 
    Set rngStart = Range("A1").Cells(2, 5) 
    Set rngEnd = Range("A1").Cells(19, 5) 
    Dim MidtermAvg As Range 
    Set MidtermAvg = Range(rngEnd.Offset(1, 0), rngEnd.Offset(1, 0)) 
    ' Put in average at the bottom of the range 
    MidtermAvg.Formula = "=AVERAGE(rngEnd:rngStart)" 
End Sub 

下面是一列所有林立的成绩:

63 
44 
87 
96 
67 
82 
58 
71 
61 
77 
63 
30 
93 
38 
89 
89 
93 
93 

回答

3

你失踪了一些工作表引用,
和您的公式有rngStartrngEnd变量躲在一个字符串。
(VBA如何知道这些是变量?)

此外,您需要获取这些范围对象的.Address
这工作:

Sub Scores() 
    Dim ws As Worksheet 
    Set ws = Worksheets("Sheet3") 
    ws.Activate 
    Dim rngStart As Range 
    Dim rngEnd As Range 
    Set rngStart = ws.Range("A1").Cells(2, 5) 
    Set rngEnd = ws.Range("A1").Cells(19, 5) 
    Dim MidtermAvg As Range 
    Set MidtermAvg = ws.Range(rngEnd.Offset(1, 0), rngEnd.Offset(1, 0)) 
    ' Put in average at the bottom of the range 
    MidtermAvg.Formula = "=AVERAGE(" & rngStart.Address & ":" & rngEnd.Address & ")" 
End Sub 
+2

+1 :)一个小的改变? “Set MidtermAvg = ws.Range(rngEnd.Offset(1,0),rngEnd.Offset(1,0))” 第一个应该是“rngStart” – 2012-02-10 03:50:08

+1

谢谢,Siddharth。实际上,该行的目标是将平均值放入数字范围之下的单元格中,所以'rngEnd'使用了两次。它最终会变成类似“E20:E20”的东西。 – bernie 2012-02-10 03:53:00

+0

啊是的!你是对的。我确定感到困惑了一会儿:) – 2012-02-10 03:58:26

1

我不知道为什么你正在使用Range("A1")然后Cells(r,c)方式就可以得到范围"E2:E19"。如果得分在该范围内,那么为什么不如下:

Sub AverageScore() 
    Dim scores As Range 
    Set scores = Range("E2:E" & Range("E2").End(xlDown).Row) 
    Range("E" & scores.End(xlDown).Row).Offset(1, 0) = "Avg: " & Round(WorksheetFunction.Average(scores), 2) 
End Sub 

NB - 我已经采取了四舍五入的平均值为2个点,并增加了labelso的结果来阅读Avg: 71.89但你可以为你改变的自由觉得合适。