Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla 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

24 Paź 2013 12:28 7665 10
  • 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
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • 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?
  • 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ć
  • 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 ?
  • 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
  • Moderator Programowanie
    Deklarujesz zmienną jako skoroszyt, przypisujesz arkusz. Nie może działać...
  • 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.
  • Pomocny post
    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ć.
  • Pomocny post
    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
  • Poziom 9  
    Dziękuje za pomoc. Wasze wskazówki bardzo mi pomogły.

    Makro działa już bez zarzutów.