在 Microsoft Office Word 中,彰化一整天前輩寫了個巨集,可批次對多個 Word 檔案取代文字。但這不符合我的工作流程,而且這個版本只支援.doc檔。因此參考了前輩的語法,另外寫了一個巨集,在以 Word 開啟檔案的狀態下,呼叫 Excel 清單搜尋取代,且支援萬用字元。而本文是 LiberOffice 的版本。(MicroSoft Office版本請按這裡)
版本特色:
- 支援所有可用 LibreOffice Writer 開啟的文件
- 支援 LiberOffice 常規表述式
- 以 Calc 管理列表
缺點:本巨集不支援取代文字格式,且無法同時取代多個檔案。如有需要,請參考彰化一整天的巨集。
安裝
準備 Calc 取代清單
- 開啟Calc,將第一列寫上標題:「替代前」、「替代後」、「萬用字元」。
- 在之後的列中填入要搜尋取代的內容,中間請勿空行。如要使用常規表述式(需遵守 LiberOffice 常規表述式規範),請在第三欄寫上「Y」。
- 儲存檔案,檔案格式需選擇 Calc 可支援的。(檔名及檔案路徑避免包含與電腦系統語言不符的文字,如中文環境請勿包含日文或韓文,以免出錯)
安裝Writer巨集
- 開啟Writer,點開「工具」>「巨集」>「編輯巨集」。
- 在「End Sub」下貼上以下語法。
Sub RepWithList()
'
' 列表批次取代巨集 Replace with ODS List
'
rem
define variables
dim document as object
dim dispatcher as object
rem
----------------------------------------------------------------------
rem get access to the document
document =
ThisComponent.CurrentController.Frame
dispatcher =
createUnoService("com.sun.star.frame.DispatchHelper")
REM ====Replace
List File====
Dim FileName As String
Dim FileNameURL As string
Dim RepFile As Object
REM ====Replace parameters====
Dim Rep
As String
Dim Org As String
Dim Sheet0 as Object
Dim i as
Integer
FileName = "D:\Programs\RepList_LO.ods"
REM 取代列表檔案路徑
FileNameURL = convertToURL(FileName)
Dim opts(0) As New com.sun.star.beans.PropertyValue
opts(0).Name = "Hidden"
opts(0).Value = True
RepFile = StarDesktop.loadComponentFromURL(FileNameURL, "_blank", 0, opts() )
Sheet0 = RepFile.Sheets.getByIndex(0)
i = 1
Org = Sheet0.getCellByPosition(0,i).String
Rep = Sheet0.getCellByPosition(1,i).String
dim RepPair(21) as new com.sun.star.beans.PropertyValue
REM ====取代迴圈====
While Org <> ""
If Sheet0.getCellByPosition(2,i).String = "Y" Then
RepPair(0).Name = "SearchItem.StyleFamily"
RepPair(0).Value = 2
RepPair(1).Name = "SearchItem.CellType"
RepPair(1).Value = 0
RepPair(2).Name = "SearchItem.RowDirection"
RepPair(2).Value = true
RepPair(3).Name = "SearchItem.AllTables"
RepPair(3).Value = false
RepPair(4).Name = "SearchItem.SearchFiltered"
RepPair(4).Value = false
RepPair(5).Name = "SearchItem.Backward"
RepPair(5).Value = True
RepPair(6).Name = "SearchItem.Pattern"
RepPair(6).Value = false
RepPair(7).Name = "SearchItem.Content"
RepPair(7).Value = false
RepPair(8).Name = "SearchItem.AsianOptions"
RepPair(8).Value = false
RepPair(9).Name = "SearchItem.AlgorithmType"
RepPair(9).Value = 1
RepPair(10).Name = "SearchItem.SearchFlags"
RepPair(10).Value = 65536
RepPair(11).Name = "SearchItem.SearchString"
RepPair(11).Value = Org
RepPair(12).Name = "SearchItem.ReplaceString"
RepPair(12).Value = Rep
RepPair(13).Name = "SearchItem.Locale"
RepPair(13).Value = 255
RepPair(14).Name = "SearchItem.ChangedChars"
RepPair(14).Value = 2
RepPair(15).Name = "SearchItem.DeletedChars"
RepPair(15).Value = 2
RepPair(16).Name = "SearchItem.InsertedChars"
RepPair(16).Value = 2
RepPair(17).Name = "SearchItem.TransliterateFlags"
RepPair(17).Value = 1280
RepPair(18).Name = "SearchItem.Command"
RepPair(18).Value = 3
RepPair(19).Name = "SearchItem.SearchFormatted"
RepPair(19).Value = false
RepPair(20).Name = "SearchItem.AlgorithmType2"
RepPair(20).Value = 2
RepPair(21).Name = "Quiet"
RepPair(21).Value = true
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, RepPair())
Else
RepPair(0).Name = "SearchItem.StyleFamily"
RepPair(0).Value = 2
RepPair(1).Name = "SearchItem.CellType"
RepPair(1).Value = 0
RepPair(2).Name = "SearchItem.RowDirection"
RepPair(2).Value = true
RepPair(3).Name = "SearchItem.AllTables"
RepPair(3).Value = false
RepPair(4).Name = "SearchItem.SearchFiltered"
RepPair(4).Value = false
RepPair(5).Name = "SearchItem.Backward"
RepPair(5).Value = True
RepPair(6).Name = "SearchItem.Pattern"
RepPair(6).Value = false
RepPair(7).Name = "SearchItem.Content"
RepPair(7).Value = false
RepPair(8).Name = "SearchItem.AsianOptions"
RepPair(8).Value = false
RepPair(9).Name = "SearchItem.AlgorithmType"
RepPair(9).Value = 0
RepPair(10).Name = "SearchItem.SearchFlags"
RepPair(10).Value = 65536
RepPair(11).Name = "SearchItem.SearchString"
RepPair(11).Value = Org
RepPair(12).Name = "SearchItem.ReplaceString"
RepPair(12).Value = Rep
RepPair(13).Name = "SearchItem.Locale"
RepPair(13).Value = 255
RepPair(14).Name = "SearchItem.ChangedChars"
RepPair(14).Value = 2
RepPair(15).Name = "SearchItem.DeletedChars"
RepPair(15).Value = 2
RepPair(16).Name = "SearchItem.InsertedChars"
RepPair(16).Value = 2
RepPair(17).Name = "SearchItem.TransliterateFlags"
RepPair(17).Value = 1073743104
RepPair(18).Name = "SearchItem.Command"
RepPair(18).Value = 3
RepPair(19).Name = "SearchItem.SearchFormatted"
RepPair(19).Value = false
RepPair(20).Name = "SearchItem.AlgorithmType2"
RepPair(20).Value = 1
RepPair(21).Name = "Quiet"
RepPair(21).Value = true
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, RepPair())
End If
i = i + 1
Org =
Sheet0.getCellByPosition(0,i).String
Rep =
Sheet0.getCellByPosition(1,i).String
Wend
MsgBox "取代完成" & Chr(13) & "技術支援:憑虛御風
https://qingxianz.blogspot.com"
End Sub
- FileName = "D:\Programs\RepList_LO.ods" 請將紅字部分換成剛才製作的 Calc 檔案路徑。
-
RepPair(3).Name = "SearchItem.AllTables"
RepPair(3).Value = false
如果需要取代所有表格內容,請改為True - RepPair(5).Name = "SearchItem.Backward" RepPair(5).Value = True
如果要往前取代,請保留True,否則請改為False
安裝捷徑
- 開啟「工具」>「自訂」>「工具列」>「類別」>「巨集」,在「我的巨集」中找到剛才的「RepWithList」,點下去反白。
- 在右欄選擇要加入的工具列,按中間的「➡️」加入,調整到想要的位置。
- 點「RepWithList」,按下欄「修改」,改成想要的名稱和圖示(請勿和其他工具混淆)。按「確定」。
這樣工具列就會出現設定的圖示,按一下就會自動取代了。
常見問題
- 取代清單變成唯讀,無法編輯:因為 RepWithList 執行時會以唯讀在背景開啟清單檔。關閉 Writer,重新開啟取代清單檔就會正常了。如需同時編輯,請先開啟清單檔再執行取代(但LO有可能會閃退)。
如果覺得我的程式很有幫助,歡迎贊助斗內我喔(*´∀`)~♥
PS:如要提問,請使用Facebook留言框下的內建留言板,這樣我才收得到通知。
沒有留言:
張貼留言