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

[Rozwiązano] Excel kopiowanie zestawów wierszy do drugiego arkusza w tym samym skoroszycie

PiotrBukowski 09 Lip 2021 12:33 528 8
  • #1 19513458
    PiotrBukowski
    Poziom 11  
    Posty: 257
    Pomógł: 3
    Ocena: 38
    Witam wszystkich serdecznie.

    Bardzo potrzebuję pomocy.

    Wszystko opisane jest w załączonym pliku. Opisywanie tego na sucho, bez wglądu w plik, raczej nie będzie zrozumiałe, więc napiszę możliwie prosto:

    W kolumnie "l.p" wprowadzona jest liczba porządkowa produktu, a w kolumnie "ilość" liczba produktów tego samego typu.

    Makro kopiuje dane z wierszy (jeden wiersz to jeden produkt), tyle razy ile wskazuje liczba w kolumnie "ilość"

    np. produkt o liczbie 1 w ilości 5 kopiowany zostaje do sąsiedniego arkusza w formie:
    1
    1
    1
    1
    1

    (to uproszczenie - kopiowane jest więcej danych z tego samego wiersza).

    ale kiedy produkt składa się np. z dwóch lub więcej elementów (zestaw), co jest opisane w formacie

    1/1
    1/2
    1/3

    a w kolumnie "ilość" określona liczba tych samych zestawów to np. 3, to makro kopiuje to tak samo jak pojedynczy produkt, czyli

    1/1
    1/1
    1/1
    1/2
    1/2
    1/2
    1/3
    1/3
    1/3

    a powinno być:

    1/1
    1/2
    1/3
    1/1
    1/2
    1/3
    1/1
    1/2
    1/3

    Opis i dodatkowe informacje umieściłem w załączonym pliku.

    Bardzo proszę o pomoc :)
    Załączniki:
    • przykładowy.xls (266 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #2 19513863
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Nie należy umieszczać w kodzie
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod
    na wszelki wypadek. Kontrola błędów umożliwia panowanie nad kodem. Można włączać ignorowanie błędów w ściśle określonych miejscach programu, sprawdzać czy istotnie błąd wystąpił, obsługiwać taki przypadek, a później niezwłocznie przywracać kontrolę błędów.
    Program z totalnie wyłączoną kontrolą błędów może dawać niepoprawne wyniki, a użytkownik nie będzie tego świadomy.

    Proszę sprawdzić, czy teraz kod działa zgodnie z oczekiwaniem.
    Załączniki:
    • przyk?adowy1.xls (269.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #3 19516847
    PiotrBukowski
    Poziom 11  
    Posty: 257
    Pomógł: 3
    Ocena: 38
    Działa dokładnie tak, jak tego potrzebuję. Super! Bardzo dziękuję za pomoc i wyjaśnienie.

    Pozdrawiam serdecznie.
  • #4 19521209
    PiotrBukowski
    Poziom 11  
    Posty: 257
    Pomógł: 3
    Ocena: 38
    Witam ponownie,

    Wracam z tematem, bo pojawił się problem, którego nie przewidziałem. Ma on związek z tym tematem: https://www.elektroda.pl/rtvforum/topic3780899.html

    Kopiowanie zestawów do sąsiedniego formularza działa świetnie, ale skrypt w drugim skoroszycie, do którego wczytywane są wartości z arkusza "karta", opracowanego w tym poście, bazuje na dwóch wartościach w jednym wierszu. Mianowicie chodzi zawarty w kolumnie l.p ukośnik "/" oraz oznaczenie zestawu w kolumnie "typ" literami zz, zpz, zppz, zpppz itd.

    W rezultacie sytuacja wygląda tak, że skopiowane zestawy o tych samych parametrach, jeden pod drugim, są traktowane jako jeden zestaw a nie osobne zestawy o tych samych parametrach.

    Np. Do arkusza wczytane są 3 takie same zestawy o identycznych oznaczeniach, czyli:
    1/1 100 200 150 0 z
    1/2 150 200 150 0 p
    1/3 100 200 150 0 z
    1/1 100 200 150 0 z
    1/2 150 200 150 0 p
    1/3 100 200 150 0 z
    1/1 100 200 150 0 z
    1/2 150 200 150 0 p
    1/3 100 200 150 0 z

    rezultat powinien być taki:
    1 100 200 150 340 z
    150 200 p
    100 200 z
    1 100 200 150 340 z
    150 200 p
    100 200 z
    1 100 200 150 340 z
    150 200 p
    100 200 z

    a jest taki:
    1 100 200 150 1040 z
    150 200 150 p
    100 200 150 z
    100 200 150 z
    150 200 150 p
    100 200 150 z
    100 200 150 z
    150 200 150 p
    100 200 150 z
    Czyli skrypt traktuje wszystkie 3 zestawy jako jeden.

    Domyślam się, że może tu pomóc "uczulenie" skryptu na kolejną cyfrę za ukośnikiem. W każdej grupie (zestawie) cyfra za ukośnikiem zawsze rośnie o 1, nigdy nie jest taka sama jak w poprzednim elemencie zestawu i nigdy nie będzie mniejsza. Format zapisu zawsze będzie 1/1, 1/2, 1/3 itd. dla jednego całego zestawu.

    Podglądowy arkusz w załączniku.

    Bardzo proszę o pomoc, bo mnie niestety to przerosło :/
    Załączniki:
    • arkusz podglądowy (2) kopia.xls (61 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #5 19521542
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Już w poprzednim wątku zwracałem uwagę, że dane mają być reprezentatywne. Tam nie było nic o tym, że numery bloków mogą się powtarzać i wobec tego w kodzie była wykorzystana zmiana numeru bloku w stosunku do poprzedniej.
    Teraz przyjąłem, że jeśli blok jest złożony z kilku elementów, to numeracja po / zaczyna się od 1.
    Trzeba te bloki jakoś rozróżniać.
    W tabeli, gdzie podałeś oczekiwane wyniki są niezgodności w kolumnie H (zaznaczyłem te liczby na czerwono, niektórych liczb brakuje). Skąd takie wartości?
    Nowy wariant kodu w załączniku.
    Załączniki:
    • arkusz podglądowy (2) kopia1.xls (64 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #6 19522689
    PiotrBukowski
    Poziom 11  
    Posty: 257
    Pomógł: 3
    Ocena: 38
    Bardzo dziękuję za odpowiedź.

    Kod działa bardzo dobrze w załączonym przez Pana pliku, ale po przeniesieniu go do arkusza docelowego i drobnych modyfikacjach, które nie powinny mieć wpływu na działanie programu, rezultaty obliczeń są inne od spodziewanych. Kiedy pomógł mi Pan za pierwszym razem z tym zadaniem, zrobiłem tak samo, czyli przeniosłem podany kod z arkusza przykładowego do docelowego, zrobiłem kilka modyfikacji w wartościach i działało super, tym razem to nie zadziałało i nie mam pojęcia co może być tego przyczyną. Dlatego załączam finalny plik z całościowym kodem (nie tylko tym, o którym mowa w tym wątku). Zauważy Pan w nim, że jest kilka sekcji tego samego kodu, który Pan stworzył, ale dla innej wartości komórki D2. Poproszę o pomoc tylko w pierwszym wypadku dla warunku z "ALU" a resztę sobie przerobię sam.

    Bardzo dziękuję za pomoc i poświęcony czas.
    Załączniki:
    • arkusz podglądowy (2).xls (144 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #7 19523278
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Nowy kod był niedokładnie przepisany, zostały 2 linie ze starego kodu, które należało usunąć. Poza tym została zmieniona struktura logiczna kodu.
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod
    to nie jest to samo co
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod

    Poprawiłem pierwszy blok, tak jak pisałeś, dalej już nie sprawdzałem. Myślę, że to powtarzanie kodu w tej formie jest zbędne, ale tego już nie analizowałem. Można to ewentualnie wyodrębnić jako podprogram.

    We wcześniejszej części kodu zaproponowałem użycie instrukcji Select Case zamiast kilku zagnieżdżonych If-ów.

    W wynikach wzorcowych jest niezgodność w komórkach X14 i X16. Proszę to sprawdzić. Moim zdaniem kod liczy poprawnie.
    Załączniki:
    • arkusz podglądowy (3).xls (130 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #8 19527504
    PiotrBukowski
    Poziom 11  
    Posty: 257
    Pomógł: 3
    Ocena: 38
    Bardzo dziękuję za zoptymalizowanie kodu i pomoc przy stworzeniu skryptu do obliczeń.

    Sprawdziłem czy wszystko działa tak jak potrzebuję, i wygląda na to, że jest bardzo dobrze. Oczywiście w trakcie użytkowania arkusza może coś się czasem urodzić (chociaż mam nadzieję, że już nic nie wyskoczy), wtedy pozwolę sobie zwrócić się o pomoc.

    Raz jeszcze bardzo dziękuję i serdecznie pozdrawiam.
  • #9 20322605
    PiotrBukowski
    Poziom 11  
    Posty: 257
    Pomógł: 3
    Ocena: 38
    Działa fantastycznie :) - zamykam.

Podsumowanie tematu

✨ Użytkownik potrzebował pomocy w stworzeniu makra w Excelu, które kopiowałoby zestawy wierszy do drugiego arkusza w oparciu o liczby porządkowe i ilości produktów. Problem polegał na tym, że makro nieprawidłowo kopiowało zestawy złożone z kilku elementów, traktując je jako pojedyncze produkty. Po kilku interakcjach, w których użytkownik otrzymał wskazówki dotyczące kontroli błędów i optymalizacji kodu, udało się dostosować makro tak, aby poprawnie kopiowało zestawy w odpowiedniej kolejności. Użytkownik potwierdził, że kod działa zgodnie z oczekiwaniami, a wszelkie dalsze problemy będą zgłaszane w przyszłości.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA