Eyal tự hỏi liệu có cách nào để chạy macro tự động nếu người dùng nhập một từ hoặc cụm từ cụ thể.

Thật không may, không có thủ tục sự kiện Word VBA nào sẽ phát hiện khi văn bản được nhập vào tài liệu. Tuy nhiên, Word phát hiện nội bộ khi một từ hoàn chỉnh được nhập để nó có thể thực hiện những việc như kiểm tra chính tả, Tự động sửa và cập nhật số lượng từ. Tuy nhiên, bạn không thể khai thác phương pháp phát hiện nội bộ này.

Có lẽ cách tiếp cận tốt nhất là sử dụng khả năng hẹn giờ của VBA để kiểm tra xem một từ đã được nhập hay chưa. (Hãy nhớ — Word cập nhật nội bộ số lượng từ mỗi khi hoàn thành một từ, vì vậy mã hẹn giờ của bạn có thể theo dõi số lượng từ để xem liệu nó có thay đổi hay không.) Phương thức OnTime có cài đặt tối thiểu là một giây, có nghĩa là bộ hẹn giờ của bạn- mã dựa trên chỉ có thể chạy một lần mỗi giây. Người đánh máy nhanh có thể gõ nhiều hơn một từ mỗi giây, vì vậy mã của bạn cần thực sự kiểm tra vài từ cuối cùng được nhập.

Đây là mã bạn có thể sử dụng:

Dim wCount As Long Dim aRange As Range Dim tWords Dim inactiveSW As Boolean

Sub InitializeTimer()

tWords = Array("APPLE", "ORANGE", "PEAR")

wCount = ActiveDocument.Words.Count     Set aRange = Selection.Range     aRange.Start = ActiveDocument.Range.Start     inactiveSW = False     StartTimer End Sub
Public Sub StartTimer()

Application.OnTime When:=Now + TimeValue("00:00:01"), _     Name:="TestWords"

End Sub
Public Sub TestWords()

Dim testWord As String     Dim i As Long     Dim k As Long     Dim kw As Long     Dim xc As Long

If inactiveSW Then Exit Sub     With ActiveDocument         xc = .Range.Words.Count - wCount         If xc > 0 And xc < 5 Then             aRange.End = Selection.End             kw = aRange.Words.Count - 1             If kw > 0 Then                 For k = kw - xc + 1 To kw                     testWord = UCase(Trim(aRange.Words(k).Text))

For i = 0 To UBound(tWords)

If testWord = tWords(i) Then                             mysub (testWord)

Exit For                         End If                     Next i                 Next k             End If         End If         wCount = .Range.Words.Count     End With     StartTimer End Sub
Public Sub KillOnTime()

'cannot stop the timer so set inactive switch   inactiveSW = True End Sub
Sub mysub(s As String)

' this subroutine is executed when a special word is entered   MsgBox s End Sub

Quy trình đầu tiên bạn cần chạy là macro InitializeTimer. Nó thiết lập các biến cần thiết trước khi thực sự bắt đầu phương thức OnTime. Sau đó, nó gọi macro StartTimer thực sự đặt bộ đếm thời gian chạy macro Test AdWords.

Test AdWords kiểm tra xem số lượng từ có tăng lên không và nếu có, nó sẽ kiểm tra năm từ cuối cùng được nhập để xem chúng có khớp với bất kỳ từ kích hoạt nào của bạn hay không. (Các từ kích hoạt được đặt trong mảng t AdWords, trong macro InitializeTimer. Chúng phải được nhập vào mảng, tất cả bằng chữ hoa.) Nếu phát hiện thấy một từ kích hoạt, thì mã của bạn (mysub) sẽ được thực thi và từ kích hoạt được chuyển mã của bạn.

Cần lưu ý rằng số từ có thể tăng hơn năm, đặc biệt nếu văn bản được dán vào tài liệu. Nếu bạn muốn mã kiểm tra tất cả các từ có thể được dán vào tài liệu, thì bạn sẽ cần thay đổi dòng mã kiểm tra, đó là:

If xc > 0 And xc < 5 Then

Tất cả những gì bạn cần làm là thay đổi nó thành thế này:

If xc > 0 Then

Nếu bạn muốn dừng việc kiểm tra từ, hãy chạy macro KillOnTime, macro này sẽ đặt một cờ để dừng kiểm tra các từ. Để kiểm tra khởi động lại sau đó, chỉ cần chạy lại InitializeTimer.

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên các trang WordTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

WordTips là nguồn của bạn để đào tạo Microsoft Word hiệu quả về chi phí.

(Microsoft Word là phần mềm xử lý văn bản phổ biến nhất trên thế giới.) Mẹo này (12374) áp dụng cho Microsoft Word 97, 2000, 2002 và 2003. Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện ribbon của Word (Word 2007 và sau này) tại đây: