Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Excel VBA] import danych z wybranych wierszy i kolumn

Korek_123 18 Aug 2015 20:55 5985 15
  • #1
    Korek_123
    Level 11  
    Witam,

    Na wstępie - nie jestem programistą i nie umiem programować … niestety – dlatego bardzo proszę o pomoc.

    Szukam rozwiązania, które pozwoli na automatyczny import danych według wybranych dat i etykiet danych, za pomocą makra w MS Excel.

    Załączyłem przykład „import_danych_01__18082015” - sam go zrobiłem :-) - co jak dla mnie to już osiągnięcie :-D (nie jestem programistą _podkreślam_ ).

    W przykładzie jest napisane makro do importowania określonej jednej danej (Przykład A) :
    - po wybraniu wiersza (etykieta danych - z listy)
    - i daty danych (kolumna danych – też z listy)

    Makro działa dla jednej zdefiniowanej komórki z danymi – a pytanie jest takie - jak to „przenieść” na większą liczbę dat i etykiet danych – tego niestety nie wiem.

    Bardzo proszę o pomoc jak napisać makro aby możliwe było importowanie danych (Przykład B) z wskazanego zakresu wybranych dat (kolumny) i wybranych etykiet danych (wiersze).

    To jest pewnie dość proste – dla mnie niestety nie ;-(

    Bardzo uprzejmie proszę o pomoc.

    Pozdrawiam
    Korek
  • #2
    JRV
    VBA, Excel specialist
    Code: vbscript
    Log in, to see the code


    PS. Docelowa tabela - co to ma byc?
  • #3
    Korek_123
    Level 11  
    Witam,

    Docelowa tabela - tam mają się znaleźć dane wybrane na podstawie komórek i wierszy zdefiniowanych w Przykładzie B w części "Wskazanie wierszy i kolumn do importu danych".

    Potrzebuję do docelowej tabeli (zaczynającej się do C64) skopiować dane z wierszy i kolumn określonych w polach wyboru:
    - wiersze C46:C57
    - kolumny D45:L45
    - a w C64 powinna się znaleźć wartość z B6

    Pozdrawiam
    Korek
  • #5
    JRV
    VBA, Excel specialist
    zmienic CZY.PUSTA($C65) na $C65=0, CZY.PUSTA(D$64) na D$64=0 a przeciagnij
  • #6
    Korek_123
    Level 11  
    Witam,

    Dziękuję za odpowiedź.

    Ja te pliki do analizy danych mam zrobione przez wpisywanie nazw plików, kolumn i wiersz oraz funkcje (bez makr) wyszukaj.poziomo, wyszukaj.pionowo, podaj. opozycję i przesunięcie - działa to w miarę sprawnie (chociaż dość długo czasem "mieli" to Excel) - ale trzeba wcześniej popracować "ręcznie" nad danymi źródłowymi ... poprzyklejać ręcznie niektóre pozycje (baz danych wywala czasem dane w innym układzie - ma swoje "kaprysy" :-D - np. dane przesuwają się o jedną / kilka wierszy / kolumn) - na pliki z danymi nie ma wpływu - takie dostaję - i tego nie zmienię.

    Niestety plików źródłowych z danymi przybywa, wiec che zrobić jakiś mechanizm, który będzie w miarę automatycznie za pośrednictwem makra w MS Excel "ciągnął dane" (wyszukując je po datach i etykietach) ze wskazanych plików i zakładek.

    Ten przykład to tylko "wprawka" - bo jak pisałem - moje doświadczenie w pisaniu makr w MS Excel jest bardzo niewielkie. Docelowo ma być jeden plik do analizy i wiele plików źródłowych z których trzeba "wczytywać" dane i w pliku analitycznym je porównywać, wyliczać dynamiki i robić wykresy itp itd :-)

    Do tego w zamyśle:

    - w makrach ma się pojawić możliwość tworzenia wykresów w miarę dodawania / uzupełniania nowych danych - dziś ;-) nie ma pojęcie jak to zrobić ale będę szukał informacji .

    - mają się pojawić pola dialogowe (MsgBox imput) do wybierania zmiennych - też nie mam pojęcie jak to zrobić - ale będę szukał informacji .

    A to wszytko dlatego, że nie tylko ja będę używał tego rozwiązania - a jak je sprawnie "zautomatyzuje" to nie będę musiał robić tego za kilka osób (które z Excelem radzą sobie średnio - np. drukują arkusz i ręcznie przepisują dane do innej zakładki - SERIO!!! - nie żartuję !!! - autentyk - albo "wersja light" liczą na kalkulatorze na podstawie danych z arkusza - powtarzam SERIO!!)

    A poważne pytanie jest takie ;-) jak z makra Przykład A i Przykład B zrobić jedno makro albo jak z poziomu makra A wywołać makro B ;-) - nie wiem serio ! a to pewnie jakieś trywialne jest.

    Pozdrawiam
    Korek
  • Helpful post
    #7
    JRV
    VBA, Excel specialist
    Korek_123 wrote:
    baz danych wywala czasem dane w innym układzie - ma swoje "kaprysy" - np. dane przesuwają się o jedną / kilka wierszy / kolumn

    Ale przynajmniej daty i etykiety są zawsze obecne? Zwłaszcza etykiet - nie są modyfikowane przez?
  • #8
    Korek_123
    Level 11  
    Witam,

    Daty (okresy) i etykiety (nazwy wierszy) są te same - potrafią się przesunąć o jeden / dwa wierze albo jedną / dwie kolumny, albo wiersz i/albo kolumna pojawia się jako połączona z innym wierszem / komórką (poprzednią następną w pliku MS Excel) - nie wiem dlaczego tak jest.
    Próbowałem to ustalić ale to jakaś "tajemna wiedza" do której dostęp maj tylko "specjaliści" z działu IT.
    Swoją drogą czasem się zastanawiam czy owi "specjaliści IT" sami ne generują tych problemów aby "udowodnić", że są niezbędni ;-P

    Jeszcze raz prośba o pomoc - jak napisać w miarę "uniwersalne" makro (o ile się da odporne na przesunięcia danych w arkuszu źródłowym) które będzie potrafiło importować dane po zdefiniowanych okresach i etykietach danych?

    Pozdrawiam,
    Korek

    Ps. Jak widzisz stoję "trochę pod ścianą" :-(
  • #10
    User removed account
    Level 1  
  • #11
    Korek_123
    Level 11  
    Witam,

    Generalnie tak, chodzi aby stworzyć osobna tabele z wierszami i kolumnami utworzonymi z wybranych (wskazanych) danych.

    pozdrawiam,
  • #12
    Korek_123
    Level 11  
    Witam,

    Bardzo dziękuje za pomoc !!!

    Ale chyba za „cienki jestem” aby zrozumieć zastosowane funkcje i ich składnię – prośba o wyjaśnienie … jak te makra mają działać – i które kolejno:

    A. - które makro ma być wywołane jako pierwsze … i w jaki sposób ?

    B. - które makro ma być wywołane jako drugie … i w jaki sposób ?

    C. - czy te makra da się połączyć / zapisać w jednym makrze ?

    D. - jak wywołać „Private Sub” i z jakimi parametrami z poziomu „Sub” ?


    Treść makr poniżej:

    ______________

    „Dim wiersz As Range
    Dim kolumna As Range

    ______________

    Private Sub Worksheet_Change(ByVal Target As Range)

    'zdefiniuj zakresy, w których znajdują się listy
    Set wiersz = Range("D46:L46") 'w tabeli docelowej
    Set kolumna = Range("C47:C58") 'w tabeli docelowej

    If Not Intersect(Target, wiersz) Is Nothing Then
    Call Szukaj(Target.Value, 0, kolumna.Offset(0, Target.Column - kolumna.Column).Address)
    End If

    If Not Intersect(Target, kolumna) Is Nothing Then
    Call Szukaj(Target.Value, 1, wiersz.Offset(Target.Row - wiersz.Row, 0).Address)
    End If

    Set wiersz = Nothing
    Set kolumna = Nothing
    End Sub
    ______________

    Private Sub Szukaj(co As Variant, jak As Integer, zakres As String)
    Dim zakres_wierszy_zrodlowych As Range, zakres_kolumn_zrodlowych As Range
    Dim wrs As Integer, kol As Integer
    Dim kom As Range, licznik As Integer

    Set zakres_wierszy_zrodlowych = Range("B7:B27")
    Set zakres_kolumn_zrodlowych = Range("C6:W6")
    Application.EnableEvents = False

    On Error GoTo koniec 'żeby Eventy nie zostały wyłączone

    If jak = 0 Then 'pionowo
    kol = zakres_kolumn_zrodlowych.Find(what:=co, lookat:=xlWhole).Column
    For Each kom In Range(zakres)
    wrs = zakres_wierszy_zrodlowych.Find(what:=kolumna.Offset(licznik, 0), lookat:=xlWhole).Row
    kom.Value = Cells(wrs, kol) 'lub kom.offset(19,0).value
    licznik = licznik + 1
    Next
    Else 'poziomo
    wrs = zakres_wierszy_zrodlowych.Find(what:=co, lookat:=xlWhole).Row
    For Each kom In Range(zakres)
    kol = zakres_kolumn_zrodlowych.Find(what:=wiersz.Offset(0, licznik), lookat:=xlWhole).Column
    kom.Value = Cells(wrs, kol) 'lub kom.offset(19,0).value
    licznik = licznik + 1
    Next
    End If

    koniec:
    'można sobie dopisać "profesjonalną" obsługę błedów
    Application.EnableEvents = True
    Set zakres_wierszy_zrodlowych = Nothing
    Set zakres_kolumn_zrodlowych = Nothing

    End Sub”
    ______________

    Jeżeli to nie problem to wielka prośba o opisanie / wyjaśnienie co i jak - jak działają zaproponowane funkcje / mechanizmy w tych makrach – jak dla osoby która jest „analitykiem” zmuszonym przez okoliczności do stania się „Programistą” [VBA Excel]. Już wyjaśniam poza zaprezentowanym powyżej (w załączniku do mojego pierwszego „posta”) prostym przykładem makra – nie napisałem wcześniej żadnego działającego makra ;-) .
    Pozdrawiam,

    Korek
  • Helpful post
    #13
    adamas_nt
    Moderator of Programming
    To jest procedura zdarzeniowa z trzyargumentową podprocedurą (tak było mi wygodniej). Po umieszczeniu w kodzie arkusza, "sama" się uruchamia. Tzn uruchamia się przy zmianie wartości w dowolnej komórce ;)

    Ustawienia są w 4-ech miejscach:
    1. nagłówkowa kolumna tabeli źródłowej - "Set zakres_wierszy_zrodlowych"
    2. nagłówkowy wiersz tabeli źródłowej - "Set zakres_kolumn_zrodlowych"
    3. nagłówkowy wiersz tabeli docelowej - "Set wiersz"
    4. nagłówkowa kolumna w tabeli docelowej - "Set kolumna"

    Jeśli komórki docelowe są w innym miejscu (tabeli) możesz przesunąć, Np 'kom.offset(10, 0).Value = Cells(wrs, kol)" zapisze 10 wierszy niżej.

    W sumie jest to "prawie" to samo co zapodałeś (częściowo żywcem skopiowane), tylko zapętlone...
  • #14
    Korek_123
    Level 11  
    Witam,

    Genialnie napisane, znacznie powyżej mojego poziomu wiedzy :-) bardzo dziekuje za pomoc!

    Mam tylko jedna prośbę - docelowe rozwiazanie, bedzie ciągnęło dane z kilku wskazanych plików zewnętrznych i rożnych zakładek, dlatego potrzebuje "odpiąć" te procedury od automatycznego wykonywania, tak abym mógł zastosować Application.GetOpenFilename i wskazywać konkretne zakładki źródłowe i docelowe.

    A prośba taka czy możesz podpowiedzieć jak z wersji automatycznej zrobic wersje, która będę mógł podpiąć pod przycisk

    Pozdrawiam
    korek
  • #15
    User removed account
    Level 1  
  • #16
    Korek_123
    Level 11  
    Dziękuję za pomoc !