データに数値のないものが含まれるエラー処理を含めています。
計算の排出先は、* がついている部分ですから、列の隣なら、.Cells(i, 2).Value ですから、この2 を換えてあげればよいです。また、Celltop のセルの先頭を最初に設定すれば、場所を変えることが出来ます。 Average 関数は使いませんが、Average関数の文字に対するの考え方を反映するようにしました。
ただ、これは、あくまでも、VBAマクロという前提で、並んでいる環境なら関数でも可能なような気がします。
'//
Sub EachAvarages()
Dim CellTop As Range, rng As Range
Dim i As Long, cnt As Long
Dim dSum As Double
Dim F As Long, iFlg As Integer
Set CellTop = Range("G5") 'セルの先頭
Set rng = Range(CellTop, Cells(Rows.Count, CellTop.Column).End(xlUp))
If Application.CountA(rng) = 0 Then MsgBox "データがありません。", 48: Exit Sub
'rng.Offset(, 1).ClearContents '右隣の列のデータ削除(必要に応じて外してください)
Application.ScreenUpdating = False
With rng
For i = 1 To rng.Rows.Count
If F = 0 Then F = i: iFlg = Val(Cells(i, 1)) > -1
If i = rng.Rows.Count Then
If VarType(.Cells(i, 1)) = vbDouble Then cnt = cnt + 1
.Cells(i, 2).Value = (dSum + Val(.Cells(i, 1).Value)) / cnt '*
Exit For
End If
If VarType(.Cells(i + 1, 1)) = vbDouble Then
iFlg = Val(.Cells(i, 1).Value) > -1
If VarType(.Cells(i, 1).Value) <> vbDouble Then iFlg = 0
If CInt(Val(.Cells(i + 1, 1).Value) > -1) <> iFlg Then
dSum = dSum + Val(.Cells(i, 1).Value)
cnt = cnt + 1
.Cells(i, 2).Value = dSum / cnt '*
dSum = 0: F = i: cnt = 0
Else
dSum = dSum + Val(.Cells(i, 1).Value)
cnt = cnt + 1
End If
Else
dSum = dSum + Val(.Cells(i, 1).Value)
End If
Next i
End With
Application.ScreenUpdating = True
Set rng = Nothing: Set CellTop = Nothing
End Sub