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

VBA Excel - Kopiowanie danych między skoroszytami

jezy 24 Paź 2013 12:28 6780 10
  • #1 24 Paź 2013 12:28
    jezy
    Poziom 9  

    Witam

    Poszukuje wsparcia w utworzeniu odpowiedniego makra.

    Posiadam dwa skoroszyty. W pierwszym "A" znajduje się arkusz z tabelą w którą chcę z automatu wprowadzać dane.

    Jedna cześć danych będzie narzucona i automatycznie wpisywana przez narzucony schemat w makro

    Druga cześć danych będzie kopiowana z tego samego skoroszytu " A" , tylko z innych komórek

    Trzecia cześć danych pobierana jest ze skoroszytu "B" z obecnie aktywnego wiersza, kolumny G i H.

    Przykładowo wpisujemy dane w skoroszycie B wiersz 3, czyli w momencie uzycia makra w skoroszycie "A" kopiujemy dane ze skoroszytu "B" z komórek 3G i 3H do skoroszytu "A"

    Przygotowałem makro w którym udało mi się rozwiązać wstawianie danych z pierwszej i drugiej części z trzecią mam problem

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    1 10
  • #2 24 Paź 2013 14:09
    mickpr
    Poziom 39  

    jezy napisał:
    Trzecia cześć danych pobierana jest ze skoroszytu "B" z obecnie aktywnego wiersza, kolumny G i H.
    Co to znaczy "obecnie aktywnego" wiersza?
    Chcesz kopiować dane do jakiegoś akursza, gdy będzie on "w tle", bo bieżącym ma być skoroszyt "B"? Przynajmniej tak napisałeś

    Czemu stosujesz jakieś makra, nie dało się tego zrobić z użyciem OLE?

    0
  • #3 24 Paź 2013 15:04
    jezy
    Poziom 9  

    Obecnie aktywnego - mam na myśli wiersz w skoroszycie "b" w którym obecnie wprowadzane są dane.

    Zdaje mi się że przez makro jest to łatwiej zrobić

    1
  • #4 26 Paź 2013 19:45
    jezy
    Poziom 9  

    Udało mi się nieznacznie poprawić kod.

    Wszystkie potrzebne dane po użyciu makra uzupełniają się w danym wierszu formularza ale dzieje się to w sposób niekontrolowany. Oznacza to że raz pobiera dane w sposób pożądany a raz nie pobiera wcale lub kopiuje dane w zupełnie inne miejsce.

    Może wynikać to ze złego zdefiniowania programu.

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Fajnie było by jak by makro sprawdzało czy skoroszyt B jest otwarty, jeżeli tak nie otwierał go ponownie , jeżeli był by zamknięty otworzył go.

    Kopiowanie z aktywnego wiersza ze skoroszytu B można było by również zastąpić innym rozwiązaniem, np: ostatni zapisany wiersz w skoroszycie B

    Może ktoś coś podpowie ?

    0
  • #5 26 Paź 2013 21:11
    marcinj12
    Poziom 40  

    Kombinujesz jak koń pod górkę z tymi zakresami- skaczesz po arkuszach bez ładu i składu, to i nic dziwnego, że się to w którymś momencie rozjeżdża...

    Zrób raz, a porządnie, deklarację arkusza skąd i dokąd kopiujesz - a potem konsekwentnie się ich trzymaj przy kopiowaniu. Zakres Range i .Range to nie jest to samo - musisz uważać, co robisz. Odczytaj zmienną z ActiveCell raz, jak jesteś pewien, że jest dobry arkusz otwarty, a potem już jej nie sprawdzaj ponownie.

    Zrób coś w stylu:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #7 27 Paź 2013 10:08
    adamas_nt
    Moderator Programowanie

    Deklarujesz zmienną jako skoroszyt, przypisujesz arkusz. Nie może działać...

    0
  • #8 27 Paź 2013 10:35
    jezy
    Poziom 9  

    a jak powinno to wygladać ? próbowałem na parę sposobów ale bez większych rezultatów.
    Moja wiedza z programowania VBA jest bardzo słaba.

    Chciał bym tylko skopiować dane ze skoroszytu B z aktywnego wiersza kolumny G do skoroszytu A. Ewentualnie program mógł by sprawdzić czy akrusz B jest otwarty, jeżeli jest nie otwierać go ponownie a jeżeli jest zamknięty otworzyć go.

    0
  • Pomocny post
    #9 27 Paź 2013 10:54
    adamas_nt
    Moderator Programowanie

    Zadeklarowałeś nieprawidłowy typ. Jest: 'As Workbook' powinno być: 'As Worksheet'... Nie próbowałem Twojego makra w działaniu, ale niczego więcej, co mogłoby powodować błąd, nie widać.

    0
  • Pomocny post
    #10 27 Paź 2013 11:45
    marcinj12
    Poziom 40  

    Przyczyną błędu jest tylko to, co napisał adams_nt: powinna być deklaracja typu jak poniżej:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Parę uwag:
    - zamiast:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    lepiej dać:
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    dostaniesz przynajmniej jakieś szczegóły co do przyczyny błędu.

    - żeby uniknąć "mrugania" przy kopiowaniu, na początku makra możesz dać:
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    , a na końcu:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    - pewnie będziesz chciał kopiować zaznaczoną komórkę do kolejnego, pustego wiersz: możesz to zrobić w ten sposób:
    'kopiuj co potrzebujesz
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    albo, z wykorzystaniem With (uwaga na kropki!):
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    jezy napisał:
    Ewentualnie program mógł by sprawdzić czy akrusz B jest otwarty, jeżeli jest nie otwierać go ponownie a jeżeli jest zamknięty otworzyć go.

    Założyłeś, że Twoje makro będzie kopiować z pliku B.xls aktualnie zaznaczony wiersz- ono nie otwiera pliku [ponownie]. Co więcej, nie ma sensu go odpalać, jeżeli wcześniej nie zaznaczysz w nim wiersza - więc... ?
    Możesz co najwyżej sprawdzić, czy plik jest otwarty: na samym początku, po odpowiednich deklaracjach typów, wstaw sobie:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #11 27 Paź 2013 12:50
    jezy
    Poziom 9  

    Dziękuje za pomoc. Wasze wskazówki bardzo mi pomogły.

    Makro działa już bez zarzutów.

    0
  Szukaj w 5mln produktów