Corel FORUM Strona Główna Corel FORUM
Forum użytkowników programów firmy Corel. Grafika wektorowa, rastrowa i obróbka zdjęć cyfrowych

FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy
RejestracjaRejestracja  ZalogujZaloguj  DownloadDownload

Poprzedni temat «» Następny temat
Przesunięty przez: roland
26 Maj 2011, 08: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: 39
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: 39
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? :-P :-D
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

Cytat:
arr = Array("?*")

Taki zapis nie ma sensu. To jest marnowanie pamięci. Lepiej było by napisać
Kod:
arr = "?*"
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 :-D :-P

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: 39
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
Kod:
try{
}catch{

}

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 :oops: Podziwiam Was :-o

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.
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
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

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
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.11 sekundy. Zapytań do SQL: 14