Mam sporo dokumentów w formatach .doc, .docx i .rtf tworzonych przez ludzi, dla których formatowanie tekstu to czarna magia i dlatego muszę te pliki poprawiać na własną rękę. Problem, którego nie mogę rozgryźć dotyczy zautomatyzowania dodawania twardej spacji po spójnikach “a”, “w”, “z”, “i”, “o”, “u”.
Na razie robię to tak:
narzędzia główne -> Zamień,
w pole “Znajdź” wpisuję np. “”, gdzie to np. “a”, natomiast to znak spacji,
w pole “Zamień na” wpisuję “” i klika w “Zamień wszystkie”.
Jest 6 spójników, po których powinna występować twarda spacja, więc czynność tę powtarzam 6 razy.
Ponadto trzeba wziąć pod uwagę, że spójniki te mogą występować na początku zdania. Po powyższych czynnościach omawiane spójniki znajdujące się na początku zdania robią się małe. Dlatego po raz kolejny korzystam z funkcji “Zamień”
w pole “Znajdź” wpisuję “”, gdzie to jedna z liter “a”, “w”, “z”, “i”, “o”, “u”,
w pole “Zamień na” wpisuję
6 spójników, 3 znaki końca zdania… 3 x 6 = 18 działań… + 6 powyższych to razem 24 działania na tekście. Trochę czasu się na to traci. Ponadto pozostaje jeszcze wciąż jeden problem. Mianowicie gdy linia tekstu zaczyna się od myślnika. W takiej sytuacji powinno być:
“”.
Niestety nie wiem, czy da się to jakoś zautomatyzować, bo przecież myślnik może być też w środku zdania.
Zamieszczam kod, który kiedyś znalazłem w internecie (szkoda, że nie wtedy gdy pisałem pracę mgr ), a który trochę dopracowałem, bo znaki takie jak ‘-’ i cokolwiek pomiędzy traktował jako litery. Makro jednak (w tej chwili) ignoruje znaki w nawiasach czyli jeśli na końcu wiersza będzie -> (a
to to zostanie pominięte, a pasowałoby przenieść do nowej linii (można sobie to dorobić)
Sub TwardaSpacja()
Dim i As Long
Dim licznik_zmian As Long
licznik_zmian = 0
maxlines = ActiveDocument.BuiltInDocumentProperties(wdPropertyLines)
For i = 1 To maxlines
DoEvents
Selection.GoTo What:=wdGoToLine, Which:=wdGoToFirst, Count:=i, Name:=""
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
With Selection.Characters
If .Count > 4 Then
If (.Item(.Count - 2) = Chr(32)) _
And (.Item(.Count - 1) >= Chr(65) And .Item(.Count - 1) <= Chr(90) Or .Item(.Count - 1) >= Chr(97) And .Item(.Count - 1) <= Chr(122)) _
And (.Item(.Count) = Chr(32)) Then
.Item(.Count) = Chr(160)
licznik_zmian = licznik_zmian + 1
End If
End If
End With
Next
Selection.HomeKey Unit:=wdStory
MsgBox "Zrobione" & Chr(13) & _
"Dokonano " & licznik_zmian & " zmian/y", vbInformation
End Sub
Licznik dodałem dla bajeru, żeby było wiadomo czy coś zrobił.
Jak użyć:
Wkleić w edytor VB Worda (alt+f11)
A potem dodać sobie przycisk z przypisanym do niego makrem.
Makro działa w Word 2003 (a pochodzi jeszcze z czasów Worda 97) , nie wiem jak wyżej.
Kod nie jest zbyt elegancki, bo nie wykorzystuję w nim wyrażeń regularnych, ale robi to, co chcę (prócz tego, co opisałem z rozpoczęciem linii tekstu od myślnika).
Zostały więc 3 sprawy do ogarnięcia:
problem z myślnikiem na początku linii,
przekształcić kod tak, żeby wykorzystać wyrażenia regularne,
… wiecie może gdzie są zapisywane marka z Worda na dysku twardym?