Chạy Macro dựa trên Từ khóa (Microsoft Word)
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: