Bas سندی دارد که در آن از برجستهسازیهای متنی زرد، سبز و خاکستری در سراسر آن استفاده میکند. او تعجب می کند که چگونه می تواند تنها یک رنگ را حذف کند. او میخواهد تمام برجستهسازی متن سبز را حذف کند اما زرد و خاکستری را حفظ کند.
Word به شما امکان می دهد متن را با استفاده از یکی از 16 رنگ برجسته کنید که با کلیک بر روی فلش رو به پایین در کنار ابزار Text Highlight Color (در زبانه Home نوار) قابل مشاهده است. هیچ راهی برای استفاده از Find and Replace برای یافتن رنگ های برجسته وجود ندارد—ابزار Find and Replace با تمام هایلایت کردن متن یکسان رفتار می کند.
با این حال، می توانید از طریق یک ماکرو به رنگ های جداگانه دسترسی پیدا کنید. در انجام این کار، باید به خاطر داشته باشید که Word به شما اجازه می دهد تا با برجسته کردن متن خود کاملاً دقیق شوید—شما می توانید تا شخصیت های فردی برجسته کنید. به عنوان مثال، این بدان معنی است که شما می توانید هر کاراکتر را در کلمه "برجسته کردن" با رنگ متفاوتی برجسته کنید.
چرا این مهم است؟ از آنجا که من راه حل های مبتنی بر ماکرو برای این مشکل دیده ام که از ابزار Find and Replace (تحت کنترل ماکرو) برای جستجوی متن هایلایت شده استفاده می کنند، سپس اگر رنگ خاصی است، هایلایت را حذف می کنیم. در اینجا نسخه ای از آن وجود دارد. یک ماکرو:
Sub RemoveOneHighlight()
Dim HLColor As WdColorIndex
Dim rg As Range
HLColor = Selection.Range.HighlightColorIndex
If HLColor <> wdNoHighlight Then
Set rg = ActiveDocument.Range
With rg.Find
.Highlight = HLColor
.Wrap = wdFindStop
While .Execute
If rg.HighlightColorIndex = HLColor Then
rg.HighlightColorIndex = wdNoHighlight
End If
rg.Collapse wdCollapseEnd
Wend
End With
Else
MsgBox "Place the cursor on text that has the highlight to remove."
End If
End Sub
این ماکرو توسط Jay Freedman نوشته شده است و می توان آن را در صفحه وب با استفاده از این URL طولانی احمقانه پیدا کرد:
https://answers.microsoft.com/en-us/msoffice/forum/all/how-to-get-word-to-automatically-remove-or-apply-a/04df106d-7372-4c5d-916e-c4c876d8344d
برای استفاده از ماکرو، فقط نقطه درج را در داخل کلمه ای قرار دهید که با استفاده از رنگی که می خواهید حذف کنید برجسته شده است. هنگامی که آن را اجرا می کنید، تمام هایلایت های منطبق را خیلی سریع حذف می کند. با این حال، یک گوچا وجود دارد، و بر اساس روشی است که می توانید برجسته سازی را اعمال کنید.
به یاد داشته باشید که می توانید هر کاراکتر را در کلمه "هایلایت کردن" با رنگ متفاوتی برجسته کنید. اگر این کار را انجام دهید، ماکرویی که به تازگی نشان داده شده است روی چنین کلمه ای کار نمی کند. دلیل آن این است که ابزار Find and Replace هر بلوکی از متن را پیدا می کند که از هر برجسته سازی استفاده می کند. بنابراین، کل کلمه " برجسته کردن" یک کلمه در نظر گرفته می شود. زمانی که کد بررسی می کند که آیا ویژگی HighlightColorIndex با رنگ مورد نظر (HLColor) مطابقت دارد یا خیر، هرگز مطابقت نخواهد داشت زیرا، در آزمایش من، HighlightColorIndex حاوی یک مقدار پوچ مانند 999999 خواهد بود که برنده شد. با رنگی که باید بین 1 تا 16 باشد مطابقت نداشته باشد.
بنابراین، اگر متن شما هرگز رنگهای متفاوتی با هم ندارد، میتوانید از ماکرو Jay استفاده کنید. (همانطور که گفتم، بسیار سریع است.) اگر ممکن است رنگهای درهم شده داشته باشید، پس ماکرو باید به آن نگاه کنید. هر یک از نویسه ها را ارزیابی کنید که آیا برجسته شده است یا خیر. سپس، اگر رنگ هایلایت رنگی است که می خواهید تغییر دهید، باید آن رنگ را حذف کنید. ماکرو زیر همه این عوامل را در نظر می گیرد:
Sub RemoveSingleHighlight()
Dim sHLColors(16) As String
Dim iHLColors(16) As Integer
Dim c As Range
Dim J As Integer
Dim sTemp As String
Dim iColWanted As Integer
Dim iChanges As Integer
Dim bFoundSome As Boolean
sHLColors(1) = "Black"
sHLColors(2) = "Blue"
sHLColors(3) = "Turquoise"
sHLColors(4) = "Bright Green"
sHLColors(5) = "Pink"
sHLColors(6) = "Red"
sHLColors(7) = "Yellow"
sHLColors(8) = "White"
sHLColors(9) = "Dark Blue"
sHLColors(10) = "Teal"
sHLColors(11) = "Green"
sHLColors(12) = "Violet"
sHLColors(13) = "Dark Red"
sHLColors(14) = "Dark Yellow"
sHLColors(15) = "Dark Gray"
sHLColors(16) = "Light Gray"
For J = 1 To 16
iHLColors(J) = 0
Next J
bFoundSome = False
For Each c In Selection.Characters
If c.HighlightColorIndex <> wdNoHighlight Then
iHLColors(c.HighlightColorIndex) = 1
bFoundSome = True
End If
Next c
If bFoundSome Then
sTemp = "The following highlighting colors are used "
sTemp = sTemp & "in the selected text:" & vbNewLine & vbNewLine
For J = 1 To 16
If iHLColors(J) > 0 Then
sTemp = sTemp & " " & J & ": " & sHLColors(J) & vbNewLine
End If
Next J
sTemp = sTemp & vbNewLine & "Please enter the color number "
sTemp = sTemp & "for the color you want to remove:"
iColWanted = Val(InputBox(sTemp))
If (iColWanted < 1) Or (iColWanted > 16) Then iColWanted = 0
iChanges = 0
If iColWanted > 0 Then
For Each c In Selection.Characters
If c.HighlightColorIndex = iColWanted Then
c.HighlightColorIndex = wdNoHighlight
iChanges = iChanges + 1
End If
Next c
sTemp = "There were " & iChanges & " characters using "
sTemp = sTemp & "the " & sHLColors(iColWanted) & " color. "
sTemp = sTemp & "These were all changed in the selected text."
Else
sTemp = "No changes made to the selected text."
End If
Else
sTemp = "The selected text contained no highlighted text."
End If
MsgBox sTemp
End Sub
برای استفاده از ماکرو، متنی را که میخواهید روی آن تأثیر بگذارید، قبل از اجرای آن انتخاب کنید. اولین کاری که ماکرو انجام می دهد این است که از هر کاراکتر در متن انتخاب شده عبور می کند و تعیین می کند که چه رنگ هایی برای برجسته کردن متن استفاده شده است. سپس این اطلاعات در یک کادر ورودی ارائه می شود، جایی که از کاربر دعوت می شود تا کد رنگ رنگی که باید حذف شود را وارد کند.
با فرض اینکه کاربر یک کد رنگ معتبر قرار داده است، سپس هر کاراکتر دوباره بررسی می شود و اگر برجسته بودن کاراکتر از رنگ مشخص شده استفاده کند، رنگ حذف می شود. در نهایت، ماکرو یک جعبه پیام را نشان می دهد که تعداد کاراکترهای تغییر یافته را نشان می دهد.
از آنجا که ماکرو از هر کاراکتر در متن انتخاب شده (دو بار) عبور می کند، در صورتی که انتخاب بسیار زیاد باشد، ممکن است مدتی طول بکشد. به همین دلیل، ممکن است بخواهید آن را فقط در یک مقدار معقول اجرا کنید، مانند یک یا دو صفحه در یک زمان.
این ممکن است شما را به تعجب وادار کند که آیا راهی برای ترکیب سرعت ماکرو جی با دقت ماکرو من وجود دارد یا خیر. خوب، تا حدی وجود دارد، همانطور که در این نسخه از ماکرو جی نشان داده شده است:
Sub RemoveOneSingleHighlight()
Dim HLColor As WdColorIndex
Dim rg As Range
Dim c As Range
HLColor = Selection.Range.HighlightColorIndex
If HLColor <> wdNoHighlight Then
Set rg = ActiveDocument.Range
With rg.Find
.Highlight = True
.Wrap = wdFindStop
While .Execute
For Each c In rg.Characters
If c.HighlightColorIndex = HLColor Then
c.HighlightColorIndex = wdNoHighlight
End If
Next c
rg.Collapse wdCollapseEnd
Wend
End With
Else
MsgBox "Place the cursor on text that has the highlight to remove."
End If
End Sub
نکته کلیدی در این نسخه این است که HighlightColorIndex کل محدوده (rg) بازگردانده شده توسط Find and Replace را بررسی نمی کند. درعوض، رنگ هایلایت هر یک از کاراکترهای منفرد در محدوده بازگشتی را بررسی می کند و اگر یک رنگ مطابقت پیدا کرد ، رنگ هایلایت حذف شده است. این ماکرو بسیار کندتر از ماکرو اصلی جی است، اما بسیار سریعتر از ماکرو من. همچنین هیچ گزارشی انجام نمی دهد و به دنبال بازخوردی از کاربر نیست - تا زمانی که نقطه درج را در کلمه ای که با استفاده از رنگ مورد نظر برجسته شده است قرار دهید، آن رنگ را از تمام برجسته سازی های سند حذف می کند.
یک تغییر دیگر در ماکرو اصلی جی ایجاد کردم. او در ابتدا ویژگی .Highlight شی .Find را برابر با HLColor قرار داده بود. این تصور اشتباهی را ایجاد می کند که ویژگی .Highlight را می توان روی یک برجسته سازی خاص تنظیم کرد. رنگ، اما نمی تواند. طبق اسناد Microsoft VBA، این ویژگی را فقط می توان روی True، False یا wdUndefined تنظیم کرد. همچنین توضیح می دهد که چرا Find and Replace فقط می تواند متن هایلایت شده را پیدا کند، نه متن با استفاده از رنگ هایلایت خاص. بنابراین، من کد جی را تغییر دادم تا منعکس کننده استفاده صحیح از ویژگی .Highlight باشد.