Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Excel makro znajdź ciąg znaków

30 Sty 2012 14:18 4844 9
  • Poziom 2  
    Witam!

    Zaczynam przygodę z makrami i męczę się z takim problemem, szukałem odpowiedzi na forum ale bez skutecznie.

    W exelu mam kolumnę w której wiersze zawierają dość długi ciąg:
    Pz 3456869190 na 34612363052 Odsetki
    oraz
    Pz 2547869190 na 75240863052 Lokata

    Chciałbym wyciągnąć liczbę po "Pz" oraz po wyrazie "na" i skopiować te dwie liczby gdzieś do innej kolumny.

    Początek ciągu jest zawsze taki sam, czyli Pz(spacja)(liczba)(spacja)na(spacja)(liczba)
    Podejrzewam, że trzeba tu zastosować funkcję find która znajdzie wyraz "Pz" oraz odliczy odpowiednią ilość spacji.

    Ale nie mogę jej poprawnie zaimplementować.

    Z góry dziękuję za pomoc.
  • Poziom 12  
    nie podpowiem ci nic odnosnie makro, ale powiem jak ja uzyskalbym taki rezultat bez zadnego bawienia sie w makro

    1 zainstaluj programmers notepad, jest darmowy
    2 skopiuj tresc z excela do notepada
    3 i teraz magiczne opcje znajdz wszystkie i zamien "PZ" > "PZ ", z wyrazem NA zamienic musisz "NA" > " NA "
    Tym sposobem w sekunde rozdzilisz sobie wszystkie dane, pozniej tylko zaimportuj wszystko spowrotem do excela, wszystko bedziesz mial w osobnych kolumnach a dalej juz mozesz sobie obrabiac dane.

    Czas wykonania zadania 2 minuty
  • Pomocny post
    Poziom 40  
    A to musi być makro?

    Jeżeli tekst masz w A1 to dla pierwszej cyfry
    =FRAGMENT.TEKSTU(A1;ZNAJDŹ(" ";A1;1)+1;ZNAJDŹ(" ";A1;ZNAJDŹ(" ";A1;1)+1)-ZNAJDŹ(" ";A1;1)-1)
    a dla drugiej
    =FRAGMENT.TEKSTU(A1;ZNAJDŹ("na ";A1;1)+3;ZNAJDŹ(" ";A1;ZNAJDŹ("na ";A1;1)+3)-ZNAJDŹ("na ";A1;1)-3)
    Przeciągasz w dół i tyle

    Ponizej załącznik

    A jeżeli uważasz że porada kolegi makbeta ci wystarczy to excel ma również funkcję "Tekst jako kolumny" (w e2003 menu Dane i "Tekst jako kolumny..." , w 2007 też jest ale nie pamiętam gdzie)
    I nie musisz przekopiowywać nic do innego programu a później z powrotem do excela wystarczy tylko w "Tekst jako kolumny..." zaznaczyć że wyznacznikiem kolumny jest spacja.
  • Poziom 2  
    Dzięki za zainteresowanie problemem.

    Niestety tutaj makro by było bardzo pomocne, plik będzie używało kilka osób (zwykłych szarych użytkowników)

    Makro można podpiąć pod przycisk i po problemie, każdy sobie kliknie i mu się wszystko ładnie zrobi.

    Problem polega na tym że z tego jednego pliku musi powstać csv który będzie zawierał w pierwszej kolumnie dane po "Pz" a w drugiej dane po "na".

    Csv będzie zaczytywany do pewnego systemu.

    Natomiast oryginalny plik jest dostarczany codziennie, więc musiałbym codziennie ustawiać w nim formuły, tak mogę sobie stworzyć arkusz z makrem który mi będzie obrabiał ten plik i tworzył csv.

    Jedyną przeszkodą dla mnie jest funkcja szukaj, nie wiem jak jej użyć do tego żeby w pętli mi wybierało te dwie wartości.
  • Poziom 40  
    Nie wiem jak masz poukładane dane
    Założyłem że dane są w pierwszym arkuszu w kolumnie A
    Proszę przykład.
    Nie wprowadzałem zwrotu cyfr dpo arkusza bo jak wspomniałem nie wiem gdzie to zwrócić. Mam nadzieję że dasz sobię radę.

    Code:
    Sub rozdziel()
    

    ilewierszy = Sheets(1).Range("A1").End(xlDown).Row

    For x = 1 To ilewierszy
        tekst = Cells(x, 1).Value

        pz = InStr(1, tekst, "Pz ", 1) + 3  'początek pierwszej cyfry
        ko1 = InStr(pz, tekst, " ", 1)      'koniec pierwszej cyfry

        na = InStr(1, tekst, "na ", 1) + 3  'początek drugiej cyfry
        ko2 = InStr(na, tekst, " ", 1)      'koniec drugiej cyfry

        cyfra1 = Mid(tekst, pz, ko1 - pz)
        cyfra2 = Mid(tekst, na, ko2 - na)

    Next x

    End Sub
  • Pomocny post
    Moderator Programowanie
    A czy nie prościej byłoby rozbić ciąg Split'em wg spacji? Powstanie 5-cio elementowa tablica, gdzie druga i czwarta wartość to nasze liczby...
  • Pomocny post
    Poziom 40  
    adamas_nt napisał:
    A czy nie prościej byłoby rozbić ciąg Split'em wg spacji? Powstanie 5-cio elementowa tablica, gdzie druga i czwarta wartość to nasze liczby...


    Przyznam że nie znałem funkcji split ale rzeczywiście to najszybszy sposób (jedna linijka kodu) i prosty w odwołaniach. ( Na marginesie - dla mniej zorientowanych - pierwszy element tablicy ma "index" 0 )

    Code:
    Sub rozdziel2()
    

    ilewierszy = Sheets(1).Range("A1").End(xlDown).Row

    For x = 1 To ilewierszy
       
        tekst = Split(Cells(x, 1).Value, " ", -1, 1)
        MsgBox "Cyfry w " & x & " wierszu to:" & Chr(10) & tekst(1) & Chr(10) & tekst(3)
       
    Next x

    End Sub
  • Poziom 2  
    Hmm, coś nie chce to u mnie ruszy, dane pobieram z komórki F, zmieniłem sobie w "Range".
    Przy pierwszym przykładzie przy zmiennej cyfra1 wyrzuca błąd "Invalid procedure call or argument"
    Przy drugim: "Subscript out of range"

    Nie wiem czy to ma jakieś znaczenie, używam Office 2010.

    Jak dodatkowo można zabezpieczyć to makro przed "śmieciami" w komórce, np jakiś tekst nie zawierający żadnej spacji ani początku "Pz"?

    Tylko komórki zaczynające się od "Pz" są poprawne.

    Ale dla testów wrzuciłem tylko poprawne ciągi.
  • Pomocny post
    Poziom 40  
    Rozpatruje drugi kod bo jest prostszy
    maxxx593 napisał:
    dane pobieram z komórki F, zmieniłem sobie w "Range".

    To trzeba poprawić też Cells(x,1) na Cells(x,6) bo "F" to 6 kolumna

    Jeżeli tylko PZ cię interesują daj warunek sprawdzający początek (dwa pierwsze znaki).

    Code:
    Sub rozdziel()
    

    ilewierszy = Sheets(1).Range("F1").End(xlDown).Row

    For x = 1 To ilewierszy
       
        If Left(Cells(x, 6).Value, 2) = "Pz" Then
            tekst = Split(Cells(x, 6).Value, " ", -1, 1)
            MsgBox "Cyfry w " & x & " wierszu to:" & Chr(10) & tekst(1) & Chr(10) & tekst(3)
        End If
       
    Next x

    End Sub
  • Poziom 2  
    Faktycznie, nie zwróciłem uwagi na parametr: Cells(x,6)

    Teraz jest ok, wszystko działa.

    Dzięki wielkie za pomoc :D