dmalovich

asked on

# In MS EXCEL VBA, I want to dynamically calculate count,sum,avg for a row as its added

In column A I have a list of names. Columns B,C,D have AVG,SUM,COUNT. COUNT and SUM get their values from column E,F,G,H and so on. Column B calculates the AVG from SUM and COUNT. From time to time I add info to the sheet which includes names that already exist in column A and add new names if they don't exist in column A. I would like to dynamically add the sum,avg,count to B,C,D as the sheet is updated. I know this can be done with a cell formula but I don't want cells to show #DIV/0! or zeros if there is no information for them. Can this be done with VBA instead? here is sample vba:

For y = 8 To last_cell

If player_name = Worksheets("Current Year").Cells(y, 1) Then

Worksheets("Current Year").Cells(y, 5).Value = position

' what i would like to calculate

Worksheets("Current Year").Cells(y, 2).Value = AVG

Worksheets("Current Year").Cells(y, 3).Value = SUM

Worksheets("Current Year").Cells(y, 4).Value = COUNT of range ' E "y" ' to so on

player_exists = True

End If

For y = 8 To last_cell

If player_name = Worksheets("Current Year").Cells(y, 1) Then

Worksheets("Current Year").Cells(y, 5).Value = position

' what i would like to calculate

Worksheets("Current Year").Cells(y, 2).Value = AVG

Worksheets("Current Year").Cells(y, 3).Value = SUM

Worksheets("Current Year").Cells(y, 4).Value = COUNT of range ' E "y" ' to so on

player_exists = True

End If

ASKER CERTIFIED SOLUTION

membership

This solution is only available to members.

To access this solution, you must be a member of Experts Exchange.

The cell shows #DIV/0 in avg. when the count is 0. I could add an if statement to avoid that error. here is an example.

```
Sub Test()
Dim Player_total_count As Integer
Dim i As Integer
Dim y As Integer
Player_total_count = Application.WorksheetFunction.CountA(Range("A1:A2000"))
i = 2
For i = 2 To Player_total_count
y = Application.WorksheetFunction.CountA(Range("E" & i & ":" & "H" & i))
If y = 0 Then
Worksheets("Current Year").Cells(i, 3).Value = "=sum(E" & i & ":" & "H" & i & ")"
Worksheets("Current Year").Cells(i, 4).Value = "=count(E" & i & ":" & "H" & i & ")"
ElseIf y <> 0 Then
Worksheets("Current Year").Cells(i, 2).Value = "=average(E" & i & ":" & "H" & i & ")"
Worksheets("Current Year").Cells(i, 3).Value = "=sum(E" & i & ":" & "H" & i & ")"
Worksheets("Current Year").Cells(i, 4).Value = "=count(E" & i & ":" & "H" & i & ")"
End If
Next i
End Sub
```

Hi there

I have attached a workbook that contains macro code that should provide what you're looking for.

There are sample columns and values provided.

Each row's avg, sum, count are calculated based on the row contents..that is, in one row you can have 6 cols of values, in another - 8, etc

Run the macro calcall.

Regards

dmang 26871049.xls

I have attached a workbook that contains macro code that should provide what you're looking for.

There are sample columns and values provided.

Each row's avg, sum, count are calculated based on the row contents..that is, in one row you can have 6 cols of values, in another - 8, etc

Run the macro calcall.

Regards

dmang 26871049.xls

ASKER

It worked. Thanks.....

You

__can__use formulas and avoid the display of #DIV/0 and zeros without resorting to a macro.

In column D, the COUNT column, use

=if(count(e1:z1)>0,count(e

Column D will be blank if all the columns E to Z are empty.

Then columns B and C can use the D column result to avoid the unwanted display.

In Column B, the AVG column, use the formula

=if(and(d1<>"" , d1>0),c1/d1,"")

And in column C, the SUM column

=if(and(d1<>"" , d1>0),sum(e1:z1),"")

Note you must check both

__d1<>""__and

__d1>0__for the formula to work.

it can be done with formula and without error like #DIV/0

cellAVG = =IF( ISERROR(AVERAGE(E1:H1)),0,

cellSUM= =SUM(E1:H1)

cell Count= =COUNTIF(E1:H1;">0")

instead of error