Prieš keletą metų tinklaraštyje publikavau įrašą apie tai, kaip Microsoft Word dokumentą su įjungtu keitimų paversti teisingu dokumento „lyginamuoju variantu“ – tokiu, kokie daromi rengiant teisės aktų pakeitimus. Mano aprašytas kelias buvo sąlyginai sudėtingas – Word dokumentą reikėjo įrašyti kaip HTML failą, tada atlikti jame paiešką ir keitimus, tada dokumentą vėl atverti su Word, ir galiausiai tekdavo kažkiek taisyti formatavimą. Paprasčiau, nei ilgame dokumente skrupulingai įrašinėti tekstą, jį ryškinti ir braukyti, bet visgi.
Bet štai neseniai radau būdą, kaip Word arba LibreOffice makrokomandos pagalba tai galima padaryti keliais pelės spragtelėjimais, neužsiimant visom sudėtingom manipuliacijom.
Word atveju, tereikia įsirašyti Word makrokomandą – štai šią:
Sub TrackChangesToFormatting()
Dim chgAdd As Word.Revision
' informuojame vartotoją, jei dokumentas be susektų pakeitimų
If ActiveDocument.Revisions.Count = 0 Then
MsgBox "Šiame dokumente nėra užfiksuotų pakeitimų", vbOKOnly + vbInformation
Else
ActiveDocument.TrackRevisions = False
' ciklas visų pakeitimų peržiūrai
For Each chgAdd In ActiveDocument.Revisions
' keičiam susektus išbraukimus į paprastą išbrauktą tekstą
If chgAdd.Type = wdRevisionDelete Then
chgAdd.Range.Font.StrikeThrough = True
chgAdd.Reject
' perspėjam vartotoją, jei aptiktas teksto perkėlimas;
' tokius makrokomanda palieka nepakeistus, tik pažymi
ElseIf chgAdd.Type = wdRevisionMovedFrom Then
MsgBox ("Makrokomanda nepalaiko teksto perkėlimų (tik trynimą/įterpimą)."), vbOKOnly + vbExclamation
chgAdd.Range.Select ' move insertion point
ElseIf chgAdd.Type = wdRevisionMovedTo Then
MsgBox ("Makrokomanda nepalaiko teksto perkėlimų (tik trynimą/įterpimą)."), vbOKOnly + vbExclamation
chgAdd.Range.Select ' move insertion point
' keičiam susektus įterpimus į paryškintą tekstą
ElseIf chgAdd.Type = wdRevisionInsert Then
chgAdd.Range.Font.Bold = True
chgAdd.Accept
' bet kokius kitokius pakeitimus pažymime žaliai ir perspėjame vartotoją
Else
MsgBox ("Rastas kitoks teksto pakeitimas: jis priimtas ir pažymėtas žalsvai."), vbOKOnly + vbExclamation
chgAdd.Range.HighlightColorIndex = wdBrightGreen
chgAdd.Accept
' chgAdd.Range.Select ' move insertion point
End If
Next chgAdd
End If
'
' makrokomandos dalis pažymėti tekstui, kuris yra ir paryškintas, ir išbrauktas;
' taip nutinka, kai dokumentas buvo taisomas dviejų skirtingų autorių, kurių vienas įrašo pakeitimus,
' o kitas juos ar dalį jų panaikina
'
MsgBox ("Jei bus rasta konfliktuojančių dviejų autorių keitimų, jie bus pažymėti žydrai"), vbOKOnly + vbInformation
Options.DefaultHighlightColorIndex = wdTurquoise
Selection.Find.ClearFormatting
With Selection.Find.Font
.Bold = True
.StrikeThrough = True
.DoubleStrikeThrough = False
End With
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Highlight = wdPink ' iš teisų veikia aukščiau esanti Option... parinktis spalvai parinkti
With Selection.Find
.Text = ""
.Replacement.Text = "^&"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Kur šią makrokomandą dėti? Makrokomandų kūrimas detaliai paaiškintas Microsoft Word pagalbos puslapyje „Makrokomandos kūrimas arba vykdymas“. Jei trumpai, Mano naudojamoje Word 2013 versijoje reikia atverti paskutinę kortelę „Programų kūrėjas“, spausti mygtuką „Makrokomanda“, atsidariusiame dialoge įrašyti makrokomandos pavadinimą „TrackChangesToFormatting“ ir spausti mygtuką „Kurti“.
Atsivėrus Microsoft Visual Basic rengyklei įterpti makrokomandos tekstą:

Tada įrašome pakeitimus ir užveriame Visual Basic langą. Makrokomandą galima matyti štai čia:

Įvykdyti makrokomandą galima paspaudus mygtuką „Vykdyti“.
Rezultatas – tekstas, kuriame keitimai pakeisti formatuotu (įterpimai paryškinti, išbraukimai – perbraukti) tekstu.
Žinoma, galima sukurti specialų mygtuką šiai makrokomandai Microsoft Word lange.
Šios makrokomandos kūrimui panaudojau stackexchange diskusijoje pateiktą pavyzdį.
O štai analogiška makrokomanda LibreOffice programai:
Sub TrackChangesToFormatting
'based on: https://www.literatureandlatte.com/web/forum/viewtopic.php?t=37746
dim doc as object
dim viewCursor as object
dim redLines as object
dim redLine as object
dim document as object
dim dispatcher as object
dim count as long
dim args2(0) as new com.sun.star.beans.PropertyValue
dim args4(2) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Strikeout.Kind"
args2(0).Value = 1
doc = ThisComponent
viewCursor = doc.CurrentController.ViewCursor
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
redLines = doc.Redlines
count = redLines.getCount() - 1
for i = 0 to count
redLine = redLines.getByIndex(0) 'does not work with getByIndex(i)
viewCursor.gotoRange(redLine.RedlineStart, false)
viewCursor.gotoRange(redLine.RedlineEnd, true)
if redLine.RedlineType = "Delete" Then
dispatcher.executeDispatch(document, ".uno:Strikeout", "", 0, args2())
dispatcher.executeDispatch(document, ".uno:RejectTrackedChange", "", 0, Array())
elseif redLine.RedlineType = "Insert" Then
dispatcher.executeDispatch(document, ".uno:Bold", "", 0, args4())
dispatcher.executeDispatch(document, ".uno:AcceptTrackedChange", "", 0, Array())
elseif redLine.RedlineType = "Format" Then
dispatcher.executeDispatch(document, ".uno:AcceptTrackedChange", "", 0, Array())
end if
next i
End Sub
Šios makrokomandos kūrimui panaudojau šiame puslapyje pateiktą pavyzdį.

Parašykite komentarą