2016-12-12 2 views
2

Ich habe eine Schleife Makro berechnen Durchschnittswerte von drei Werten. In seltenen Fällen sind alle drei Werte möglicherweise leer, daher muss das Makro die Zelle verlassen, in der der Durchschnitt leer gedruckt wird, und mit der nächsten Iteration der Schleife fortfahren.Durchschnitt mit allen Leerwerten Fehlerbehandlung

Ich habe keine Fehlerbehandlung vor, also nicht sicher, der beste Weg, um es zu stoßen. Hier ist mein Code:

Sub sumavg() 
     Dim i As Long, j As Long 
     With Worksheets("datasummary") 
      For i = 1 To .Range("A" & .Rows.Count).End(xlUp).Row Step 5 
       For j = 1 To 6 
        With .Rows(i + 2) 
         .Columns(19 + j).Value = Application.WorksheetFunction.Average(.Columns(j), .Columns(j + 5), .Columns(j + 10)) 
        End With 
        With .Rows(i + 3) 
         .Columns(19 + j).Value = Application.WorksheetFunction.Average(.Columns(j), .Columns(j + 5), .Columns(j + 10)) 
        End With 
       Next 
      Next 

     End With 
    End Sub 

Here is a screenshot of the data

+0

Try 'On Error Resume Next' – nightcrawler23

+0

@ nightcrawler23 Ich habe das in Betracht gezogen. Nur besorgt, die Ergebnisse könnten unvorhersehbar sein, da der Fehler nicht behandelt wird. Und wird diese Zeile am Anfang des Makros geschrieben oder kann sie in die Schleife geschrieben werden? – shecodes

+1

@shecodes, Sie haben recht, wenn Sie 'On Error Resume Next' vermeiden, da es eine" blinde "Lösung für den einen Fehler ist, den Sie bereits kennen (und das ist in Ordnung) und andere mögliche Fehler, von denen Sie nichts wissen (und das ist nicht gut). Am besten ist _catch_ der Fehler und behandle ihn entsprechend, da eine _real_ Fehlerbehandlung es dir erlauben könnte oder die Objektfunktionen von 'Application' zu verwenden, um mögliche Fehler in den zurückgegebenen Wert zu verpacken (siehe meine Antwort) – user3598756

Antwort

1

können Sie ApplicationAverage() Funktion des Objekts aufrufen und das Ergebnis überprüfen gegen sein ein Fehler:

Sub sumavg() 
    Dim i As Long, j As Long 
    Dim res As Variant '<--| this will store the result of Application.Average() function 

    With Worksheets("datasummary") 
     For i = 1 To .Range("A" & .Rows.count).End(xlUp).row Step 5 
      For j = 1 To 6 
       With .Rows(i + 2) 
        res = Application.Average(.Columns(j), .Columns(j + 5), .Columns(j + 10)) 
        If Not IsError(res) Then .Columns(19 + j).Value = Application.WorksheetFunction.Average(.Columns(j), .Columns(j + 5), .Columns(j + 10)) 
       End With 
       With .Rows(i + 3) 
        res = Application.Average(.Columns(j), .Columns(j + 5), .Columns(j + 10)) 
        If Not IsError(res) Then .Columns(19 + j).Value = Application.WorksheetFunction.Average(.Columns(j), .Columns(j + 5), .Columns(j + 10)) 
       End With 
      Next 
     Next 

    End With 
End Sub 
1

Sie On Error Resume Next versuchen können, oder fügen Sie einfach Nullen auf die Werte Sie sind durchschnittlich.

Sub sumavg() 
    Dim i As Long, j As Long 
    With Worksheets("Sheet2") 
     For i = 1 To .Range("A" & .Rows.Count).End(xlUp).Row Step 5 
      For j = 1 To 6 
       With .Rows(i + 2) 
        .Columns(19 + j).Value = WorksheetFunction.Average(.Columns(j) + 0, .Columns(j + 5) + 0, .Columns(j + 10) + 0) 
       End With 
       With .Rows(i + 3) 
        .Columns(19 + j).Value = WorksheetFunction.Average(.Columns(j) + 0, .Columns(j + 5) + 0, .Columns(j + 10) + 0) 
       End With 
      Next 
     Next 

    End With 
End Sub 
+0

Ich kann keine Nullen hinzufügen weil ich in der Lage sein muss, zwischen Versuchen zu unterscheiden, die tatsächlich einen 0-Wert haben, und Studien, die ausgeschlossen werden müssen (dh leer). Ich werde es als nächstes versuchen. – shecodes

+0

die 'On Error Resume Next' scheint gut zu funktionieren. – shecodes

+0

Großartig! BTW 'On Error Resume Next' sollte in das Unterprogramm gehen. für Ihren Fall kann es direkt nach dem 'Sub sumavg()' – nightcrawler23