Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Excel vba - wyszukanie i kopiowanie wierszy do arkusza vba

mariuszlis1 11 Oct 2012 20:11 8640 12
  • #1
    mariuszlis1
    Level 9  
    Witam
    Bardzo proszę o pomoc. Niestety moje umiejętności z vba nie są na najwyższym poziomie, a poniższe makro bardzo przyspieszyło by mi pracę.

    Często muszę tworzyć raport z wszystkich lat, dla szukanej przeze mnie nazwy ulicy.
    W załączeniu przesyłam plik z czterema arkuszami.
    Potrzebuję makro, które wyszukuje wiersze po nazwie ulicy. Nazwa ulicy znajduje się w każdym arkuszu w kolumnie E. Każdy odnaleziony wiersz, który posiada w kolumnie E nazwę szukanej przeze mnie ulicy, powinien być kopiowany do arkusza o nazwie RAPORT.
    W moim prawdziwym pliku ilość wierszy w każdym arkuszu jest zmienna (co jakiś czas są dopisywane nowe wiersze) czyli makro powinno przeszukać kolumnę E, do momentu aż napotka pustą komórkę, a następnie powinno przejść do następnych arkuszy i zrobić to samo.
    W moim prawdziwym pliku mam 12 arkuszy do przeszukania.
    Z każdym nowym rokiem będę musiał dostawiać nowe arkusze - ale w tym przypadku mógłbym sobie sam modyfikować makro aby zwiększyć jego zakres.
    PS:
    Aby system przeszukiwał arkusze po nazwie interesującej mnie ulicy, muszę ją podać. Ważne jest abym nie musiał podawać całej nazwy ulicy, a jedynie kilka pierwszych liter.
    Przykładem może być ulica Borkowska. Chciałbym aby wystarczyło podać niepełną nazwę ulicy np Borkow lub Bork lub Borkowsk itp.
    Nazwy ulic w kolumnie E powtarzają się.

    Z góry bardzo dziękuję zainteresowanym i pozdrawiam
  • #2
    adamas_nt
    Moderator of Programming
    W takim przypadku potrzebne są dwie pętle. Pierwsza For dla wszystkich arkuszy, których nazwa <>"RAPORT", wewnętrzna Do While...Loop z licznikiem dla Nr wiersza i instrukcją porównująca zawartość komórki, Np: If Instr(Cells(wiersz, 5).text, szukany_fragment)>0 Then i tu kopiowanie.
    Szukaną można pobrać przez InputBox.
  • #3
    mariuszlis1
    Level 9  
    Bardzo dziękuję za szybką odpowiedź. Niestety temat mnie przerasta i chyba Twoje wskazówki mi nie wiele pomogą. Jeśli znalazł by ktoś trochę czasu aby napisać mi makro to będę bardzo wdzięczny. Chcę tym makrem zautomatyzować prace w administracji publicznej - przynajmniej trochę przyśpieszy to prace.

    pozdrawiam
  • Helpful post
    #4
    tomekptk
    Level 17  
    Tu masz kod tego makra. Procedurę SzukajUlicy() podepnij pod jakis przycisk. Myślę, że z resztą sobie poradzisz.

    Code: vbscript
    Log in, to see the code
  • #5
    mariuszlis1
    Level 9  
    Dzięki,
    makro jest bardzo dobre. Niestety przeszukuje tylko ten arkusz w którym je uruchomię. Bardzo proszę o jeszcze jedną modyfikację: Aby makro przeszukało arkusz pierwszy o nazwie 2010, później arkusz drugi o nazwie 2011 i arkusz trzeci o nazwie 2012. Po przeszukaniu każdego arkusza niech kopiuje wiersze jeden pod drugim do arkusza o nazwie RAZEM, ale zaczynając wklejanie od drugiego wiersza. W pierwszym wierszu arkusza RAZEM mam nazwy nagłówków.
    Powyższe makro jest super, brakuje tak niewiele do sukcesu. Wielkie dzięki tomekptk!
  • #6
    tomekptk
    Level 17  
    Ćwiczyłem na tym Twoim skoroszycie i makro działało na wszystkich arkuszach.
    Uruchamiałem je z arkusza RAPORT i znajdował ulice w innych arkuszach, ale należałoby zamiast lWiersz dołożyć dodatkową zmienną sterującą pozycją wiersza w arkuszu RAPORT, bo wynik będzie rozstrzelony po wielu wierszach. Ale chyba sobie z tym poradzisz. Dzięki za punkty!
  • #7
    mariuszlis1
    Level 9  
    Niestety jestem bardzo początkujący. nie wiem jak dodać dodatkową zamienną. Nie wiem czy dobrze wszystko opisałem, ale potrzebuję aby w arkuszu RAPORT znalazły się wiersze z wszystkich lat dla szukanej przeze mnie ulicy. Np. ul Jasna występuje w pierwszym arkuszu 1raz, w drugim 3 razy, w trzecim 1raz - w arkuszu RAPORT powinno się wkleić 5 wierszy jeden pod drugim.
    bardzo proszę o uzupełnienie makra. Mam nadzieję że to nie jest dużo pracy. Pozdrawiam
  • #8
    adamas_nt
    Moderator of Programming
    Problem w tym, że wiersz źródłowy i docelowy przypisane są do tej samej zmiennej. Wiersz źródłowy powinien być "resetowany" przed pętlą Do, a inkrementacja docelowego realizowana wewnątrz instrukcji If.
    Prościej byłoby kopiować całe wiersze. Ewentualnie komórki wiersza w pętli For, gdzie licznikiem byłby Nr kolumny (2-23). Przydałaby się również Lp w kolumnie 1 (wiersz docelowy -1 ). Ale to tylko ot tak, na mój "chłopski rozum"...
  • #9
    mariuszlis1
    Level 9  
    Jeśli prościej jest kopiować całe wiersze to jeszcze lepiej bo miałem rozszerzyć zakres. Najważniejsze jest dla mnie aby znalazły się one w arkuszu raport, ale niestety to mnie przerasta...
  • #11
    mariuszlis1
    Level 9  
    Wielkie dzięki za to makro - jest świetne. Właśnie o to mi chodziło. A co należy dopisać aby makro kopiowało wiersze z formatowaniem. W niektórych komórkach mam też hiperłącza, a są kopiowane jako tekst.
    Jeszcze raz dziękuję za pomoc!
  • #12
    adamas_nt
    Moderator of Programming
    Kopiuj całe wiersze. Odpowiednia linia jest w makro w załączniku. Usuń apostrof opisanej linii, wyrzuć/zaapostrofuj trzy następne (od For do Next).
  • #13
    mariuszlis1
    Level 9  
    Temat został bardzo dobrze rozwiązany przez adamas_nt. Wielkie dzięki !