2016-05-10 5 views
2

Im Wesentlichen sage ich, beginnen Sie mit dem Durchschnitt aller 4 Semester, wenn Sem 4 Durchschnitt ist "0" oder hat einen Fehler # div/0 dann einfach sem nehmen 1-3 Mittelwerte, wenn Sem 3 avg 0 oder # div/0 ist dann nur Sem 1-2 Durchschnitt, usw.Behalten Sie einen gleitenden Durchschnitt von einem GPA ohne einen div/0 Fehler

Ich habe es zu einem Punkt, wo ich die Fehlermeldung bekommen "nicht in der Lage, den Durchschnitt zu bekommen Eigenschaft für die Arbeitsblattfunktionsklasse. "


Sub sem1avg() 
    If w = 0 Then 
     Worksheets("Sheet1").Range("H1") = "N/A" 
    ElseIf w > 0 Then 
      Application.WorksheetFunction.Average (Range("B2:B10")) 
    End If 
End Sub 

Sub sem2avg() 
    If x = 0 Then 
     Call sem1avg 
    ElseIf x > 0 Then 
     Worksheets("Sheet1").Range.cell(H1) = _ 
      Application.WorksheetFunction.Average(B11, B23) 
    End If 
End Sub 

Sub sem3avg() 
    If y = 0 Then 
     Call sem2avg 
    ElseIf y > 0 Then 
     Worksheets("Sheet1").Range(H1) = _ 
      Application.WorksheetFunction.Average(B11, B23, E11) 
    End If 
End Sub 

Sub sem4avg() 
    Dim w As Long 
    Dim x As Long 
    Dim y As Long 
    Dim z As Long 

    w = Worksheets("Sheet1").Range("B11") 
    x = Worksheets("Sheet1").Range("B23") 
    y = Worksheets("Sheet1").Range("E11") 
    z = Worksheets("Sheet1").Range("E23") 

    If z = 0 Then 
     Call sem3avg 
    ElseIf z > 0 Then 
     Worksheets("Sheet1").Range("H1") = _ 
      Application.WorksheetFunction.Average("B11, B23, E11, E23") 
    End If 

End Sub 
+1

Wow, hier viel los. Gute erste Anstrengung. Wenn Sie andere Subs aufrufen, müssen Sie Argumente übergeben. 'Wenn y = 0 Then' wird nicht funktionieren, wenn Sie es nicht bestehen. Ich lasse Sie erforschen, wie man Argumente übergibt^_^ – findwindow

+2

Muss dies in VBA getan werden? Könnten Sie einfach '= Averageif' Funktion verwenden? – gtwebb

+0

Sie scheinen verwirrt darüber zu sein, wie Bereiche im Code verwendet werden. Sie können nicht einfach die Adresse des Bereichs in den Code eingeben. Der richtige Weg ist der in 'sem4avg' (' Worksheets ("Sheet1") verwendete Bereich. Bereich ("B11") ') – litelite

Antwort

1

Natürlich können Sie nur die aggregierte() Funktion verwenden:

=AGGREGATE(1,6,B11,E11,B23,E23) 

Die aggregierte() Funktion im Jahr 2010 eingeführt wurde, zu behandeln mit diesem spezifischen Problem. Das erste Kriterium sagt der Funktion, dass wir den Durchschnitt wollen, das zweite sagt der Formel, dass Fehler ausgeschlossen werden sollen. Der dritte ist der Bereich.

![enter image description here

Um mit den 0 und die Fehler werden diese Formel es tun:

=SUM(IF(ISNUMBER(B11),B11),IF(ISNUMBER(B23),B23),IF(ISNUMBER(E11),E11),IF(ISNUMBER(E23),E23))/SUM(IF(ISNUMBER(B11),IF(B11>0,1)),IF(ISNUMBER(B23),IF(B23>0,1)),IF(ISNUMBER(E11),IF(E11>0,1)),IF(ISNUMBER(E23),IF(E23>0,1))) 

enter image description here

+0

Dies vernachlässigt die Anforderung von OP für das Testen von "z"? Oder mit anderen Worten, wie vergleicht sich das mit dem Durchschnitt? – findwindow

+1

Oh und AverageIf() wird wegen der möglichen Fehler nicht funktionieren. –

+0

Meine erste Frage ist null, jetzt, da ich "Aggregat" mehr verstehe. Also gibt es wirklich keinen Nutzen für 'Averageif'. – findwindow

1

Es gibt mehr als eine Sache, die passiert, und bisher hat niemand alle davon betroffen.

Sie müssen Ihre Argumente übergeben.

Sie müssen die ‚Durchschnitt‘ Funktion verwenden, richtig

Sie müssen auch Ihre Variablen zu Einzel ändern, Lange wird ich auf- oder abrunden, die wirklich Ihre Ergebnisse vermasseln.

Hier ist ein Beispiel dafür, wie es zu beheben:

Sub sem3avg(ByVal w As Single, ByVal x As Single, ByVal y As Single) 
If y = 0 Then 
    Call sem2avg 
ElseIf y > 0 Then 
Worksheets("Sheet1").Range("H1").Value = Application.WorksheetFunction.Average(w, x, y) 
End If 


End Sub 

Sub sem4avg() 
Dim w As Single 
Dim x As Single 
Dim y As Single 
Dim z As Single 

w = Worksheets("Sheet1").Range("B11") 
x = Worksheets("Sheet1").Range("B23") 
y = Worksheets("Sheet1").Range("E11") 
z = Worksheets("Sheet1").Range("E23") 


If z = 0 Then 
Call sem3avg(w, x, y) 
ElseIf z > 0 Then 
Worksheets("Sheet1").Range("H1").Value = Application.WorksheetFunction.Average(w, x, y, z) 
End If 
End Sub 
+0

"niemand hat alles erreicht", denn selten lernen Menschen, wenn sie vor allem mit einem Anfänger konfrontiert werden. Auch, wenn Sie schlüsselfertig bereitstellen möchten, bleibt 'Call sem2avg' hängen. – findwindow

+0

War nicht versucht, übermütig zu sein und wollte keinen Turnkey bereitstellen. Ich habe sem2avg und sem1avg verlassen, damit er die beiden selbst herausfinden kann. – Phil

+0

@phil, Warum muss ich "byval" verwenden? Habe ich bereits DIM verwendet, um diese Variablen zuzuweisen? – cdipaola

Verwandte Themen