Word合併文檔統一格式,你做過嗎,什麼感受?
前些天,有一位網友問我word多級列表的問題,編號不連續。打開發來的文檔一看,這不僅僅是多級列表的小問題,而是合併文檔統一格式的大問題。
原來這個文檔是各個部門發來的文檔合併而成的,A4大小,接近2000頁,樣式有3000多個,非常混亂,根本不知道哪個樣式管理哪些文本,基本就是垃圾樣式,需要清理刪除,否則可能會讓Word崩潰。如此之多的樣式,都是合併時的各個文檔帶進來的。上個圖,大家感受一下。
多級列表都是綁定到樣式的,只要整理統一了樣式,多級列表的問題,自然迎刃而解。
關於多部門製作大型文檔,當然是要事先統一模板,制定寫作規範,嚴格按照規範寫作,這樣到最後合併的時候就很簡單了。但是事已至此,也不可能返回重新排版了。
該怎麼辦?
我建議,自己新建模板,制定整理規範,對未合併之前的各個小文檔分別整理後,再合併。如果這些小文檔都找不到了,就需要從大文檔中按章節拆分成小文檔再整理。無論是原來的小文檔,還是拆分後的小文檔,仍然可能面臨垃圾樣式的困擾。
有些人建議,清除所有格式,再重新排版,但這樣工作量就增加了不少。因為原來的作者也是有一定的排版邏輯的,所以原格式是有用的,可以區分正文和標題,可以用作查找替換時的格式限定,提高整理效率。
處理垃圾樣式的VBA代碼
下面介紹一些處理垃圾樣式的VBA代碼。為防意外,使用前務必備份好文檔。
第一步 斷開樣式,保留格式
既然樣式已經混亂到無法使用,那不如斷開所有樣式與文本的連結,只保留格式。
以下代碼來自網絡(請百度「在移除 Word 文檔樣式的同時保留格式 - 少數派」),作者是PlatyHsu,我為代碼作了一些注釋。
代碼的邏輯是遍歷文檔段落,分別獲得該段落的樣式的所有字體格式和所有段落格式,然後把段落樣式設置為「正文」,最後把之前獲得的字體和段落格式再應用到該段落上。這些格式都變成了該段落的直接格式,優先級高於「正文」樣式裡的格式,這樣原段落的格式就得到了保留,同時斷開了與原樣式的連結。
「正文」樣式是word的內置樣式,是其他段落樣式的基準。無論你願不願意,每個段落都必須有一個樣式,設置為基準樣式「正文」是較好的選擇。我們平常用的清除格式按鈕,就是把格式退回「正文」樣式裡的格式。
這個代碼並不能保留所有的格式。對於一個段落,有樣式的格式和直接格式兩種格式,直接格式中的段落格式不能保留,直接格式中的字體格式不一定能保留。因為這個代碼以段落為基礎,所以它也不一定能保留字符樣式。
Sub 移除樣式並保留格式()'不能完全保留格式'對於一個由多文檔合併起來的長文檔,它的樣式多而混亂以致於無法使用,會引起word崩潰'對於這些樣式,移除(即都統一為正文樣式),並保留各種格式(變成不受樣式控制的直接格式)Dim Para As ParagraphDim Fnt As Font '代碼字體的所有格式Dim Pfmt As ParagraphFormat '代表段落的所有格式For Each Para In ActiveDocument.ParagraphsWith ParaIf .Style <> ActiveDocument.Styles("正文") Then '如果不是正文樣式,則開始處理Set Fnt = .Style.Font '獲得段落樣式的所有字體屬性,賦給fntSet Pfmt = .Style.ParagraphFormat '獲得段落樣式的所有段落屬性,賦給pfmt.Style = ActiveDocument.Styles("正文") '把它的樣式改為正文.Range.Font = Fnt '為改變樣式後的段落設置回原來的字體屬性.Range.ParagraphFormat = Pfmt '為改變樣式後的段落設置回原來的段落屬性End IfEnd WithNextEnd Sub
第二步 移除未使用樣式
以下代碼可以刪除文檔中未使用的樣式,來自網絡(使用必應查找「T001337_Removing_Unused_Styles」),作者是Ken Endacott。代碼有改動。代碼的邏輯是,遍歷所有樣式,用樣式去查找主文檔內容,找不到的對應內容是就是未使用的樣式,需要刪除。刪除的方法用Application.OrganizerDelete,不用Style. Delete,因為後者低效且容易發生錯誤。
word樣式可以分為兩種,一種是內置樣式,一種是自定義樣式,內置樣式不可刪除,自定義樣式可以刪除。
word樣式是樹狀結構,一個樣式可能是基於另一個樣式建立的,其本身也可能是其他樣式的基準。如果刪除了一個未使用的樣式,但以此樣式為基準的樣式仍然在使用,那將會使段落格式發生不可意料的改變。
有時候用戶可能為內置樣式創建了一個別名,如「標題 1(科技)」,如果只處理自定義樣式的話,這樣的樣式別名就不能被刪除。
由於經常了第一步代碼的處理,所有樣式歸為「正文」樣式,所以不考慮樣式的樹狀依賴關係。因為內置樣式不可刪除,同時為了刪除它的一些別名,所以也不事先判斷是否為內置樣式。最終代碼如下。
(在本文所說場景下,代碼的邏輯也可以是:只要樣式名稱不是「正文」就刪除,但為了廣大網友方便使用,還是保留這樣。)
這個代碼只是處理主文檔的,不處理腳註、尾注、頁眉頁腳、文本框中的內容,不考慮樣式的樹狀依賴關係。需要運行多次,直到顯示刪除的樣式數量不變為止。
Sub 刪除未使用樣式organizerdelete()On Error GoTo ErrorHandlerDim oStyle As Style, i&i = 0For Each oStyle In ActiveDocument.Styles'If oStyle.BuiltIn = False ThenWith ActiveDocument.Content.Find.ClearFormatting.MatchWildcards = False.Style = CVar(oStyle.NameLocal).Execute FindText:="", Format:=TrueIf Not .Found ThenApplication.OrganizerDelete _Source:=ActiveDocument.Path & "\" & ActiveDocument.Name, _Name:=oStyle.NameLocal, Object:=wdOrganizerObjectStylesi = i + 1End IfEnd With'End IfNext oStyleMsgBox "共刪除" & i & "未使用樣式"Exit Sub '退出過程'發生錯誤時處理ErrorHandler:i = i - 1 '發生一次錯誤則減1Resume NextEnd Sub
以上介紹的是清理垃圾樣式的方法,並不完美。這只是合併文檔統一格式的一步,後面的路仍然任重而道遠,加油吧,少年!
關於清理word未使用的樣式,你有什麼更好的方法嗎?