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 - kopiowanie wartości dla stałych identyfikatorów

newbie92 08 Cze 2016 19:35 870 8
  • #1 08 Cze 2016 19:35
    newbie92
    Poziom 3  

    Witam, mam do wykonania pewne zadanie, jednak nie bardzo wiem jak się do niego zabrać. Mam pewien skoroszyt który zawiera przykładowo 5 arkuszy (może ich być więcej)

    pierwszy arkusz jest to stan magazynowy, znajdują się w nim nast. dane:

    identyfikator | nazwa | cena netto | cena brutto | ilosc w magazynie
    1234 | zupka chinska | 1.10zł | 1.20zł | 5

    kolejne arkusze ( z wyjątkiem ostatniego ) to jakieś dane od dostawców:

    identyfikator | nazwa | cena netto | cena brutto | ilosc w magazynie
    1234 | zupka chinska | 1.05zł | 11.20zł | 5
    1244 | przedmiot 1 | 2.10zł | 12.20zł | 5
    1254 | przedmiot 2 | 3.10zł | 11.20zł | 5
    1264 | przedmiot 3 | 41.10zł | 51.20zł | 5

    zaś w ostatnim chciałbym aby po kliknięciu przycisku wykonało się marko które pobierze Identyfikator oraz powiedzmy cenę netto z pierwszego arkusza, a następnie ceny netto dla danych identyfikatorów z arkuszy pozostałych

    czyli efekt miałby być mniej więcej taki:

    Identyfikator | nazwa | bieżąca cena | dostawca 1 | dostawca 2 | dostawca 3
    1234 | zupka chinska | 1.10 | 1.05 | 1.20 | 1.15

    jak powinienem zdefiniować pętle i warunek aby to zadziałało prawidłowo ?

    narazie jedyne czym dysponuje to fragment kodu który pobiera nazwy arkuszy (które są nazwą dostawców) i wkleja je w 1 wierszu :)

    0 8
  • #2 08 Cze 2016 21:29
    marcinj12
    Poziom 40  

    Ten sam efekt możesz osiągnąć na podstawowych funkcjach:
    - przeniesienie identyfikatora czy nazwy z pierwszego arkusza: funkcja =Arkusz1!A1 etc., ew. =JEŻELI(Arkusz1!A1<>"";A1;"") w celu wycięcia zer przy pustych polach.
    - dociągnięcie cen z pozostałych arkuszy: funkcja =WYSZUKAJ.PIONOWO(A1;Arkusz2!A:B;2;0), ew. wsparta funkcją JEŻELI.BŁĄD żeby wyciąć #N/D

    Skoro masz problem z VBA, to chyba tak będzie prościej.

    0
  • #3 08 Cze 2016 21:34
    newbie92
    Poziom 3  

    sęk w tym że to musi być VBA :) taki jest wymóg zadania o tym że jest to możliwe do wykonania za pośrednictwem podstawowych funkcji to wiem i gdybym miał taką możliwość to bym tak zrobił zamiast pisać tutaj :D

    0
  • #4 09 Cze 2016 11:30
    newbie92
    Poziom 3  

    przepisanie danych z arkusza pierwszego do wynikowego sobie zrobiłem, przy dużej ilości danych trochę "mieli" ale działa :D

    tak to wygląda:

    ' Przepisanie danych z 1 arkusza
    For ID= 10 To Rows.Count - 3
    Identyfikator = Worksheets("Magazyn").Cells(ID + 1, 2)
    CenaZakupu = Worksheets("Magazyn").Cells(ID + 1, 4)
    Worksheets("Wynik").Cells(ID - 7, 1) = Identyfikator
    Worksheets("Wynik").Cells(ID - 7, 2) = CenaZakupu
    Next

    teraz tylko jak powinna wyglądać pętla z warunkiem która pobierze mi cenę z pozostałych arkuszy dla danego identyfikatora

    0
  • #5 09 Cze 2016 13:31
    kinggustav
    Poziom 20  

    Możesz wpisać makrem VBA w kolumny 3, 4 ... formułę jak napisał marcinj12. Będzie i formuła i VBA.
    Jak chcesz w pętli to zrób sobie funkcję, która wyszuka i zwróci co znajdzie, albo 0,00. W funkcji musisz wyszukać numer wiersza w kolejnym arkuszu gdzie jest szukany identyfikator i pobrać cenę. Do wyszukiwania spróbuj najpierw użyć funkcję Excela (odpowiednik ^F), może wystarczy, jeżeli nie masz za dużo danych. Coś takiego:
    Set rr = R.Find(S, LookIn:=xlValues, SearchDirection:=xlNext)

    0
  • #6 12 Cze 2016 20:06
    newbie92
    Poziom 3  

    mógłby ktoś sprawdzić poprawność pętli i warunku lub ewentualnie poprawić błędy? :)

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod


    działanie tymczasowe miało być takie, że narazie w sprawdzanym wierszu ma w określonej kolumnie wstawić wartość 1 jeżeli w arkuszu dostawcy znalazł cenę 0 jeżeli jej nie znalazł.

    0
  • #8 15 Cze 2016 14:01
    newbie92
    Poziom 3  

    w jaki sposób mogę zmienić ten oto fragment kodu:

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod


    tak żeby zamiast od C1 do L1 wykonywał się od C1 do ostatniej pełnej komórki/kolumny

    o ile mniej więcej wiem jak zrobić to dla wierszy tak za chiny ludowe nie mogę wymyślić jak zrobić to w odniesieniu do kolumn :)

    0
  • #9 15 Cze 2016 14:13
    marcinj12
    Poziom 40  

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    0