2016-12-12 1 views
2

나는 평균값을 계산하는 루핑 매크로를 가지고 있습니다. 희소 한 경우에 3 개 값 모두가 공백 일 수 있으므로 매크로를 인쇄하여 평균값이 인쇄되지 않은 셀을 비워두고 루프의 다음 반복을 계속해야합니다.모든 공백 값과 평균 오류 처리

이전에는 오류 처리를 수행하지 않았으므로이 문제를 해결하는 가장 좋은 방법은 없습니다.

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

시도'오류에 재개 Next' – nightcrawler23

+0

@ nightcrawler23 나는 그렇게 생각했다. 오류가 실제로 처리되지 않으므로 결과를 예측할 수 없을지 모른다고 걱정했습니다. 그리고 그 라인은 매크로의 맨 위에 쓰여져 있는가? 아니면 루프 안에 쓰여질 수 있는가? – shecodes

+1

@shecodes, 당신은 "On Error Resume Next"해결책을 피하려고합니다. 왜냐하면 그것은 당신이 이미 알고있는 하나의 에러를 다루는 "blind"이기 때문에 (당신이 알지 못하는 다른 가능한 에러들과 함께) 그리고 그것은 좋지 않다). _real_ 에러 핸들링으로 반환 된 값에서 가능한 에러를 감쌀 수있는'Application'의 오브젝트 기능을 사용하거나 사용하도록 허용하는 것이 가장 좋습니다. (제 대답 참조) – user3598756

답변

1

당신이 Application 개체의 Average() 함수를 호출하고 오류 인에 대해 그 결과를 확인할 수 있습니다

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

당신은 On Error Resume Next을 시도하거나 단순히 평균 한 값에 0을 추가 할 수 있습니다 : 여기 내 코드입니다.

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

0을 추가 할 수 없습니다. 왜냐하면 나는 실제로 0의 가치를 갖는 시련과 배제되어야하는 시련 (즉, 공백)을 구별 할 수 있어야하기 때문입니다. 다음에 이력서를 시험해 보겠습니다. – shecodes

+0

'On Error Resume Next '가 정상적으로 작동하는 것 같습니다. – shecodes

+0

좋아요! BTW'On Error Resume Next'는 서브 루틴 안에 들어가야합니다. 귀하의 경우'Sub sumavg()'바로 뒤에있을 수 있습니다. – nightcrawler23