Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

VBA/Excel Makro kopiujace przy spełnieniu warunku

Ruda-wydra 16 Kwi 2014 14:51 3048 16
  • #1 16 Kwi 2014 14:51
    Ruda-wydra
    Poziom 5  

    Dzień dobry,

    Na wstępie powiem że ze wszystkich sił starałam się nie fatygować nikogo by mi pomógł znaleźć rozwiązanie problemu, próbując sama zrozumieć dlaczego tak się dzieje. Jednak moja nieznajomość VBA wzięła górę i do co utknęłam w martwym punkcie (choć może nie do końca bo makro w sumie robi co chce).

    Makro które udało mi się stworzyć, przerabiając informacje znalezione w internecie wygląda tak:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    I zasadniczo ono działa, robią prawie to co chce (wymaga paru poprawek kosmetycznych już ręcznie ale działa). ActiveSheet zdefiniowany jest tak dlatego że nie znam nazw które będą skoroszytów które będą wprowadzane w przyszłości. Makro działa pod skrótem klawiszowym

    Co robi to makro:
    1) Kopiuje wartości które spełnią warunek taki że kolumna "B" zawiera tak do ostatniego pełnego wiersza w arkuszu w którym zostanie odpalona(przynajmniej tak mi się wydaje że to działa )

    2)Wkleja wartości spełniające warunek do pierwszego wolnego wiersza arkusza "Zestawienie"

    Problem
    1) Chciałabym by kopiował cały wiersz w którym warunek został spełniony jednak tylko do kolumny R (teraz kopiuje całe wiersze). wiem że problem leży tutaj:
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    Ponieważ jest .EntireRow jednak próby podmienienia tego w jakikolwiek sposób powodują że makro nie działa, jednak starałam ustawić się zakres w ten sposób:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Potrzebuje by kopiował tylko do kolumny R gdyż dalej w arkusza po za zestawieniem pojawiają się informacje które są mi nie potrzebne.

    2)Nie chce kopiować kolumny A ponieważ są tam liczby porządkowe przypisane do danego arkusza jednak zmiana gdziekolwiek wartości A na B powoduje błąd (teraz po prostu ręcznie poprawiam numery w zestawieniu).

    3) czy dało by się to chociaż przyśpieszyć bo teraz skopiowanie 20 wartości zajmuje straszni długo, a zdarzą się arkusze gdzie będzie ich więcej.

    Jeśli całe makro się nie nadaje to proszę powiedzcie, będę kombinować nad innym

    Z góry dziękuje za poświęcenie czasu jeśli ktoś dotarł do końca.
    Pozdrawiam
    P.S
    Istotne jest chyba że w każdym nowym arkuszy dane wprowadza się od wiersza A5 a zestawienie zaczyna się od wiersza A3 (Przy czym A to liczby porządkowe) interesujące mnie dane zaczynają się od B a kończą na R (ilość wierszy jest zmienna)

  • #2 16 Kwi 2014 15:08
    marcinj12
    Poziom 40  

    Ruda-wydra napisał:
    Set zakres = Wk.Range("A5:R5" & Wk.Cells(Rows.Count, "A").End(xlUp).Row)
    Takie sklejenie adresu daje jakąś dziwną liczbę. Chyba chodziło o
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    ?

    Ja bym w ogóle to całe makro uprościł tak:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

  • #3 16 Kwi 2014 16:05
    Ruda-wydra
    Poziom 5  

    marcinj12 napisał:
    Takie sklejenie adresu daje jakąś dziwną liczbę. Chyba chodziło o
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    ?

    Tak masz racje chodziło właśnie o to

    I teraz zupełnie nie wiem co mam zrobić z makrem które zrobiłeś, za duże uproszczenie.

    Wydaje mi się że tutaj powinnam wstawić fragmenty odpowiedzialne za kopiowanie:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Ale nie jestem pewna czy ani nie mam pomysłu jak, pokombinuje.
    I jeszcze jedno pytanie bo nie bardzo rozumiem co robi to:
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Chyba że właśnie to ma na celu skopiowanie zakresów i wklejenie ich do pożądanego zakresu ?

  • #4 16 Kwi 2014 16:27
    marcinj12
    Poziom 40  

    Ruda-wydra napisał:
    I teraz zupełnie nie wiem co mam zrobić z makrem które zrobiłeś, za duże uproszczenie.
    Przepraszam.. Mam je trochę skomplikować?? ;)
    Ruda-wydra napisał:
    Wydaje mi się że tutaj powinnam wstawić fragmenty odpowiedzialne za kopiowanie:
    Napisałaś, że warunkiem kopiowania jest:
    Cytat:
    Kopiuje wartości które spełnią warunek taki że kolumna "B" zawiera "tak" do ostatniego pełnego wiersza w arkuszu w którym zostanie odpalona
    .
    W swoim kodzie przeglądałaś tak naprawdę cały zakres komórek - od A do R - i jeśli gdzieś była wartość "tak", to coś tam kopiowało. To też pewnie wydłużało czas obliczeń.
    We fragmencie o który pytasz poprawiłem to właśnie tak, żeby pętla For Each sprawdzała na ten warunek tylko komórki z kolumny B.

    Ruda-wydra napisał:
    I jeszcze jedno pytanie bo nie bardzo rozumiem co robi to:

    Kod Visual Basic - [rozwiń]
    Ww.Range("A" & ost_zest & ":Q" & ost_zest).Value = Wk.Range("B" & w.Row & ":R" & w.Row).Value

    Chyba że właśnie to ma na celu skopiowanie zakresów i wklejenie ich do pożądanego zakresu ?
    Tak właśnie. Kopiuje zakresy między arkuszami. Uproszczona wersja kopiuj - wklej specjalnie wartości

  • #5 16 Kwi 2014 22:22
    Ruda-wydra
    Poziom 5  

    Jestem Ci bardzo wdzięczna za takie uproszczenie, tylko chodziło mi o fakt że nie rozumiałam zupełnie co, jak i dlaczego :)

    Jednak pojawił się problem, bo to nie kopiuje do arkusza i przez to że jest to tak krótkie to nie do końca dla mnie zrozumiałe.
    Moja funkcja wygląda teraz tak :

    Kod: vb
    Zaloguj się, aby zobaczyć kod




    I problem jest jak dla mnie z połączeniem między arkusz aktywny, a zestawienie, bo jeśli odwróciłam tą linie
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    w ten sposób:
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    To makro pięknie wyczyściło mi zakres taki jak chciałam by kopiował z pominięciem kolumn w którym nie było wartości przeze mnie szukanej. Więc cała reszta założeń działa bez zarzutu.
    Próbowałam kopiować to tak jak mi to napisałeś to arkusz coś tam sobie liczył ale nie przekopiował żadnej wartości, stąd mój wniosek.

    Czy mógł byś mi podpowiedzieć co w takim razie może być źle, lub czego brakuje ?

  • #6 17 Kwi 2014 15:14
    marcinj12
    Poziom 40  

    Jak rozumiem, dane masz w arkuszu Wk (aktywnym) i chcesz je przekopiować do arkusza Ww (zestawienie)? Jeśli tak, po lewej stronie musi być odniesienie do arkusza, do którego kopiujesz dane (Ww), a po prawej - arkusza źródłowego (Wk). Dlatego też dziwię się, że piszesz że to zdziałało odwrotnie.

    Jeden szczegół na który nie zwróciłem uwagi - jeżeli w aktywnym arkuszu sprawdzasz warunek w pętli For Each dla kolumny B, to zmienna użyta do ustalenia ostatniego niepustego wiersza:

    Kod: vb
    Zaloguj się, aby zobaczyć kod
    w zasadzie też powinna być użyta dla kolumny B.
    Generalnie, używa się tego polecenia dla tej kolumny, w której na pewno będą jakieś dane (liczba porządkowa, jakieś Id etc).

    Pomijając powyższe, o ile nie ogarnęła mnie jakaś pomroczność jasna, jestem pewien, że ten całościowy kod który napisałaś w ostatnim poście jest poprawny i powinien kopiować komórki z aktywnego arkusza do arkusza zestawienie.
    Jeśli dalej będziesz mieć z tym problem, to zamieść jakiś przykładowy plik.

  • #7 17 Kwi 2014 16:07
    Ruda-wydra
    Poziom 5  

    Tak dokładnie Wk jest aktywny a Ww jest tym do którego chce to kopiować (zresztą już to zamieniłam Wk=wksZ a Ww = wksDo bo tak wydawało mi się to bardziej jasne)

    Nie powinno zadziałać? Cóż ale przynajmniej wiem że cała reszta działa i robi wszytko to tak jak chciałam (za co bardzo Ci dziękuje).
    Aktualnie walczę z tematem, a że teraz zaczynam rozumieć to "za duże uproszczenie", więc spróbuje rozwiązać problem sama (przekopie forum bo już znalazłam kilka wątków które mają zbliżone problemy) . Jak się nie uda i stwierdzę że problem mnie przerósł to zapytam wtedy czy mógł byś mi pomóc.

    Tak czy inaczej już masz duże dziękuje za uproszczenie kodu i sprawdzenie czy dobrze wszytko zapisałam :). Jak znajdę rozwiązanie też się nim podzielę.

  • #8 28 Kwi 2014 21:23
    lukaszp2
    Poziom 6  

    Witam:)

    od tygodnia walczę z podwójną pętlą... mimo chęci nie potrafię tego przejść (chyba wiedzy brakuje).

    Zasada prosta:
    - najpierw szukamy czy w J2:J jest coś równego warunków i to działa,
    - jeśli powyższ się zgadza to ma sprawdzić czy w K2:K jest opis "otwarta"

    Po spełnieniu obu ma skopiować wiersz...

    Mogę prosić o wsparcie co robię nie tak?

    Kod: vb
    Zaloguj się, aby zobaczyć kod

  • #9 28 Kwi 2014 22:33
    JRV
    Specjalista - VBA, Excel

    Witam.
    To nie w ten sposób (For Each...), trzeba
    For R=2 to ost_w
    If Wk.Range("K" &R) = "otwarta" AND (Wk.Range("J" & R)= Arkusz7.Range("S1").Value Or Wk.Range("J" & R)= Arkusz7.Range("T1").Value.........) then ...
    Next

  • #10 29 Kwi 2014 00:38
    lukaszp2
    Poziom 6  

    JRV dzięki ale chyba coś nie tak robię...

    Kod: vb
    Zaloguj się, aby zobaczyć kod

  • #11 29 Kwi 2014 07:08
    JRV
    Specjalista - VBA, Excel

    Witaj.
    Arkusz7 - to jest Nazwa programowa lub na arkusz etykiety(w zasadzie może zbiegają się )
    Być może lepiej użyć typ notacji Sheets("Arkusz7")

    p.s.
    Jeśli widzisz w redaktorze VBA, jako Sheets7(Arkusz7)
    następnie trzeba Sheets7.Range("S1") i t.d.
    lub Sheets("Arkusz7").Range("S1") i t.d.

    lepiej jeszcze przykład załączyć

  • #12 29 Kwi 2014 10:43
    lukaszp2
    Poziom 6  

    To raczej nie to bo przedtem działało. Zmieniłem i to samo: Object required

  • #13 29 Kwi 2014 11:56
    JRV
    Specjalista - VBA, Excel

    Programową nazwę arkuszu "plan" jest arkusz7 i nie Sheets7.
    Sheets7 byłoby dobrze w wersji angielskiej.
    Ale od zidentyfikowanych "Plan" jako Set Ww = Sheets("Plan"), dlaczego nie używać ono?
    Ww.Range("S1") i t.d.

    Dodano po 6 [minuty]:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

  • #15 19 Cze 2014 10:04
    PolskaListaPrzebojow
    Poziom 2  

    Witam Panowie, podbijam temat.

    Na bloga o tematyce muzycznej tworze sobie arkusz, który za pomocą kwerend ma zbierać dane ze stron z listami przebojów. To w połączeniu z formułami mocno ułatwia sprawę, ale potrzebuję jeszcze jednej rzeczy, z którą nie mogę sobie poradzić...

    Mianowicie chodzi o to, by stworzyć makro, które z arkusza z kwerendą (w tym przypadku arkusz ESKA) kopiowało/wklejało jako wartość wyniki do arkusza podsumowującego (arkusz ESKA PODS). Przy czym musi zostać spełniony warunek daty oraz makro musi wyszukać (wyszukiwanie pionowe) ilość punktów dla danego utworu muzycznego.

    Co ma zrobić makro krok po kroku:

    1) Sprawdzić czy w arkuszu ESKA komórce K8 data jest taka sama jak w arkuszu ESKA PODS w wierszu 2 w każdej kolumnie na prawo od C włącznie.

    2) Wyszukać pionowo utwór z arkusza ESKA PODS z kolumny B w arkuszu ESKA w zakresie N8:O27 i zwrócić wartość z kolumny O.

    3) Wkleić jako wartość dane z kolumny O w arkuszu ESKA do odpowiedniej kolumny w arkuszu ESKA PODS - tutaj kolumna zależy od daty.

    4) Po zmianie daty w komórce K8 w arkuszu ESKA i po uruchomieniu makra, niech makro wklei dane do stosownej kolumny w arkuszu ESKA PODS.

    Panowie EKSPERCI liczę na WAS :)

  • #16 11 Lip 2014 00:49
    Ruda-wydra
    Poziom 5  

    Dzień dobry,
    To znów ja, niestety dopiero do tego wróciłam (inne zajęcia = czasu brak, jednak okres wakacyjny więc i czasu więcej). Kopiowanie żadną siłą mi nie chce wyjść - próbowałam to przerobić na wzór który podał JVR jednak nic mi z tego nie wyszło. Moje pytanie brzmi czy ktoś może mi podsunąć pomysł czemu ten fragment może nie działać :

    Kod: vb
    Zaloguj się, aby zobaczyć kod
    w wersji JRV też nie działa i nie bardzo rozumiem czemu. Była bym wdzięczna za małą podpowiedź albo choć nakierowanie jak tego szukać bo w temacie jak wspomniałam jestem "zielona", a nie znalazłam nigdzie by ktoś miał taki problem (cóż pewno gdzieś jest błąd ale im bardziej go szukam tym bardziej psuje "resztę")

    Wklejam całość co by było widać jak to wygląda:
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Dziękuje z góry za poświęcenie czasu.

  • #17 14 Lip 2014 18:54
    Ruda-wydra
    Poziom 5  

    Znalazłam rozwiązanie i działa tak jak powinno :). Wklejam moje rozwiązanie tak na wszelki wypadek jakby ktoś miał z tym problem (inaczej działać nie chciało)

    Kod: vb
    Zaloguj się, aby zobaczyć kod

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME