 |
Corel FORUM
Forum użytkowników programów firmy Corel. Grafika wektorowa, rastrowa i obróbka zdjęć cyfrowych
|
|
Makro znajdź zamień tekst - spacje na twarda spacje |
| Autor |
Wiadomość |
N0carz
Bywalec


Wersja CorelDRAW: x7/x8
Pomógł: 1 raz Dołączył: 15 Gru 2017 Posty: 34 Skąd: Lublin
|
Wysłany: 31 Styczeń 2018, 13:53 Makro znajdź zamień tekst - spacje na twarda spacje
|
|
|
Witam.
W związku z tym, że ostatnim czasem dość często muszę ułożyć tekst w kilkustronicowym projekcie za pomocą Korka to poszukuje makro, które zamieni spację po sierotkach w tekstach na twardą spacje. Na razie radzę sobie za pomocą funkcji znajdź/zamień. Ale jest to dość uciążliwe gdyż trzeba każdą potencjalną sierotkę wpisać ręcznie (duża i mała litera) oraz jednostki miary. Niestety kiedy goni czas tym sposobem łatwo o czymś zapomnieć, a co gorzej łatwo jest przeoczyć i zamienić literki np. wyszukać "i" zamieniając ją na literkę "a":/. Spróbowałem nagrać Makro z tej czynności ale niestety Korek nie potrafi przełożyć tej operacji z wyszukiwania tekstu na kod źródlowy zostawiając w edytorze jedynie taki tekst "Recording of this command is not supported: TextEdit". Przeszukałem internet i pod kątem gotowych makr do zamiany tekstu a konkretnie do pozbycia się sierot uzyskałem dość skąpe rezultaty (o dziwo, gdyż jest to chyba dość znany problem z Corelem). Poniżej kilka znalezionych makr, wymagały by dopracowania:
Tu za pomocą okna dialogowego mogę sam wpisać który tekst chce zmienić oraz tekst na na który chce zmienić, ale niestety nie działają znaczniki twardej spacji więc nie do końca się sprawdza
| Kod: |
Sub test()
Dim txtFIND As String 'wpisać tekst do zmiany
Dim txtREPLACE As String 'wpisać tekst na który zmienić
Dim d As Document
Dim p As Page
Dim s As Shape
txtFIND = InputBox("Enter the string you wish to replace:", "Replace Text Across OpenDocs")
txtREPLACE = InputBox("Enter the new string:", "Replace Text Across OpenDocs")
For Each d In Documents 'Loop all the open documents
For Each p In d.Pages 'Loop each page
p.TextReplace txtFIND, txtREPLACE, True, False
Next p
Next d
End Sub
|
Tu teks wyszukiwany i zmieniany jest przedefiniowany w kodzie ale też nie działają znaczniki rodzaju spacji więc również nie działa.
| Kod: |
Sub test()
Const txtFIND As String = "tekst" 'tekst wyszukiwany
Const txtREPLACE As String = "tekst2" 'zmienić na
Dim d As Document
Dim p As Page
For Each d In Documents 'Loop all the open documents
For Each p In d.Pages 'Loop each page
p.TextReplace txtFIND, txtREPLACE, True, False
Next p
Next d
End Sub
|
Moje pytanie czy ktoś takie makro o które mi chodzi posiada w swoich zasobach by się nim podzielić? Jeśli nikt nie ma to proszę o pomoc. Może ktoś bardziej biegły w pisaniu makr do corela byłby wstanie na podstawie wyżej podanych skryptów bądź od nowa zrobić makro o które mi chodzi? Sam trochę znam się na VBA, ale nigdy nie siedziałem w kodowaniu do Corela jedynie pod produkty MS OFFICE, a jak się nie zna środowiska i jak się nazywają składniki do których trzeba się odwołać to ciężko jest cokolwiek ugrać:/ Takie makto zapewne uprościło by pracę mi i wielu innym użytkownikom tego forum. Dzięki. |
|
|
|
 |
tegraf
Ekspert tegraf

Pomógł: 74 razy Dołączył: 21 Mar 2011 Posty: 1954 Skąd: Zielona Góra
|
Wysłany: 31 Styczeń 2018, 14:11
|
|
|
| Jak wpisujesz twardą spację w makro nr 1? |
|
|
|
 |
N0carz
Bywalec


Wersja CorelDRAW: x7/x8
Pomógł: 1 raz Dołączył: 15 Gru 2017 Posty: 34 Skąd: Lublin
|
Wysłany: 31 Styczeń 2018, 14:30
|
|
|
| tak jak przy wyszukiwaniu <Non-breaking Space> i też próbowałem kod &0146 (nie pamiętam dokładnie) który, gdzieś zobaczyłem przeszukując internet. |
|
|
|
 |
tegraf
Ekspert tegraf

Pomógł: 74 razy Dołączył: 21 Mar 2011 Posty: 1954 Skąd: Zielona Góra
|
Wysłany: 31 Styczeń 2018, 14:36
|
|
|
| Alt + 0160 na klawiaturze numerycznej |
|
|
|
 |
N0carz
Bywalec


Wersja CorelDRAW: x7/x8
Pomógł: 1 raz Dołączył: 15 Gru 2017 Posty: 34 Skąd: Lublin
|
Wysłany: 31 Styczeń 2018, 14:44
|
|
|
Właśnie w trakcie jak odpisałeś kombinowałem z tym skrótem tylko wpisywałem go do kody jako tekst a nie wpadłem na to by po prostu wpisać:D Po wklepaniu wo kodu działa na literce a. jak przerobię całość i będzie działać wkleje tu kod:D
Dzięki wielkie |
|
|
|
 |
tegraf
Ekspert tegraf

Pomógł: 74 razy Dołączył: 21 Mar 2011 Posty: 1954 Skąd: Zielona Góra
|
Wysłany: 31 Styczeń 2018, 14:56
|
|
|
| Kod: |
Sub test()
Dim d As Document
Dim p As Page
Dim s As Shape
Dim x As Integer
Dim myFindArray
myFindArray = Array("a", "i", "o", "u", "w", "z")
For Each d In Documents 'Loop all the open documents
For Each p In d.Pages 'Loop each page
For x = 0 To 5
p.TextReplace myFindArray(x) & " ", myFindArray(x) & " ", True, False
p.TextReplace UCase(myFindArray(x)) & " ", UCase(myFindArray(x)) & " ", True, False
Next
Next p
Next d
End Sub
|
W 5 i 6 wierszu od dołu, w drugich nawiasach jest twarda spacja: Alt + 0160 |
|
|
|
 |
N0carz
Bywalec


Wersja CorelDRAW: x7/x8
Pomógł: 1 raz Dołączył: 15 Gru 2017 Posty: 34 Skąd: Lublin
|
Wysłany: 31 Styczeń 2018, 15:24
|
|
|
Zrobiłem na szybko takie coś :) Wiem zupełnie nie optymalny i brzydki kod... pewnie paru programistów jak zobaczy to padnie na zawał pozostali padną śmiechem ale grunt, że działa. Niech ktoś bardziej kumaty w te klocki zoptymalizuje ten kod po swojemu
Uzupełniłem wyszukiwanie w podstawowe jednostki miar
| Kod: | Sub test2()
Const bigA As String = " A " 'wyszukiwanie wielkiej literki A
Const replace_bigA As String = " A "
Const smA As String = " a "
Const replace_smA As String = " a "
Const bigI As String = " I " 'wyszukiwanie wielkiej literki I
Const replace_bigI As String = " I "
Const smI As String = " i "
Const replace_smI As String = " i "
Const bigO As String = " O " 'wyszukiwanie wielkiej literki O
Const replace_bigO As String = " O "
Const smO As String = " o "
Const replace_smO As String = " o "
Const bigU As String = " U " 'wyszukiwanie wielkiej literki U
Const replace_bigU As String = " U "
Const smU As String = " u "
Const replace_smU As String = " u "
Const bigW As String = " W " 'wyszukiwanie wielkiej literki W
Const replace_bigW As String = " W "
Const smW As String = " w "
Const replace_smW As String = " w "
Const bigZ As String = " Z " 'wyszukiwanie wielkiej literki Z
Const replace_bigZ As String = " Z "
Const smZ As String = " z "
Const replace_smZ As String = " z "
Const bigKM As String = " KM " 'wyszukiwanie wielkiej literki KM
Const replace_bigKM As String = " KM "
Const smKM As String = " km "
Const replace_smKM As String = " km "
Const bigM As String = " M " 'wyszukiwanie wielkiej literki M
Const replace_bigM As String = " M "
Const smM As String = " m "
Const replace_smM As String = " m "
Const bigCM As String = " CM " 'wyszukiwanie wielkiej literki CM
Const replace_bigCM As String = " CM "
Const smCM As String = " cm "
Const replace_smCM As String = " cm "
Const bigMM As String = " MM " 'wyszukiwanie wielkiej literki MM
Const replace_bigMM As String = " MM "
Const smMM As String = " mm "
Const replace_smMM As String = " mm "
Const bigL As String = " L " 'wyszukiwanie wielkiej literki L
Const replace_bigL As String = " L "
Const smL As String = " l "
Const replace_smL As String = " l "
Const bigML As String = " ML " 'wyszukiwanie wielkiej literki ML
Const replace_bigML As String = " ML "
Const smML As String = " ml "
Const replace_smML As String = " ml "
Const bigKG As String = " KG " 'wyszukiwanie wielkiej literki KG
Const replace_bigKG As String = " KG "
Const smKG As String = " kg "
Const replace_smKG As String = " kg "
Const bigG As String = " G " 'wyszukiwanie wielkiej literki G
Const replace_bigG As String = " G "
Const smG As String = " g "
Const replace_smG As String = " g "
Dim d As Document
Dim p As Page
For Each d In Documents 'przeszukuje dokument
For Each p In d.Pages 'przeszukuje strone
p.TextReplace bigA, replace_bigA, True, False
p.TextReplace smA, replace_smA, True, False
p.TextReplace bigI, replace_bigI, True, False
p.TextReplace smI, replace_smI, True, False
p.TextReplace bigO, replace_bigO, True, False
p.TextReplace smO, replace_smO, True, False
p.TextReplace bigU, replace_bigU, True, False
p.TextReplace smU, replace_smU, True, False
p.TextReplace bigW, replace_bigW, True, False
p.TextReplace smW, replace_smW, True, False
p.TextReplace bigZ, replace_bigZ, True, False
p.TextReplace smZ, replace_smZ, True, False
p.TextReplace bigKM, replace_bigKM, True, False
p.TextReplace smKM, replace_smKM, True, False
p.TextReplace bigM, replace_bigM, True, False
p.TextReplace smM, replace_smM, True, False
p.TextReplace bigCM, replace_bigCM, True, False
p.TextReplace smCM, replace_smCM, True, False
p.TextReplace bigMM, replace_bigMM, True, False
p.TextReplace smMM, replace_smMM, True, False
p.TextReplace bigL, replace_bigL, True, False
p.TextReplace smL, replace_smL, True, False
p.TextReplace bigML, replace_bigML, True, False
p.TextReplace smML, replace_smML, True, False
p.TextReplace bigKG, replace_bigKG, True, False
p.TextReplace smKG, replace_smKG, True, False
p.TextReplace bigG, replace_bigG, True, False
p.TextReplace smG, replace_smG, True, False
Next p
Next d
End Sub |
|
|
|
|
 |
N0carz
Bywalec


Wersja CorelDRAW: x7/x8
Pomógł: 1 raz Dołączył: 15 Gru 2017 Posty: 34 Skąd: Lublin
|
Wysłany: 31 Styczeń 2018, 15:28
|
|
|
| tegraf napisał/a: | | Kod: |
Sub test()
Dim d As Document
Dim p As Page
Dim s As Shape
Dim x As Integer
Dim myFindArray
myFindArray = Array("a", "i", "o", "u", "w", "z")
For Each d In Documents 'Loop all the open documents
For Each p In d.Pages 'Loop each page
For x = 0 To 5
p.TextReplace myFindArray(x) & " ", myFindArray(x) & " ", True, False
p.TextReplace UCase(myFindArray(x)) & " ", UCase(myFindArray(x)) & " ", True, False
Next
Next p
Next d
End Sub
|
W 5 i 6 wierszu od dołu, w drugich nawiasach jest twarda spacja: Alt + 0160 |
no to wygląda zdecydowanie ładniej:) Pytanie jak będę chciał dodać dodatkowo do wyszukiwania jednostki miar to wystarczy dopisać je w zmiennej "myFindArray" i powiększyć liczbę kroków o odpowiednią ilość w pętli? |
|
|
|
 |
tegraf
Ekspert tegraf

Pomógł: 74 razy Dołączył: 21 Mar 2011 Posty: 1954 Skąd: Zielona Góra
|
Wysłany: 31 Styczeń 2018, 15:36
|
|
|
Tak, wystarczy.
Jednak nie wystarczy.
Trzeba dopisać duże litery + jednostki miar oraz usunąć 5 wiersz od dołu - inaczej niektóre jednostki zostaną zamienione błędnie na wielkoliterowe, np. kB na KB.
Poprawię wieczorem. |
|
|
|
 |
N0carz
Bywalec


Wersja CorelDRAW: x7/x8
Pomógł: 1 raz Dołączył: 15 Gru 2017 Posty: 34 Skąd: Lublin
|
Wysłany: 31 Styczeń 2018, 16:04
|
|
|
| tegraf napisał/a: | Tak, wystarczy.
Jednak nie wystarczy.
Trzeba dopisać duże litery + jednostki miar oraz usunąć 5 wiersz od dołu - inaczej niektóre jednostki zostaną zamienione błędnie na wielkoliterowe, np. kB na KB.
Poprawię wieczorem. |
Dzięki wielkie:) Leci + za pomoc:D
Nieco przerobiłem Twój kod. Bo jeśli po prostu dodać skróty j.m. do zmiennej myFindArray to twarda spacja pojawiała się po j.m., a w tym przypadku spacja musi się zmienić przed. Chyba że coś źle ogarnąłem to proszę popraw.
| Kod: |
Sub non_breaking_space_after_widow()
Dim d As Document
Dim p As Page
Dim s As Shape
Dim x As Integer
Dim myFindArray
Dim myFindUnit
myFindArray = Array("a", "i", "o", "u", "w", "z")
myFindUnit = Array("km", "m", "cm", "mm", "l", "ml", "kg", "g")
For Each d In Documents 'Loop all the open documents
For Each p In d.Pages 'Loop each page
For x = 0 To 5
p.TextReplace myFindArray(x) & " ", myFindArray(x) & " ", True, False
p.TextReplace UCase(myFindArray(x)) & " ", UCase(myFindArray(x)) & " ", True, False
Next
For x = 0 To 7
p.TextReplace " " & myFindUnit(x), " " & myFindUnit(x), True, False
p.TextReplace " " & UCase(myFindUnit(x)), " " & UCase(myFindUnit(x)), True, False
Next
Next p
Next d
End Sub |
|
|
|
|
 |
N0carz
Bywalec


Wersja CorelDRAW: x7/x8
Pomógł: 1 raz Dołączył: 15 Gru 2017 Posty: 34 Skąd: Lublin
|
Wysłany: 31 Styczeń 2018, 16:14
|
|
|
| tegraf napisał/a: | Tak, wystarczy.
Jednak nie wystarczy.
Trzeba dopisać duże litery + jednostki miar oraz usunąć 5 wiersz od dołu - inaczej niektóre jednostki zostaną zamienione błędnie na wielkoliterowe, np. kB na KB.
Poprawię wieczorem. |
Zrobiłem test tym już przerobionym kodem i wyszło, że niby wszystko działa:) W załączniku widać jak wygląda formatowanie tekstu przed i po uruchomieniu makro.
EDIT
ok jednak nie do końca działało. Próbka była niemiarodajna. Po przeprowadzeniu testu na większym tekście wyszło, że trzeba jeszcze w kodzie dodać spacje przed zmienną tak by wyszukiwało literki które mają przed i za sobą spacje. Inaczej zamieniało na twardą spację po słowach które się kończyły potencjalną sierotką.
tu zmieniony kod
| Kod: | Sub non_breaking_space_after_widow()
Dim d As Document
Dim p As Page
Dim s As Shape
Dim x As Integer
Dim myFindArray 'zmienna do sierotek
Dim myFindUnit 'zmiena do jednotek miar
myFindArray = Array("a", "i", "o", "u", "w", "z") 'definiowanie potencjalnych sierotek
myFindUnit = Array("km", "m", "cm", "mm", "l", "ml", "kg", "g") 'definiowanie skrotow jednostek miar
For Each d In Documents 'szukanie w calym dokumencie
For Each p In d.Pages 'szukanie na stronie
For x = 0 To 5 'petla zamienia spacje po sierotkach
p.TextReplace " " & myFindArray(x) & " ", " " & myFindArray(x) & " ", True, False
p.TextReplace " " & UCase(myFindArray(x)) & " ", " " & UCase(myFindArray(x)) & " ", True, False
Next
For x = 0 To 7 'petla zamienia spacje przed skrotkami jednostek miar
p.TextReplace " " & myFindUnit(x) & " ", " " & myFindUnit(x) & " ", True, False
p.TextReplace " " & UCase(myFindUnit(x)) & " ", " " & UCase(myFindUnit(x)) & " ", True, False
Next
Next p
Next d
End Sub |
test_makro.jpg
|
Pobierz Plik ściągnięto 456 raz(y) 458.46 KB |
|
|
|
|
 |
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum
|
Dodaj temat do Ulubionych Wersja do druku
|
|
|
|
|
|
|
Nowe zasady dotyczące cookies. Wykorzystujemy pliki cookies, aby nasz serwis lepiej spełniał Państwa oczekiwania. Można zablokować zapisywanie cookies, zmieniając ustawienia przeglądarki.
| | Strona wygenerowana w 0.13 sekundy. Zapytań do SQL: 12 |
|
|