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 Makro - Jak porównać dwa arkusze makrem VBA

karzek 03 Cze 2016 08:47 1080 17
  • #1 03 Cze 2016 08:47
    karzek
    Poziom 4  

    Witam,

    Potrzebuję porównać dane z pliku X.xls z kolumny B1:B13606(dane są stałe) z plikiem Y.xls z kolumną D (do pustego miejsca- dane zmienne) i jeżeli znajdzie
    taki sam to przepisać wartość z pliku Y.xls z kolumny F do pliku X.xls w kolumnie
    E . Robiłem to z użyciem funkcji Vlookup excella ale strasznie długo mieli dane.
    Czy jest możliwe zrobienie takiego makra VBA ,które przyśpieszyło by to wyszukiwanie ?

    Byłbym wdzięczny za pomoc :-)

  • #2 03 Cze 2016 09:05
    drobok
    Poziom 24  

    Utwórz sobie z tego słownik to wyszukiwanie będzie szybsze. Ew możesz sobie posortować (o ile tego nie zrobiłeś) i szukać w przedziałach (ostatni argument vlookup) kodu nie wstawiłeś to można tylko domniemywać.

  • #3 03 Cze 2016 12:11
    kinggustav
    Poziom 18  

    Jeżeli ma być naprawdę szybko, to musisz posortować obie listy według wspólnego identyfikatora. Wtedy wystarczy pojedyncze przejrzenie obu list, a to będzie przy (zakładam) 2*15000 wierszy kilka sekund. Jeżeli nie możesz tego zrobić, to może da się utworzyć arkusz, tam skopiować co trzeba, przetworzyć, a potem przepisać według gotowej listy.

  • #4 03 Cze 2016 13:32
    cbrman
    Poziom 26  

    Wstaw plik z próbką danych, mogą być z sufitu, byleby układ był zachowany.

  • #6 03 Cze 2016 20:12
    JRV
    Specjalista - VBA, Excel

    trzeba tylko wartości dodatnie? >0

    Dodano po 13 [minuty]:

    2007 Excel za 0,5 sek
    =JEŻELI(LICZ.JEŻELI(Y.xlsx!$D:$D;B2);JEŻELI( WYSZUKAJ.PIONOWO(B2;Y.xlsx!$D:$F;3;0)>0; WYSZUKAJ.PIONOWO(B2;Y.xlsx!$D:$F;3;0);"");"0")

  • #7 03 Cze 2016 22:20
    karzek
    Poziom 4  

    JRV
    twoje rozwiązanie wywala błąd #ARGH , bycz może dlatego ,że nie znajduje danej wartości z komórki B z pliku X w pliku Y(plik Y zawiera tylko niektóre dane ze stałej tabeli z pliku X)

  • #8 03 Cze 2016 22:31
    JRV
    Specjalista - VBA, Excel

    poprawne pisanie
    w E2 =JEŻELI(LICZ.JEŻELI(Y.xlsx!$D:$D;B2)>0;JEŻELI( WYSZUKAJ.PIONOWO(B2;Y.xlsx!$D:$F;3;0)>0; WYSZUKAJ.PIONOWO(B2;Y.xlsx!$D:$F;3;0);"");"0")
    ale u mnia nie wywala błąd to co w post #6
    jak nie znajduje danej wartości to pisze zero( =JEŻELI(LICZ.JEŻELI(Y.xlsx!$D:$D;B2);........;"0")

  • #9 03 Cze 2016 22:44
    karzek
    Poziom 4  

    drobok napisał:
    Utwórz sobie z tego słownik to wyszukiwanie będzie szybsze. Ew możesz sobie posortować (o ile tego nie zrobiłeś) i szukać w przedziałach (ostatni argument vlookup) kodu nie wstawiłeś to można tylko domniemywać.


    Pomogło trochę bo liczy około 4 minut ,ale szukam jeszcze szybszego rozwiązania :-)

    Dodano po 11 [minuty]:

    JRV napisał:
    poprawne pisanie
    w E2 =JEŻELI(LICZ.JEŻELI(Y.xlsx!$D:$D;B2)>0;JEŻELI( WYSZUKAJ.PIONOWO(B2;Y.xlsx!$D:$F;3;0)>0; WYSZUKAJ.PIONOWO(B2;Y.xlsx!$D:$F;3;0);"");"0")
    ale u mnia nie wywala błąd to co w post #6
    jak nie znajduje danej wartości to pisze zero( =JEŻELI(LICZ.JEŻELI(Y.xlsx!$D:$D;B2);........;"0")


    Rzeczywiście działa i to szybciutko, ale problem polega na tym ,że pod warunkiem ,że oba pliki są uruchomione jednocześnie, a potrzebowałbym ,żeby zaciągało bezpośrednio z pliku Y dane bez konieczności jego uruchamiania .

  • #10 04 Cze 2016 07:59
    JRV
    Specjalista - VBA, Excel

    karzek napisał:
    Robiłem to z użyciem funkcji Vlookup excella ale strasznie długo mieli dane.

    W formułach użyć nie całą kolumnę(D:F), a zakres(np. $D$1:$F$1000)

  • #11 04 Cze 2016 22:15
    karzek
    Poziom 4  

    JRV napisał:
    karzek napisał:
    Robiłem to z użyciem funkcji Vlookup excella ale strasznie długo mieli dane.

    W formułach użyć nie całą kolumnę(D:F), a zakres(np. $D$1:$F$1000)


    Nic z tego, w dalszym ciągu błąd #ARG ,chyba że mam otwarte oba pliki jednocześnie to wtedy jest ok, ale nie o to mi chodzi .

    Może ktoś ma jakieś lekarstwo w postaci makra ?

  • #12 09 Cze 2016 00:17
    karzek
    Poziom 4  

    Ponownie wracam z tematem.

    JRV twoja propozycja jest dobra ale doczytałem się ,że funkcja licz.jeżeli nie działa
    na zamkniętych arkuszach(muszą być otwarte).

    Może jednak ktoś ma jakieś rozwiązanie w tym temacie z użyciem vlookup w makrze?

  • #13 09 Cze 2016 07:33
    JRV
    Specjalista - VBA, Excel

    w takich przypadkach używam 'PODAJ.POZYCJĘ' i 'INDEKS' w linii w przypadku, gdy nie ma błędu(jest dane), pracują na zamkniętych arkuszach.

    Dodano po 3 [minuty]:

    karzek napisał:
    takiego makra VBA ,które przyśpieszyło by to wyszukiwanie ?
    funkcje arkusza zawsze szybciej niż makro

  • #14 09 Cze 2016 08:49
    karzek
    Poziom 4  

    A jakby to miało być rozpisanie bazując na przykładzie z wykorzystaniem wyszukaj.pionowo ?

  • Pomocny post
    #15 09 Cze 2016 09:00
    JRV
    Specjalista - VBA, Excel

    Gdy jest numer wiersza z dane('PODAJ.POZYCJĘ'), nie trzeba 'wyszukaj.pionowo', wystarczy INDEKS

  • #16 09 Cze 2016 09:07
    karzek
    Poziom 4  

    ok, spróbuję podziałać z tym, dam znać jak wyjdzie.

    A co myślisz o tym kodzie :
    Sub szukaj()
    Dim sk, IactA, IactB, IactC, IIactA, IIactB, IIactC
    Worksheets("x").Select
    Range("b2").Select
    sk = ActiveCell.Text
    IactA = ActiveCell.Text

    Do While IactA <> ""
    sk = ActiveCell.Text
    If IactA = sk Then
    IactB = ActiveCell.Offset(0, 1).Value
    IactC = ActiveCell.Offset(0, 3).Value
    Worksheets("y").Select
    Range("d1").Select
    IIactA = ActiveCell.Text
    Do While IIactA <> ""
    If IIactA = IactA Then
    If ActiveCell.Offset(0, 1).Value = Empty Then
    IactC = ActiveCell.Offset(0, 3).Value
    Worksheets("x").Select
    ActiveCell.Offset(0, 3) = IactC
    IIactA = ""
    Worksheets("x").Select
    ActiveCell.Offset(1, 0).Select
    IactA = ActiveCell.Text
    Exit Do
    Else
    IactC = ActiveCell.Offset(0, 3).Value
    Worksheets("x").Select
    ActiveCell.Offset(0, 3) = IactC
    IIactA = ""
    Worksheets("x").Select
    ActiveCell.Offset(1, 0).Select
    IactA = ActiveCell.Text
    Exit Do
    End If
    Else
    ActiveCell.Offset(1, 0).Select
    IIactA = ActiveCell.Text
    End If
    Loop
    Else
    Worksheets("x").Select
    ActiveCell.Offset(1, 0).Select
    IactA = ActiveCell.Text
    End If
    Loop
    End Sub

    Kod znalazłem na innym forum (autorstwa KiOP) i przerobiłem trochę na swoje potrzeby ,ale przy tak dużej tabeli trochę się krzaczy .

  • #17 09 Cze 2016 09:22
    JRV
    Specjalista - VBA, Excel

    karzek napisał:
    A co myślisz o tym kodzie
    Nic, co ma dzialac?

  • #18 09 Cze 2016 10:20
    karzek
    Poziom 4  

    JRV napisał:
    Gdy jest numer wiersza z dane('PODAJ.POZYCJĘ'), nie trzeba 'wyszukaj.pionowo', wystarczy INDEKS


    JRV dzięki za wielką pomoc ,
    użycie funkcji indeks i pozycja działa rewelacyjnie.
    zastosowałem poniższą formułę :

    =JEŻELI.BŁĄD(INDEKS('[Y.xlsx]Sheet1'!$A$1:$G$13609;PODAJ.POZYCJĘ(B2;'[Y.xlsx]Sheet1'!$D$1:$D$13609;0);7);"0")

    Dane kopiują się jak należy :-)

    Pozdrawiam

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