logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

VBA,EXCEL - podwójna pętla do kopiowania/segregowania danych

blacknigga 30 Lis 2012 16:21 4365 8
  • #1 11593453
    blacknigga
    Poziom 13  
    Posty: 197
    Ocena: 30
    Witam,

    Mam dane w lewym górnym rogu i chcę by makro kopiowało mi tak dane jak te które są pośrodku arkusza (te na niebiesko).
    Czyli input=dane w lewym górnym rogu, output= dane na niebiesko.

    Ja to zrobiłem w 2 częściach (gdyż jest to urywek większego makro które chce stworzyć i robie je w kilku częściach by się nie pogubić:) ).

    Pierwsze makro sprawdza czy w kolejnych wierszach jest ten sam customer i zwraca obok wartość 1 (prawda) lub 2(nie prawda).

    Drugie makro kopiuje kolumne A dopóki w kolumnie C nie napotka "2".
    Problem w tym, że
    1. wtedy makro kończy działanie zamiast kopiować dalej dla kolejnego customera
    2. kończy kopiowanie "o 1 pętle za wcześnie" (ta "2" w kolumnie C jest za wczas)
    3. kopiuje customera x razy zamiast raz, jako nagłówek

    W trzecim makrze próbowałem zrobić podwójną pętle, z tym, że wtedy już kompletnie źle kopiuje, nie te dane które powinien.
    Wiem, że przy tych danych mógł bym zrobić warunek np i=1 to 4 dla "customer" & i
    tyle, że na normalnych danych będą oczywiście różne nazwy. Potrzebuję makra które mi oddzieli kolumnę A nagłówkami z nazwą customera.
    Załączniki:
    • wypelnienie.xls (27 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #2 11593564
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Ufff... Ale kombinowania... :)
    A że tak zapytam to czemu to ma służyć?? Bo po mojemu tylko zamieniasz miejscami dane z kolumn A z B w ten sposób ;)
  • #3 11593585
    blacknigga
    Poziom 13  
    Posty: 197
    Ocena: 30
    Wiem, że trochę zamieszane to, ale tak jak pisałem potrzebuję to do większego makra które ułatwi mi pracę w pracy:)
    Mam np 100 wierszy z różnymi klientami, każdy wiersz ma koło 15 kolumn.
    Potrzebuję skopiować odpowiedni dane dla odpowiedniego klienta do oddzielnego pliku który potem załaduje do odpowiedniego programu który wygeneruje fakturę dla każdego klienta oddzielnie (z jednego pliku).
    Dlatego właśnie potrzebuję by:
    1. wiersz to był nazwą klienta a kolejne 10 to produkty 1 do 10. Potem wiersz 12 to nazwa kolejnego klienta i kolejne 7 produktów. Wiersz 20 klient nr 3 i kolejne produkty i tak w kółko:)
  • #4 11593834
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Skoro chcesz podzielić te dane na arkusze, to tak naprawdę wystarczy jedna pętla for, która dla każdego wiersza z danymi sprawdza, czy istnieje arkusz o nazwie równej nazwie klienta - a jeśli nie to go tworzy - po czym kopiuje do niego dany wiersz (lub zakres wierszy od-do, jeśli te dane masz uporządkowane po kliencie).
  • #5 11595111
    blacknigga
    Poziom 13  
    Posty: 197
    Ocena: 30
    Teraz mi wywala błąd 9 przy pętli for dla i=2 dla lini:
    Set WS = Sheets(cus)
    Kod sprawdzający czy istnieje arkusz ściągnąłem z netu i zmodyfikowałem go.

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #6 11595517
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Bo nie przeniosłeś
    Kod: text
    Zaloguj się, aby zobaczyć kod
    do wnętrza pętli, przez co ten sposób ustalania arkusza wyrzuca błąd. Osobiście nie jestem zwolennikiem takiego właśnie sprawdzania nazwy - myślałem raczej o czymś takim:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #7 11595987
    blacknigga
    Poziom 13  
    Posty: 197
    Ocena: 30
    Dzięki! Moje po poprawkach działa. To był pierwszy sposób jaki znalazłem w internecie, dlatego go użyłem:)
    Co do twojego kodu,
    .Range/.Cells - odwołuje się do aktywnego arkusza? Chodzi mi o te kropki na początku.
    Tworzy arkusz "customer1" lecz nic nie kopiuje do niego
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Przy próbie tworzenia kolejnego arkusza wywala błąd 1004 przy linijce:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Też mi się wydaje, że to wina złego odnośnika w pętli
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #8 11596543
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    blacknigga napisał:
    Co do twojego kodu,
    .Range/.Cells - odwołuje się do aktywnego arkusza? Chodzi mi o te kropki na początku.
    Nie, odwołuje się do obiektu - w tym wypadku arkusza - użytego w otaczającej klauzuli With...
    To taki skrótowiec, którzy przed kropką wstawia to, co jest w With, czyli zamiast powtarzać:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    można dać:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Do aktywnego arkusza odwołuje się Range bez kropki.

    Jeżeli makro odpalasz z aktywnego arkusza z danymi, wtedy Range bez kropki odnosi się do danych, a range z kropką - do arkusza z customerem i do niego dane są kopiowane.
    Uprościłem kod na potrzeby forum, osobiście, żeby uniknąć powyższych wątpliwości, zawsze na początku kodu za pomocą Set ustawiam sobie zmienne do wszystkich arkuszy na których makro będzie pracować i zawsze piszę coś w stylu:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    blacknigga napisał:
    Przy próbie tworzenia kolejnego arkusza wywala błąd 1004 przy linijce:
    Błąd 1004 dostajesz, jak próbujesz utworzyć arkusz o nazwie takiej, jak już istniejący - stąd sporym fragmentem mojego kodu ustalanie, czy arkusz o danej nazwie już jest czy jeszcze go nie ma... Nie wyciąłeś czasem tego fragmentu??
  • #9 11663151
    blacknigga
    Poziom 13  
    Posty: 197
    Ocena: 30
    To jest moje pierwsze makro, które skleiłem z pewnie 10 innych:) każdy urywek tego makra szukałem osobno i "kleiłem" w jedność. Tak więc jak widać, nie wiele mam zdefiniowanych zmiennych, ani SET ani DIM :) Także wiem, że całe moje makro można by było w prostszy sposób napisać, ale na tą chwilę zbyt skomplikowane to dla mnie.

    Błędu już żadnego nie wyrzuca. udało mi się napisać tak, że kopiuje mi wszystko w jednym arkuszu ( na podstawie twojego pomysłu z nowych arkuszem).
    Wpisuje customera do jednej komórki i pętla do while "ten sam customer" następnie .rows.count i dodaje kolejnego customera. W jednej pętli mam 3 zmienne które na koniec powiększają się o 1.
    Dzięki za pomoc!

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik poszukiwał pomocy w stworzeniu makra VBA do kopiowania i segregowania danych w Excelu. Chciał, aby makro kopiowało dane z lewego górnego rogu arkusza do odpowiednich arkuszy dla każdego klienta, gdzie każdy wiersz miałby być nazwą klienta, a kolejne wiersze produktami. W trakcie dyskusji pojawiły się problemy z błędami w kodzie, w tym błędy związane z nieistniejącymi arkuszami oraz błędy przy kopiowaniu danych. Użytkownicy zaproponowali różne podejścia, w tym użycie pętli for do sprawdzania istnienia arkuszy oraz poprawki w kodzie, co ostatecznie doprowadziło do rozwiązania problemu i poprawnego działania makra.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA