ไม่มีอะไรเพิ่มเติมที่จะเพิ่มฉันต้องการเปลี่ยนรูปแบบของการอ้างอิงโยงข้ามทั้งหมดที่ฉันมีในเอกสาร Word 2007 ในครั้งเดียว แต่ฉันไม่รู้ว่าจะทำยังไง สิ่งนี้สามารถทำได้?
ไม่มีอะไรเพิ่มเติมที่จะเพิ่มฉันต้องการเปลี่ยนรูปแบบของการอ้างอิงโยงข้ามทั้งหมดที่ฉันมีในเอกสาร Word 2007 ในครั้งเดียว แต่ฉันไม่รู้ว่าจะทำยังไง สิ่งนี้สามารถทำได้?
คำตอบ:
การอ้างอิงโยงบางประเภทจะถูกจัดรูปแบบโดยอัตโนมัติด้วยสไตล์ "การอ้างอิงที่รุนแรง" แต่ส่วนใหญ่จะจัดรูปแบบเป็นข้อความ "ปกติ"
หากต้องการใช้สไตล์ "การอ้างอิงที่รุนแรง" กับข้อความของการอ้างอิงโยง:
หากต้องการเปลี่ยนลักษณะที่ปรากฏของข้อความทั้งหมดของสไตล์ที่กำหนด:
หากต้องการใช้สไตล์กับการอ้างอิงโยงทั้งหมดในครั้งเดียว:
^19 REF
ดูหน้านี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรหัสพิเศษในค้นหาและแทนที่
นี่คือมาโครที่จะเพิ่มสวิตช์\* mergeformat
ไปยังแต่ละฟิลด์ สวิตช์นี้จำเป็นต่อการจัดรูปแบบจากการสูญหายถ้าคุณทำการปรับปรุงเขตข้อมูล คุณสามารถกำหนดแมโครให้กับการกดแป้นและมันจะผ่านฟิลด์หนึ่งทีละครั้งสำหรับแต่ละครั้งที่คุณกดการกดแป้น คุณยังสามารถแก้ไขแมโครเพื่อวนรอบเอกสารทั้งหมดเพื่อทำให้กระบวนการเป็นไปโดยอัตโนมัติ
Sub mf()
'
' mf Macro
' Find cross references and add \* mergeformat
'
Selection.Find.ClearFormatting
With Selection.Find
.Text = "^19 REF"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.MoveLeft Unit:=wdCharacter, Count:=1
Selection.TypeText Text:="\* mergeformat "
Selection.Find.Execute
End Sub
ใช้แมโครต่อไปนี้เพื่อเพิ่ม CHARFORMAT ไปยังการอ้างอิงโยงทั้งหมด แมโครนี้จะเพิ่มสตริงลงในฟิลด์เฉพาะเมื่อยังไม่มี
Sub SetCHARFORMAT()
'
' Set CHARFORMAT switch to all {REF} fields. Replace MERGEFORMAT.
'
'
Dim oField As Field
Dim oRng As Range
For Each oField In ActiveDocument.Fields
'For Each oField In Selection.Fields
If InStr(1, oField.Code, "REF ") = 2 Then
If InStr(1, oField.Code, "MERGEFORMAT") <> 0 Then
oField.Code.Text = Replace(oField.Code.Text, "MERGEFORMAT", "CHARFORMAT")
End If
If InStr(1, oField.Code, "CHARFORMAT") = 0 Then
oField.Code.Text = oField.Code.Text + "\* CHARFORMAT "
End If
End If
Next oField
End Sub
ใช้มาโครนี้เพื่อจัดรูปแบบการอ้างอิงโยงทั้งหมดด้วยสไตล์ "การอ้างอิงแบบละเอียด" (ตรวจสอบให้แน่ใจว่าคุณมีสไตล์ดังกล่าวและแสดงรหัสฟิลด์):
Sub SetCrossRefStyle()
'
' Macro to set styole of all cross references to "Subtle Reference"
'
'
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Style = ActiveDocument.Styles( _
"Subtle Reference")
With Selection.Find
.Text = "^19 REF"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchKashida = False
.MatchDiacritics = False
.MatchAlefHamza = False
.MatchControl = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
กดAlt+ F9เพื่อซ่อนรหัสฟิลด์
การแก้ไขแมโครที่อัปโหลดโดยไซบอร์กเราสามารถแสดงและซ่อนรหัสฟิลด์ได้โดยอัตโนมัติ เพื่อให้ทุกครั้งที่เราต้องการอัปเดตเราไม่จำเป็นต้องใช้รหัสฟิลด์สลับ ฉันใช้รหัสต่อไปนี้เพื่อเพิ่มการสลับรหัสฟิลด์
ActiveDocument.ActiveWindow.View.ShowFieldCodes = False
แมโครที่สมบูรณ์มีดังนี้:
Sub SetCrossRefStyle()
'
' Macro to set styole of all cross references to "Subtle Reference"
'
'
ActiveDocument.ActiveWindow.View.ShowFieldCodes = True
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Style = ActiveDocument.Styles( _
"Subtle Reference")
With Selection.Find
.Text = "^19 REF"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchKashida = False
.MatchDiacritics = False
.MatchAlefHamza = False
.MatchControl = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
ActiveDocument.ActiveWindow.View.ShowFieldCodes = False
End Sub
นี่เป็นครั้งแรกที่ฉันใช้มาโครเพื่อเพิ่มความเร็วในการทำงานด้วยคำพูด ขอบคุณ cyborg สำหรับมาโครที่เป็นประโยชน์เช่นนี้
วิธีที่รวดเร็วและมีประสิทธิภาพ:
แมโครนี้เปิดกล่องโต้ตอบการอ้างอิงโยงเพื่อแทรกการอ้างอิงโยงที่ตำแหน่งเคอร์เซอร์ปัจจุบัน
เมื่อคุณปิดกล่องโต้ตอบ Xref หลังจากใส่การอ้างอิงแมโครจะกลับมาทำงานต่อเพื่อจัดรูปแบบการอ้างอิงไขว้ที่แทรกไว้กับตัวยก
Sub XrefSuper()
'
' This opens the Cross Reference dialogue box to insert a cross reference at the current cursor position.
' When the dialogue box is closed after inserting the reference the macro resumes to format the inserted cross reference to superscript.
'
'
Dim wc As Integer
wc = ActiveDocument.Characters.Count
Dim dlg As Dialog
Set dlg = Dialogs(wdDialogInsertCrossReference)
dlg.Show 'Open dialogue and perform the insertion from the dialog box)
'Macro continues after closing CrossRef dialogue box
If wc = ActiveDocument.Characters.Count Then Exit Sub 'If we failed to insert something then exit
Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Selection.Font.Superscript = wdToggle
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.Font.Superscript = wdToggle
End Sub
ขอบคุณGraham Skan ที่ ExpertsExchangeสำหรับวิธีเปิดบทสนทนา Xref
รวมคำตอบข้างต้นเข้ากับฟังก์ชั่นอื่นเพื่อวนดูเอกสาร 'เรื่องราว' เพื่อใช้สไตล์ในตัวเอกสารส่วนหัวส่วนท้ายและข้อความบนรูปร่าง
เพียงเรียกแมโคร SetCrossRefStyle () ด้านล่างเพื่อใช้สไตล์ "การอ้างอิงที่เข้มข้น" กับการอ้างอิงข้ามทั้งหมด
Sub m_SetCHARFORMAT(textRanges As Collection)
' https://superuser.com/questions/13531/is-it-possible-to-assign-a-specific-style-to-all-cross-references-in-word-2007
'
' Set CHARFORMAT switch to all {REF} fields. Replace MERGEFORMAT.
' Requires ActiveDocument.ActiveWindow.View.ShowFieldCodes = True
'
Dim oField As Field
Dim oRng As Range
For Each oRng In textRanges
For Each oField In oRng.Fields
If InStr(1, oField.Code, "REF ") = 2 Then
If InStr(1, oField.Code, "MERGEFORMAT") <> 0 Then
oField.Code.Text = Replace(oField.Code.Text, "MERGEFORMAT", "CHARFORMAT")
End If
If InStr(1, oField.Code, "CHARFORMAT") = 0 Then
oField.Code.Text = oField.Code.Text + "\* CHARFORMAT "
End If
End If
Next oField
Next oRng
End Sub
Sub m_AddCrossRefStyle(textRanges As Collection)
' https://superuser.com/questions/13531/is-it-possible-to-assign-a-specific-style-to-all-cross-references-in-word-2007
'
' Macro to set style of all cross references to "Intense Reference"
' Requires ActiveDocument.ActiveWindow.View.ShowFieldCodes = True
'
For Each oRng In textRanges
oRng.Find.ClearFormatting
oRng.Find.Replacement.ClearFormatting
oRng.Find.Replacement.Style = ActiveDocument.Styles("Intense Reference")
With oRng.Find
.Text = "^19 REF"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchKashida = False
.MatchDiacritics = False
.MatchAlefHamza = False
.MatchControl = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
oRng.Find.Execute Replace:=wdReplaceAll
Next oRng
End Sub
Function m_GetAllTextRanges() As Collection
' https://wordmvp.com/FAQs/Customization/ReplaceAnywhere.htm
' https://www.mrexcel.com/forum/excel-questions/443052-returning-collection-function.html
'
' Get text ranges in all document parts.
'
Set m_GetAllTextRanges = New Collection
For Each rngStory In ActiveDocument.StoryRanges
'Iterate through all linked stories
Do
m_GetAllTextRanges.Add rngStory
On Error Resume Next
Select Case rngStory.StoryType
Case 6, 7, 8, 9, 10, 11
If rngStory.ShapeRange.Count > 0 Then
For Each oShp In rngStory.ShapeRange
If oShp.TextFrame.HasText Then
m_GetAllTextRanges.Add oShp.TextFrame.TextRange
End If
Next
End If
Case Else
'Do Nothing
End Select
On Error GoTo 0
'Get next linked story (if any)
Set rngStory = rngStory.NextStoryRange
Loop Until rngStory Is Nothing
Next
End Function
Sub SetCrossRefStyle()
'
' 1. Get all text ranges since Selection.Find only works on document body, but not on headers/footers
' 2. Add CHARFORMAT to make styling persistent
' 3. Add styling to all references
'
Dim textRanges As Collection
Set textRanges = m_GetAllTextRanges
ActiveDocument.ActiveWindow.View.ShowFieldCodes = True
m_SetCHARFORMAT textRanges
m_AddCrossRefStyle textRanges
ActiveDocument.ActiveWindow.View.ShowFieldCodes = False
End Sub