Option Explicit

' =========================
' HÀM TRÍCH XUẤT SỐ TỪ CHUỖI (NẾU Ô TRỐNG MẶC ĐỊNH LÀ 1)
' =========================
Function ExtractNumber(ByVal str As String) As Double
    Dim temp As String
    Dim i As Integer
    Dim hasDecimal As Boolean

    ' Nếu ô trống, mặc định trả về 1
    If IsEmpty(str) Or Trim(str) = "" Then
        ExtractNumber = 1
        Exit Function
    End If

    hasDecimal = False
    For i = 1 To Len(str)
        If Mid(str, i, 1) Like "[0-9]" Then
            temp = temp & Mid(str, i, 1)
        ElseIf Mid(str, i, 1) = "." And Not hasDecimal Then
            temp = temp & Mid(str, i, 1)
            hasDecimal = True
        End If
    Next i

    ExtractNumber = IIf(IsNumeric(temp), CDbl(temp), 1)
End Function

' =========================
' DANH SÁCH 21 HÀM TỔNG HỢP
' =========================
Function NDTLK() As Long
    NDTLK = CountOccurrences("*nâng*") + CountOccurrences("*dời*")
End Function

Function KIEMTRA() As Long
    KIEMTRA = CountOccurrences("*kiểm*tra*")
End Function

Function CAT0M3() As Double
    CAT0M3 = SumOccurrences("*cắt*0m3*")
End Function

Function CAT2KY() As Double
    CAT2KY = SumOccurrences("*cắt*2*kỳ*")
End Function

Function CAT3KY() As Double
    CAT3KY = SumOccurrences("*cắt*3*kỳ*")
End Function

Function XOADANHBO() As Double
    XOADANHBO = SumOccurrences("*xóa*danh*bộ*")
End Function

Function MOCHIEMRON() As Double
    MOCHIEMRON = SumOccurrences("*mở*chiêm*ron*")
End Function

Function MODANHBO() As Double
    MODANHBO = SumOccurrences("*mở*danh*bộ*")
End Function

Function HOANTHIENMATBANG() As Long
    HOANTHIENMATBANG = CountOccurrences("*hoàn*thiện*mặt*bằng*")
End Function

Function GUI2KY() As Double
    GUI2KY = SumOccurrences("*gửi*2*kỳ*")
End Function

Function DOTIM() As Long
    DOTIM = CountOccurrences("*dò*tìm*")
End Function

Function THICONG() As Double
    THICONG = SumOccurrences("*thi*công*")
End Function

Function DIDOI() As Double
    DIDOI = SumOccurrences("*di*dời*")
End Function

Function CHUYENMANG() As Double
    CHUYENMANG = SumOccurrences("*chuyển*mạng*")
End Function

Function GUI3KY() As Double
    GUI3KY = SumOccurrences("*gửi*3*kỳ*")
End Function

Function DHTD() As Double
    DHTD = SumOccurrences("*tận*dụng*")
End Function

Function DHM() As Double
    DHM = SumOccurrences("*đồng*hồ*mới*")
End Function

Function DNH() As Double
    DNH = SumOccurrences("*niên*hạn*")
End Function

Function KHONGQUAY() As Double
    KHONGQUAY = SumOccurrences("*không*quay*")
End Function

Function KHM() As Double
    KHM = SumOccurrences("*khách*hàng*mua*")
End Function

Function LTLK() As Long
    LTLK = CountOccurrences("*lắp*")
End Function

' =========================
' HÀM HỖ TRỢ ĐẾM VÀ CỘNG GIÁ TRỊ
' =========================
Function CountOccurrences(ByVal searchText As String) As Long
    Dim ws As Worksheet, rng As Range, cell As Range
    Dim count As Long
    Dim pattern As String
    Dim startsWithStar As Boolean, endsWithStar As Boolean
    Application.Volatile
    count = 0
    
    ' Kiểm tra vị trí của *
    startsWithStar = (Left(searchText, 1) = "*")
    endsWithStar = (Right(searchText, 1) = "*")
    pattern = Replace(searchText, "*", "") ' Loại bỏ * để lấy từ khóa chính
    pattern = LCase(pattern) ' Chuyển thành chữ thường
    
    For Each ws In ThisWorkbook.Sheets
        If ws.Name <> "BAO CAO" And ws.Name <> "XI BE VUNG" Then
            Set rng = ws.Range("A5:K" & ws.Cells(ws.Rows.Count, 1).End(xlUp).Row)
            
            If Application.CountA(rng.Columns(6)) > 0 And Application.CountA(rng.Columns(8)) > 0 Then
                For Each cell In rng.Columns(6).Cells
                    If Trim(UCase(cell.Offset(0, 2).Value)) = "R" Then
                        Dim cellText As String
                        cellText = LCase(cell.Value)
                        
                        ' Kiểm tra khớp dựa trên vị trí của *
                        If startsWithStar And endsWithStar Then
                            ' *text*: Khớp bất kỳ chuỗi nào chứa pattern
                            If InStr(1, cellText, pattern, vbTextCompare) > 0 Then
                                count = count + 1
                            End If
                        ElseIf startsWithStar Then
                            ' *text: Khớp chuỗi kết thúc bằng pattern
                            If Right(cellText, Len(pattern)) = pattern Then
                                count = count + 1
                            End If
                        ElseIf endsWithStar Then
                            ' text*: Khớp chuỗi bắt đầu bằng pattern
                            If Left(cellText, Len(pattern)) = pattern Then
                                count = count + 1
                            End If
                        Else
                            ' Không có *: Khớp chính xác pattern
                            If cellText = pattern Then
                                count = count + 1
                            End If
                        End If
                    End If
                Next cell
            End If
        End If
    Next ws

    CountOccurrences = count
End Function

Function SumOccurrences(ByVal searchText As String) As Double
    Dim ws As Worksheet, rng As Range, cell As Range
    Dim countSum As Double, numberInI As Double
    Dim pattern As String
    Dim startsWithStar As Boolean, endsWithStar As Boolean
    Application.Volatile
    countSum = 0
    
    ' Kiểm tra vị trí của *
    startsWithStar = (Left(searchText, 1) = "*")
    endsWithStar = (Right(searchText, 1) = "*")
    pattern = Replace(searchText, "*", "") ' Loại bỏ * để lấy từ khóa chính
    pattern = LCase(pattern) ' Chuyển thành chữ thường
    
    For Each ws In ThisWorkbook.Sheets
        If ws.Name <> "BAO CAO" And ws.Name <> "XI BE VUNG" Then
            Set rng = ws.Range("A5:K" & ws.Cells(ws.Rows.Count, 1).End(xlUp).Row)
            
            If Application.CountA(rng.Columns(6)) > 0 And Application.CountA(rng.Columns(8)) > 0 Then
                For Each cell In rng.Columns(6).Cells
                    If Trim(UCase(cell.Offset(0, 2).Value)) = "R" Then
                        Dim cellText As String
                        cellText = LCase(cell.Value)
                        
                        ' Kiểm tra khớp dựa trên vị trí của *
                        If startsWithStar And endsWithStar Then
                            ' *text*: Khớp bất kỳ chuỗi nào chứa pattern
                            If InStr(1, cellText, pattern, vbTextCompare) > 0 Then
                                numberInI = ExtractNumber(cell.Offset(0, 3).Value)
                                countSum = countSum + 1 * numberInI
                            End If
                        ElseIf startsWithStar Then
                            ' *text: Khớp chuỗi kết thúc bằng pattern
                            If Right(cellText, Len(pattern)) = pattern Then
                                numberInI = ExtractNumber(cell.Offset(0, 3).Value)
                                countSum = countSum + 1 * numberInI
                            End If
                        ElseIf endsWithStar Then
                            ' text*: Khớp chuỗi bắt đầu bằng pattern
                            If Left(cellText, Len(pattern)) = pattern Then
                                numberInI = ExtractNumber(cell.Offset(0, 3).Value)
                                countSum = countSum + 1 * numberInI
                            End If
                        Else
                            ' Không có *: Khớp chính xác pattern
                            If cellText = pattern Then
                                numberInI = ExtractNumber(cell.Offset(0, 3).Value)
                                countSum = countSum + 1 * numberInI
                            End If
                        End If
                    End If
                Next cell
            End If
        End If
    Next ws

    SumOccurrences = countSum
End Function

' =========================
' CẬP NHẬT TỰ ĐỘNG KHI THAY ĐỔI DỮ LIỆU
' =========================
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    ThisWorkbook.Sheets("BAO CAO").Calculate
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    If Sh.Name = "BAO CAO" Then
        Application.Calculate
    End If
End Sub