Avg Calculation

B

Buddy

Sub Inspectthis()

Dim F As String
Dim I As Integer
Dim PrevRow As Long
Dim R As Long
Dim Rng As Range
Dim RngEnd As Range
Dim SumArray As Variant
Dim Wks As Worksheet

Set Wks = Worksheets("Sheet1")

SumArray = Array("O", "R", "U", "X", "AA", "AD", "AG")

Set Rng = Wks.Range("A2")
Set RngEnd = Wks.Cells(Rows.Count, Rng.Column).End(xlUp)
Set Rng = IIf(RngEnd.Row < Rng.Row, Rng, Wks.Range(Rng, RngEnd))

PrevRow = 2

For R = 2 To Rng.Rows.Count
If Rng.Item(R) = "Renovation" Then
For I = 0 To UBound(SumArray)
F = "=SUM(" & SumArray(I) & PrevRow & ":" & SumArray(I) & R & ")"
Wks.Cells(R + 1, SumArray(I)).Formula = F
Next I
PrevRow = R
End If
Next R

End Sub

The macro above will inspect every row in Column A for the text Renovation.
When the text Renovation is found the average formula, =Average(Range:Range)
will be inserted in the same row in Columns O, R, U, X, AA, AD, AG so that
all the rows above the formula with numbers will be included in the
calculation just as if I clicked the AutoSum icon and set it to average. The
problem I am having with macro above is that the formula range seems to be
grabbing into the calculation 1 extra row above what it should be including
in the formula which is messing up the computation. Can you help me fix this
macro so that it stops grabbing the 1 extra row above so the calculation is
correct?
 
J

Jacob Skaria

Try out the below macro

Sub MyMacro()
Dim ws As Worksheet, lngRow As Long, lngStartRow As Long

lngStartRow = 2
Set ws = Worksheets("Sheet1")

For lngRow = lngStartRow To ws.Cells(Rows.Count, "A").End(xlUp).Row
If UCase(ws.Range("A" & lngRow)) = UCase("Renovation") Then
For lngCol = 15 To 33 Step 3
ws.Cells(lngRow, lngCol).FormulaR1C1 = _
"=SUM(R[-" & lngRow - lngStartRow & "]C:R[-1]C)"
Next
lngStartRow = lngRow + 1 'mark this line if you need cummulative totals
End If
Next
End Sub
 
B

Buddy

Jacob, I think you should change your name to Mr. Wizard because you are the
man! This operates beautifully. Thank you!

Jacob Skaria said:
Try out the below macro

Sub MyMacro()
Dim ws As Worksheet, lngRow As Long, lngStartRow As Long

lngStartRow = 2
Set ws = Worksheets("Sheet1")

For lngRow = lngStartRow To ws.Cells(Rows.Count, "A").End(xlUp).Row
If UCase(ws.Range("A" & lngRow)) = UCase("Renovation") Then
For lngCol = 15 To 33 Step 3
ws.Cells(lngRow, lngCol).FormulaR1C1 = _
"=SUM(R[-" & lngRow - lngStartRow & "]C:R[-1]C)"
Next
lngStartRow = lngRow + 1 'mark this line if you need cummulative totals
End If
Next
End Sub



--
Jacob


Buddy said:
Sub Inspectthis()

Dim F As String
Dim I As Integer
Dim PrevRow As Long
Dim R As Long
Dim Rng As Range
Dim RngEnd As Range
Dim SumArray As Variant
Dim Wks As Worksheet

Set Wks = Worksheets("Sheet1")

SumArray = Array("O", "R", "U", "X", "AA", "AD", "AG")

Set Rng = Wks.Range("A2")
Set RngEnd = Wks.Cells(Rows.Count, Rng.Column).End(xlUp)
Set Rng = IIf(RngEnd.Row < Rng.Row, Rng, Wks.Range(Rng, RngEnd))

PrevRow = 2

For R = 2 To Rng.Rows.Count
If Rng.Item(R) = "Renovation" Then
For I = 0 To UBound(SumArray)
F = "=SUM(" & SumArray(I) & PrevRow & ":" & SumArray(I) & R & ")"
Wks.Cells(R + 1, SumArray(I)).Formula = F
Next I
PrevRow = R
End If
Next R

End Sub

The macro above will inspect every row in Column A for the text Renovation.
When the text Renovation is found the average formula, =Average(Range:Range)
will be inserted in the same row in Columns O, R, U, X, AA, AD, AG so that
all the rows above the formula with numbers will be included in the
calculation just as if I clicked the AutoSum icon and set it to average. The
problem I am having with macro above is that the formula range seems to be
grabbing into the calculation 1 extra row above what it should be including
in the formula which is messing up the computation. Can you help me fix this
macro so that it stops grabbing the 1 extra row above so the calculation is
correct?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top