Eyal متعجب است که اگر کاربر کلمه یا عبارت خاصی را تایپ کند، راهی برای اجرای خودکار ماکرو وجود دارد یا خیر.
متأسفانه، هیچ رویه رویداد Word VBA وجود ندارد که تشخیص دهد زمانی که متن در یک سند تایپ می شود. با این حال، Word به صورت داخلی تشخیص می دهد که یک کلمه کامل وارد شده است تا بتواند مواردی مانند بررسی املا، تصحیح خودکار و به روز رسانی تعداد کلمات را انجام دهد. با این حال، نمی توانید از این روش تشخیص داخلی استفاده کنید.
احتمالاً بهترین روش استفاده از قابلیت تایمر VBA برای بررسی اینکه آیا کلمه ای وارد شده است یا خیر است. (به یاد داشته باشید - هر بار که کلمه ای کامل می شود، Word به صورت داخلی تعداد کلمات را به روز می کند، بنابراین کد تایمر شما می تواند تعداد کلمات را کنترل کند تا ببیند آیا تغییر کرده است یا خیر.) روش OnTime حداقل یک ثانیه تنظیم دارد، به این معنی که تایمر شما- کد مبتنی بر فقط یک بار در ثانیه می تواند اجرا شود. این امکان برای یک تایپیست سریع وجود دارد که بیش از یک کلمه در ثانیه تایپ کند، بنابراین کد شما باید چند کلمه آخر وارد شده را بررسی کند.
این کدی است که می توانید استفاده کنید:
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
اولین روتینی که باید اجرا کنید ماکرو InitializeTimer است. قبل از شروع واقعی متد OnTime، متغیرهایی را که لازم هستند تنظیم می کند. سپس ماکرو StartTimer را فراخوانی می کند که در واقع تایمری را تنظیم می کند که ماکرو TestWords را اجرا می کند.
TestWords بررسی می کند که آیا تعداد کلمات افزایش یافته است یا خیر، و اگر افزایش یافته است، پنج کلمه آخر وارد شده را بررسی می کند تا ببیند آیا با هر یک از کلمات محرک شما مطابقت دارند یا خیر. (کلمات ماشه در آرایه tWords در ماکرو InitializeTimer تنظیم می شوند. باید همه آنها را با حروف بزرگ در آرایه وارد کنید.) اگر یک کلمه ماشه شناسایی شد، کد شما (mysub) اجرا می شود و کلمه ماشه ارسال می شود. به کد شما
لازم به ذکر است که ممکن است تعداد کلمات بیش از پنج جهش کند، به خصوص اگر متن در سند جایگذاری شده باشد. اگر میخواهید کد تمام کلماتی را که ممکن است در سند جایگذاری شده است بررسی کند، باید خط کد بررسی را تغییر دهید، که عبارت است از:
If xc > 0 And xc < 5 Then
تنها کاری که باید انجام دهید این است که آن را به این تغییر دهید:
If xc > 0 Then
اگر میخواهید چک کردن کلمه را متوقف کنید، ماکرو KillOnTime را اجرا کنید، که پرچمی را تنظیم میکند که از بررسی کلمات جلوگیری میکند. برای شروع مجدد بررسی مجدد، کافی است دوباره InitializeTimer را اجرا کنید.