OK, theo dữ liệu và cấu trúc bảng biểu của bạn tôi giúp bạn như sau:
1) Tôi chuyển tất cả dạng số kiểu chuỗi về lại kiểu số (dùng Find đổi dấu phẩy về dấu chấm)
2) Tôi cũng viết code như sau:
[GPECODE=vb]Option Explicit
Const ClrRed As Long = &HFF&
Const ClrPurple As Long = &HA03070
Const ClrYellow As Long = &HFFFF&
Const ClrGreen As Long = &H50B000
Sub NghiaDepTrai()
Dim LastRow As Long
With Sheets("Bieu 2")
.AutoFilterMode = False
LastRow = .Range("E" & Rows.Count).End(xlUp).Row
If LastRow < 5 Then
.Range("E4:S4").AutoFilter
Exit Sub
End If
Dim ArrRows()
Dim Total As String
Dim n As Long, r As Long
Dim f As WorksheetFunction
Dim ClrRng As Range, ColorRange As Range
Set f = WorksheetFunction
Total = "C" & ChrW(7897) & "ng"
Set ColorRange = .Range("A5:A" & LastRow)
ColorRange.ClearContents
For Each ClrRng In ColorRange
If ClrRng.Interior.Color = ClrPurple Then
r = r + 1
ClrRng = f.Roman(r)
End If
Next
Set ColorRange = ColorRange.Offset(, 4)
For Each ClrRng In ColorRange
If ClrRng.Interior.Color = ClrRed Then
n = n + 1
ReDim Preserve ArrRows(1 To n)
ClrRng = Total
ArrRows(n) = ClrRng.Row
ElseIf ClrRng = "" Then
n = n + 1
ReDim Preserve ArrRows(1 To n)
ArrRows(n) = ClrRng.Row - 1
Exit For
End If
Next
If n Then
Dim c As Byte
Dim CalculatedRange As Range
Dim eSumRow As Long, fSumRow As Long, TotalRow As Long
For r = 1 To n - 1
TotalRow = ArrRows(r)
fSumRow = TotalRow + 1
eSumRow = ArrRows(r + 1)
If TotalRow = eSumRow Then
.Range("F" & TotalRow & ":S" & TotalRow).ClearContents
Exit For
Else
Set CalculatedRange = .Range("F" & fSumRow & ":F" & eSumRow)
With .Range("F" & TotalRow)
For c = 0 To 13
Select Case c
Case 2, 12
.Offset(, c) = f.Average(CalculatedRange.Offset(, c))
Case Else
.Offset(, c) = f.Sum(CalculatedRange.Offset(, c))
End Select
Next
End With
End If
Next
End If
.Range("E4:S4").AutoFilter
End With
End Sub
[/GPECODE]
3) Việc còn lại, bạn chỉ bấm nút
Tính toán.
P/s: Xem file tại bài #6