Khi soạn giáo án, đề thi hay tài liệu kỹ thuật, việc sao chép công thức toán LaTeX (kẹp giữa $…$ hoặc $$…$$) từ ChatGPT, Claude, DeepSeek hay Overleaf sang Microsoft Word rất phổ biến.

Ở phiên bản v1 trước đây[cite: 1], chúng ta đã tận dụng bộ parser LaTeX nội sinh của Office 2019 / Microsoft 365 để chuyển đổi hàng loạt[cite: 1]. Tuy nhiên, trong thực tế tài liệu dài vài chục trang, chỉ cần 1-2 công thức sai cú pháp LaTeX (thiếu ngoặc \frac{}{, dùng lệnh Word không hỗ trợ) là macro v1 có thể bị gián đoạn hoặc lướt qua mà không biết lỗi ở đâu.

Bản v2 nâng cấp cơ chế:

  1. Giữ nguyên ưu điểm không cần cắt chuỗi thủ công[cite: 1].

  2. Bổ sung bộ bẫy lỗi On Error Resume Next.

  3. Tự động đếm và bôi vàng (HighlightColorIndex = wdYellow) chính xác các vị trí công thức bị lỗi để người dùng kiểm tra lại sau khi chạy xong.

1. Cơ chế hoạt động & So sánh giữa bản v1 và v2

Tiêu chí Bản v1 (Cơ bản)[cite: 1] Bản v2 (Nâng cấp)
Xử lý cú pháp lỗi Không bẫy lỗi; gặp mã LaTeX hỏng dễ crash hoặc biến dạng hiển thị[cite: 1]. Bẫy lỗi cục bộ (Err.Number <> 0), không dừng chương trình.
Nhận diện lỗi trực quan Người dùng phải tự dò mắt lại toàn bộ văn bản[cite: 1]. Tự động bôi vàng (Highlight) ngay vị trí công thức sai.
Thống kê kết quả Chỉ báo tổng số công thức đã quét qua[cite: 1]. Tách biệt rõ ràng: Số thành công & Số lỗi cú pháp.
Hiệu năng & Trực quan Render kèm cuộn màn hình realtime qua DoEvents[cite: 1]. Giữ nguyên realtime, thanh StatusBar hiển thị chi tiết tiến độ.

Bản chất kỹ thuật cần nắm:

  • Tại sao không cần hàm Mid() để cắt dấu $?[cite: 1] Từ Office 2019/365, lệnh OMaths.Add kết hợp .BuildUp tự động hiểu cặp dấu $ hoặc $$ là ranh giới khối toán học (math delimiter)[cite: 1]. Việc cắt chuỗi thủ công bằng VBA vừa thừa, vừa dễ làm lệch con trỏ Range.Start / Range.End trong tài liệu phức tạp[cite: 1].

  • Thứ tự quét: Luôn xử lý $$...$$ (Display Math) trước rồi mới đến $..$ (Inline Math)[cite: 1]. Nếu quét dấu đơn trước, biểu thức $$...$$ sẽ bị regex nhận nhầm thành 2 khối đô-la đơn kề nhau, làm vỡ khung hiển thị.

2. Mã nguồn VBA chuẩn hóa (Phiên bản v2)

Nhấn Alt + F11 trong Word > vào Insert > Module > Dán đoạn mã sau:

VBA
Sub ConvertAllInlineAndDisplayLatex_Realtime_v2()
    Dim doc As Document
    Dim R As Range
    Dim R_Equation As Range
    Dim Latex As String
    Dim countSuccess As Long
    Dim countFail As Long

    Set doc = ActiveDocument
    countSuccess = 0
    countFail = 0
    
    ' Bat cap nhat man hinh de nguoi dung theo doi truc quan
    Application.ScreenUpdating = True

    ' =======================================================
    ' GIAI DOAN 1: TIM VA CHUYEN DOI DANG DO LA DOI $$...$$
    ' =======================================================
    Set R = doc.Content
    With R.Find
        .ClearFormatting
        .Text = "\$$([!\$]@)\$$"
        .MatchWildcards = True
        .Forward = True
        .Wrap = wdFindStop
    End With

    Do While R.Find.Execute
        Set R_Equation = R.Duplicate
        Latex = R_Equation.Text
        
        If Len(Latex) > 0 Then
            R_Equation.Text = Latex
            doc.OMaths.Add R_Equation
            
            ' Bay loi neu cu phap LaTeX khong hop le
            On Error Resume Next
            R_Equation.OMaths(1).BuildUp
            If Err.Number <> 0 Then
                countFail = countFail + 1
                R_Equation.HighlightColorIndex = wdYellow ' Boi vang de kiem tra lai
                Err.Clear
            Else
                countSuccess = countSuccess + 1
            End If
            On Error GoTo 0
        End If
        
        ' Cuon man hinh va cap nhat tien do xu ly
        R_Equation.Select
        DoEvents
        Application.StatusBar = "Dang xu ly $$: Thanh cong " & countSuccess & " | Loi: " & countFail
        
        ' Dich con tro tim kiem tiep theo ra sau cong thuc vua xu ly
        R.Start = R_Equation.End
    Loop

    ' =======================================================
    ' GIAI DOAN 2: TIM VA CHUYEN DOI DANG DO LA DON $...$
    ' =======================================================
    Set R = doc.Content
    With R.Find
        .ClearFormatting
        .Text = "\$([!\$]@)\$"
        .MatchWildcards = True
        .Forward = True
        .Wrap = wdFindStop
    End With

    Do While R.Find.Execute
        Set R_Equation = R.Duplicate
        Latex = R_Equation.Text
        
        If Len(Latex) > 0 Then
            R_Equation.Text = Latex
            doc.OMaths.Add R_Equation
            
            ' Bay loi neu cu phap LaTeX khong hop le
            On Error Resume Next
            R_Equation.OMaths(1).BuildUp
            If Err.Number <> 0 Then
                countFail = countFail + 1
                R_Equation.HighlightColorIndex = wdYellow ' Boi vang de kiem tra lai
                Err.Clear
            Else
                countSuccess = countSuccess + 1
            End If
            On Error GoTo 0
        End If
        
        R_Equation.Select
        DoEvents
        Application.StatusBar = "Dang xu ly $: Thanh cong " & countSuccess & " | Loi: " & countFail
        
        R.Start = R_Equation.End
    Loop

    ' Tra ve trang thai mac dinh
    Application.StatusBar = False
    MsgBox "Hoan tat!" & vbCrLf & _
           "- Chuyen doi thanh cong: " & countSuccess & " cong thuc" & vbCrLf & _
           "- Loi cu phap: " & countFail & " (da duoc boi vang trong van ban)", _
           vbInformation, "Thong Bao Ket Qua"
End Sub

3. Các bước thực hiện & Lưu ý thực tế

  1. Thiết lập chế độ toán học mặc định trong Word:

    • Vào tab Insert > Equation hoặc nhấn Alt + =.

    • Trên thanh công cụ Equation, chọn nút LaTeX (thay vì Unicode). Word cần cấu hình này để hiểu cú pháp khi .BuildUp được gọi qua code.

  2. Xử lý tài liệu dung lượng lớn (trên 50 trang):

    • Trong code có sử dụng R_Equation.Select và DoEvents để cuộn màn hình và tránh bị treo giao diện (Not Responding).

    • Nếu tài liệu quá dài và cần tối ưu tốc độ tối đa, bạn có thể comment lại 2 dòng R_Equation.Select và DoEvents, đồng thời đặt Application.ScreenUpdating = False ở đầu macro để code chạy ngầm tốc độ cao.

  3. Cách rà soát lại công thức lỗi sau khi chạy:

    • Nhấn Ctrl + F, chuyển sang tab Find > More > Format > Highlight để nhảy nhanh đến các vị trí bôi màu vàng sửa lại các cú pháp mà Word từ chối nhận diện.