|
Corel FORUM
Forum użytkowników programów firmy Corel. Grafika wektorowa, rastrowa i obróbka zdjęć cyfrowych
|
Przesunięty przez: roland 26 Maj 2011, 07:33 |
Wstawienie przed liczbę jak i w dowolne miejsce cyfry zero |
Autor |
Wiadomość |
zmysl84
Bywalec
Dołączył: 16 Lis 2010 Posty: 43 Skąd: Polska
|
Wysłany: 4 Marzec 2011, 11:28 Wstawienie przed liczbę jak i w dowolne miejsce cyfry zero
|
|
|
Witam.
Mam problem...
Mam makro, które numeruje mi obiekty tekstowe (edytowalne) odpowiednio np. od 1 do 100, lecz jeśli chcę, aby niektóre liczby miały przed sobą zero, makro nie uwzględnia cyfry "0" ("n" nie może równać się zero "0", automatycznie zamienia na "1")
Czy wie ktoś jak dopisać do tego makra lub napisać nowe, aby liczby były kolejno np. 01, 02, 0100, itp... ?
Kod: | Sub zmianaOd1DoX() 'change all numbers from 1 to X'()
Dim s As Shape, sr As ShapeRange, p As Page
Dim n As Long, oldStr As String
n = 1
For Each p In ActiveDocument.Pages
p.Activate
Set sr = ActivePage.FindShapes(, cdrTextShape)
For Each s In sr
oldStr = s.Text.Story.Characters.All
If VBA.InStr(oldStr, "") Then
s.Text.Story.Characters.All = n
n = n + 1
End If
Next s
Next p
End Sub |
Dodatkowo chciałbym także nie tylko przed (jak z tym zerem), ale i między cyfry/litery wstawić dany znak np. "-".
Mam przykładowo tekst "ABC123" i chcę aby w tych tekstach po każdej literze "C" była kreska "-" i aby to wyglądało tak: "ABC-123"... jakoś po np. każdym trzecim lub drugim znaku (czy to liczba czy cyfra) wstaw np. "-".
Z góry dzięki. |
|
|
|
|
chezare
Pomógł: 402 razy Dołączył: 24 Gru 2010 Posty: 4551 Skąd: Grodzisk Mazowiecki
|
Wysłany: 4 Marzec 2011, 12:02
|
|
|
s.Text.Story.Characters.All = "0" & n
wstawi zero przed każdą liczbą. Nie bardzo rozumiem co ma być z napisami typu ABC123, bo póki co to makro zamienia wszystkie teksty na liczby? |
|
|
|
|
zmysl84
Bywalec
Dołączył: 16 Lis 2010 Posty: 43 Skąd: Polska
|
Wysłany: 4 Marzec 2011, 20:19
|
|
|
Dzięki z tym zerem, takie proste, a kombinowałem nie tam, gdzie trzeba było.
Co do drugiego...
Tak, te makro zamienia wszystkie pola edytowalne.
A z tym ABC...
Chodzi mi o to:
- mam pola edytowalne np.: od 01 do 0100
- dodatkowo mam pola tekstowe z literami np.: ABC1, DEF2, GHI3 itp...
- chcę aby makro znalazło te pola, które mają minimum 3 znaki (np. "01" już nie zaliczy bo ma dwa znaki) i po tym trzecim znaku wstawił dowolny znak, który przypiszę w makro (np. "-" myślnik).
Wynik będzie następujący (makro wstawi myślnik po trzecim znaku):
- Przed zapodaniem makra
01, 02, ..., 010, 011, ..., 0100, ...
ABC1, DEF2, ..., MNO5, ...
-Po zapodaniu makra
01, 02, ..., 010-, 011-, ..., 010-0, ...
ABC-1, DEF-2, ..., MNO-5, ...
Może teraz bardziej wyjaśniłem :P |
|
|
|
|
maroQ
Doradca
Pomógł: 16 razy Wiek: 40 Dołączył: 08 Lut 2011 Posty: 117 Skąd: Kalisz
|
Wysłany: 4 Marzec 2011, 23:20
|
|
|
zmysl84 napisał/a: | - Przed zapodaniem makra
01, 02, ..., 010, 011, ..., 0100, ...
ABC1, DEF2, ..., MNO5, ... |
Jako że jestem "szamanem informatyki" to pomagam tylko połowicznie więc oto pół lub mniej niż pół tego co chciałeś. Z pozostałą rozbudową sobie bez problemów poradzisz:
Kod: | Sub textME()
Dim oldStr As String
Dim s As Shape
Dim p As Page
Dim arr As Variant
Dim i As Integer
'tablica masek:
arr = Array("ABC*", "DEF*", "GHI*", "JKL*", "MNO*")
For Each p In ActiveDocument.Pages
'zoptymalizowane szukanie
'p.activate jest całkiem zbędne
'no chyba że lubisz pokazywać co makro
'w danym momencie robi
For Each s In p.FindShapes(, cdrTextShape)
oldStr = s.text.Story.Characters.All
'wykonuj do ostatniego elementu tablicy
For i = 0 To UBound(arr)
'jeśli string w stylu np. ABCblablabla to:
If oldStr Like arr(i) And Not oldStr Like "???-*" Then
'dodaj myślnik po 3 znaku
s.text.Story.Characters.All = left(oldStr, 3) & "-" & right(oldStr, Len(oldStr) - 3)
'optymalizacja dla nieoptymalnej funkcji for (znalazłeś to zakończ)
GoTo NextS
End If
Next i
NextS:
Next s
Next p
End Sub
|
Funkcja dodaje tylko myślnik po 3 pierwszych znakach. Szamani informatyki nie mają zbytnich zapasów ziół które zasilają ich puste głowy więc nie mogą się przemęczać przy pisaniu programów za darmo. Poza tym jak Ci napiszę cały program to niczego się nie nauczysz Jak mówią wykładowcy "reszta jest trywialna". |
|
|
|
|
chezare
Pomógł: 402 razy Dołączył: 24 Gru 2010 Posty: 4551 Skąd: Grodzisk Mazowiecki
|
Wysłany: 4 Marzec 2011, 23:33
|
|
|
MaroQ próbujesz być złośliwy i tak się na tym skoncentrowałeś, że zupełnie zapomniałeś o co koledze chodziło. Szukasz konkretnego ciągu znaków, a to nie rozwiązuje problemu. Przeczytaj jeszcze raz post zmysl84 i jak masz ochotę pomóc, to pomóż, dogryzanie innym nie ma sensu, w tym czasie mógłbyś zarobić parę złotych pisząc jakieś mocno komercyjne makro . Nie wiem czy zauważyłeś, ale kolega nie ma bladego pojęcia o pisaniu makr, oczekiwanie że napisze książkę korzystając z pierwszego słowa, które mu podrzucisz jest chyba trochę zbyt optymistyczne.
Miłego weekendu życzę. |
|
|
|
|
zmysl84
Bywalec
Dołączył: 16 Lis 2010 Posty: 43 Skąd: Polska
|
Wysłany: 5 Marzec 2011, 15:49
|
|
|
Dzięki maroQ...
zmieniłem Twoje makro tak, by inni wiedzieli co i jak :)
Kod: | Sub textME()
Dim oldStr As String
Dim s As Shape
Dim p As Page
Dim arr As Variant
Dim i As Integer
arr = Array("?*")
'tutaj znak zapytania znaczy po jednym znaku, można wpisać dwa znaki zapytania, jeśli chcesz po dwóch
For Each p In ActiveDocument.Pages
For Each s In p.FindShapes(, cdrTextShape)
oldStr = s.Text.Story.Characters.All
For i = 0 To UBound(arr)
If oldStr Like arr(i) And Not oldStr Like "?-*" Then
'tutaj ?-* znaczy po jednym znaku wstaw myślnik, wstaw dwa znaki zapytania, jeśli chcesz po dwóch
s.Text.Story.Characters.All = Left(oldStr, 1) & "-" & Right(oldStr, Len(oldStr) - 1)
'tutaj jedynki znaczą ile znaków od lewej, zmienić na ile znaków od lewej
'dodatkowo myślnik w cudzysłowie zmienić na znak, jaki chcesz mieć po danej liczbie znaków
GoTo NextS
End If
Next i
NextS:
Next s
Next p
End Sub |
Troszkę lubię kombinować i wyszło coś, hehe.
Nie umiem pisać makra jak napisał chezare, lecz niektóre rzeczy poniekąd kumam :P
U mnie działa na 12-ce. |
|
|
|
|
chezare
Pomógł: 402 razy Dołączył: 24 Gru 2010 Posty: 4551 Skąd: Grodzisk Mazowiecki
|
Wysłany: 5 Marzec 2011, 19:15
|
|
|
zmysl84, jak byś chciał żeby twoje makro było bardziej uniwersalne, to pokombinuj może z dorobieniem do niego formularza, w którym będziesz mógł ustalać co ma się stać, albo wykorzystaj inputbox do wprowadzania danych. Grzebanie za każdym razem w kodzie jest trochę bez sensu. |
|
|
|
|
zmysl84
Bywalec
Dołączył: 16 Lis 2010 Posty: 43 Skąd: Polska
|
Wysłany: 6 Marzec 2011, 10:01
|
|
|
chezare, troszkę łatwiej mi jest w kodzie pogrzebać, bo form. i box'ów to nie kumam ( na razie :P ), dlatego w kodzie pokombinowałem. Jeśli wiesz gdzie jest jakaś instrukcja do tego dla początkujących to będę wdzięczny :)
Jak na razie będę musiał się ograniczyć do kodu :(
Edit/
Nie mogę na necie znaleźć instrukcji VBA do 12-ki, z tymi formularzami i box'ami.
Jakby ktoś miał chęci i tak z dobrej woli, to mógłby mi pomóc z formularzem do tego.
Byłoby to ułatwienie, jak napisał chezare, podać wartości i koniec, niż co chwila edytować makro. Albo może jakiś przykład na innym makro, abym spróbował na tym wyżej.
Ale to tak na marginesie :) |
|
|
|
|
chezare
Pomógł: 402 razy Dołączył: 24 Gru 2010 Posty: 4551 Skąd: Grodzisk Mazowiecki
|
Wysłany: 6 Marzec 2011, 11:20
|
|
|
zmysl84, to dosyć proste jest, a instrukcji wcale nie musisz szukać, bo są w helpie VBA W Corelu jest dokładnie tak samo jak we wszystkich aplikacjach typu visual coś tam, buduje się to z gotowych klocków. |
|
|
|
|
maroQ
Doradca
Pomógł: 16 razy Wiek: 40 Dołączył: 08 Lut 2011 Posty: 117 Skąd: Kalisz
|
Wysłany: 6 Marzec 2011, 22:53
|
|
|
chezare napisał/a: | Szukasz konkretnego ciągu znaków |
maroQ napisał/a: | pomagam tylko połowicznie |
Jak byś znał się lepiej na programowaniu w VB to sam zaproponował być przerobienie kodu tak by zapewniał usunięcie braku uniwersalności. Widziałem na forum twoje kursy i nie kwestionuję, że nie znasz się na pracy w Corelu. Zapewne znasz się na tym lepiej niż ja, ale na VBA znasz się dużo słabiej co udowadnia kod twoich makr (z różnych tematów). Mój program może być uniwersalny po niewielkich zmianach.
chazare napisał/a: | w tym czasie mógłbyś zarobić parę złotych pisząc jakieś mocno komercyjne makro |
Makra komercyjne piszę znacznie dłużej niż to makro bo muszę zapewnić klientowi to, że makro będzie przyjazne dla użytkownika oraz że się nie wywali po złym jego użyciu.
chezare napisał/a: | próbujesz być złośliwy |
Wręcz przeciwnie
Nazwanie mnie szamanem informatyki nawet mi się spodobało bo daje nowe możliwości odpowiadania "połowicznie". Zresztą jak już pisałem w pamiętnym temacie nie poczuwam się do konieczności pomagania na tym konkretnym forum. Szczególnie, że według twojej definicji szaman informatyki nie pomaga tylko za wszystko bierze kasę. W związku z tym czemu jeszcze nie jestem milionerem?
Nie oceniaj człowieka którego w ogóle nie znasz po tym jak pisze na forum.
Te uśmieszki w powyższej treści sygnalizują byś nie brał moich wypowiedzi tak serio.
-- koniec gryzienia trawy --
W zmiennej arr nie znajduje się wyłącznie konkretny przypadek dodawania myślnika. To jest maska do wyszukiwania myślnika. Opis działania funkcji like można znaleźć w googlach ale po części mogę wyjaśnić temat jeśli będzie taka potrzeba.
? - dowolny pojedynczy znak (tak samo jak w dos 6.22)
* - dowolne znaki w dowolnej ilości (jakikolwiek znak lub jego brak)
# - dowolna cyfra od 0 do 9
[A-Z] - dowolna duża litera (bez polskich znaków)
[a-z] - dowolna mała litera (bez polskich znaków)
[!A-Z] - dowolny znak który nie jest dużą literą
Zapis: ABC* oznacza że jest to dowolny ciąg znaków zaczynający się na ABC można np. napisać: ?B?c* co oznacza dowolny ciąg znaków którego drugi znak to B a czwarty c
Zapis *B?c* oznacza że na początku są dowolne znaki lub ich brak później B, dowolny znak, c i dalej dowolne znaki.
Opis na stronie Microsoftu
Taki zapis nie ma sensu. To jest marnowanie pamięci. Lepiej było by napisać lub jeszcze lepiej zadeklarować w takim przypadku arr jako string a nie jako variant. Oczywiście w VB taka optymalizacja itak nie wiele zmienia, ale szkoda uczyć się złych nawyków programistycznych. Później jak się pisze np. w C czy Basicu program na mikroprocesor to nagle zaczyna brakować RAMu...
Kod: | s.text.Story.Characters.All = left(oldStr, 3) & "-" & right(oldStr, Len(oldStr) - 3) |
Powyższy kod faktycznie narzuca konkretne rozwiązanie, ale po niewielkich zmianach można uzyskać całkiem sporą uniwersalność.
Cytat: | tutaj ?-* znaczy po jednym znaku wstaw myślnik, wstaw dwa znaki zapytania, jeśli chcesz po dwóch |
To nie jest prawda!
Drogą wyjaśnienia: Kod: | Not oldStr Like "???-*" | ten kod został użyty w celu sprawdzenia czy myślnik nie został już dodany.
@zmysl84: jeśli interesuje cię tylko dodawanie myślnika to dostaniesz prostszy kod:
Kod: | Sub textME()
Dim s As Shape
Dim p As Page
For Each p In ActiveDocument.Pages
For Each s In p.FindShapes(, cdrTextShape)
s.Text.Story.Characters.All = DodajMyslnik(s.Text.Story.Characters.All, 3)
Next s
Next p
End Sub
Private Function DodajMyslnik(ByVal ciagZnakow As String, ByVal nrZnaku As Integer) As String
'jeśli myślnik już tam jest
If Mid(ciagZnakow, nrZnaku + 1, 1) = "-" Then
DodajMyslnik = ciagZnakow
Else 'jeśli nie ma myślnika
DodajMyslnik = left(ciagZnakow, nrZnaku) & "-" & right(ciagZnakow, Len(ciagZnakow) - nrZnaku)
End If
End Function |
Samo zastosowanie funkcji DodajMyslnik jest niezbyt optymalne chyba że masz zamiar skorzystać z niej więcej niż raz. Zrobiłem to ponieważ w ten sposób możesz łatwiej wykorzystać to konkretne rozwiązanie.
Wykrycie przejścia z liter np. ABC na cyfry np. 123 (cały tekst: ABC123) można załatwić jednym prostym wywołaniem reguły dla "LIKE". Tyle że tej szamańskiej metody nie będę wyjaśniał.
Podpowiem tylko czego należy użyć:
"#" oraz "*"
Ciężko nauczyć się programować jak się wszystko dostaje na tacy, czasem trzeba trochę pogłówkować chociaż nad prostymi rozwiązaniami. Zresztą nie mogę przecież wspierać konkurencji
P.S. @nick: to standard odpowiadania na zagranicznych forach, nie jest on próbą obrażania kogokolwiek.
P.S. 2.0: dzisiaj jest niedziela więc nie pracuję i nie mógł bym w czasie pisanie tej przydługawej treści posta, napisać komercyjnego makra. |
|
|
|
|
chezare
Pomógł: 402 razy Dołączył: 24 Gru 2010 Posty: 4551 Skąd: Grodzisk Mazowiecki
|
Wysłany: 6 Marzec 2011, 23:43
|
|
|
maroQ, a czy ja chociaż raz napisałem na tym forum, że znam się na pisaniu makr w VBA dla Corela? Wręcz przeciwnie, parę razy napisałem, że nigdy tego nie robiłem. Nie zabiorę się za naukę VBA dla aplikacji, bo mi to do niczego nie potrzebne, ale jak będę musiał, to dam sobie radę. Bez szamanów . Tak na marginesie jeszcze nie widziałem programu, którego użytkownik nie potrafił by wykoleić. Takich programów nie ma.
Miłej nocy. |
|
|
|
|
maroQ
Doradca
Pomógł: 16 razy Wiek: 40 Dołączył: 08 Lut 2011 Posty: 117 Skąd: Kalisz
|
Wysłany: 6 Marzec 2011, 23:51
|
|
|
chezare napisał/a: | Takich programów nie ma |
Jest coś takiego jak przechwytywanie błędów w VBA. Nie działa to tak jak
w javie czy php ale daje się w ten sposób pominąć wiele błędów by nie powiedzieć większość.
Mam na myśli:
"On Error"
Dla małych makr można wyeliminować 99% błędów. Dla dużych jest trochę trudniej znaleźć błąd i jeszcze obsługa tego On Error też nie jest taka oczywista.
chezare napisał/a: | nie widziałem programu, którego użytkownik nie potrafił by wykoleić |
To nie jest tak, że tego się nie da zrobić, tylko to się rzadko opłaca. Dlatego właśnie w nowych językach wysokiego poziomu jak np. java obsługa wyjątków jest konieczna i narzucona przez kompilator. |
|
|
|
|
zmysl84
Bywalec
Dołączył: 16 Lis 2010 Posty: 43 Skąd: Polska
|
Wysłany: 7 Marzec 2011, 13:23
|
|
|
Jestem wdzięczny za 'wszystką' pomoc.
Troszkę, jak dla mnie, za głęboko w temat zabrnęliście, bo ja w 'te klocki' dobry to nie jestem Podziwiam Was
Po prostu trochę jest mi to potrzebne w pracy, lecz nie aż tak często. Mam ileś tam projektów już skończonych, ale czasem jest tak, że jest ponowienie zamówienia z małymi zmianami.
Mam czas na poprawki "na pieszo", lecz każdy wolałby mieć ułatwienie do tego typu rzeczy (jak np. wstawić myślnik lub literkę po każdym trzecim znaku, a numerków/oznaczeń jest np. około 1000 i w górę).
Dzięki za jakąkolwiek pomoc z Wasze strony.
Pozdro. |
|
|
|
|
|
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.16 sekundy. Zapytań do SQL: 13 |
|
|