logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

VBA Makro - Porównanie i kopiowanie danych między plikami X.xls i Y.xls

karzek 03 Cze 2016 08:47 1728 17
REKLAMA
  • #1 15717503
    karzek
    Poziom 9  
    Posty: 9
    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 :-)
  • REKLAMA
  • #2 15717532
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 15717855
    kinggustav
    Poziom 27  
    Posty: 797
    Pomógł: 93
    Ocena: 93
    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 15718021
    cbrman
    Poziom 27  
    Posty: 441
    Pomógł: 177
    Ocena: 61
    Wstaw plik z próbką danych, mogą być z sufitu, byleby układ był zachowany.
  • REKLAMA
  • #5 15718772
    karzek
    Poziom 9  
    Posty: 9
    Witam,
    załączyłem pliki z próbką mojej formuły, ale tak jak pisałem strasznie długo mieli,
    jakby udało się coś szybszego napisać w VBA to byłoby super, ja niestety jestem
    laikiem w makrach :-(
    Załączniki:
    • X.xlsx (661.98 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • Y.xlsx (11.2 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #6 15718858
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    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 15719212
    karzek
    Poziom 9  
    Posty: 9
    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)
  • REKLAMA
  • #8 15719247
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    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")
    Załączniki:
    • Y.xlsx (10.76 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • X1.xlsx (646.38 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #9 15719252
    karzek
    Poziom 9  
    Posty: 9
    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 15719597
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    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 15721000
    karzek
    Poziom 9  
    Posty: 9
    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 15729867
    karzek
    Poziom 9  
    Posty: 9
    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 15730010
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    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 15730108
    karzek
    Poziom 9  
    Posty: 9
    A jakby to miało być rozpisanie bazując na przykładzie z wykorzystaniem wyszukaj.pionowo ?
  • Pomocny post
    #15 15730128
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    Gdy jest numer wiersza z dane('PODAJ.POZYCJĘ'), nie trzeba 'wyszukaj.pionowo', wystarczy INDEKS
  • #16 15730138
    karzek
    Poziom 9  
    Posty: 9
    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 15730157
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    karzek napisał:
    A co myślisz o tym kodzie
    Nic, co ma dzialac?
  • #18 15730272
    karzek
    Poziom 9  
    Posty: 9
    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

Podsumowanie tematu

✨ Użytkownik poszukiwał sposobu na szybkie porównanie danych między plikami X.xls i Y.xls, gdzie dane z kolumny B pliku X miały być porównane z danymi w kolumnie D pliku Y. W odpowiedziach zasugerowano różne metody przyspieszenia procesu, w tym sortowanie danych oraz użycie funkcji VBA. Użytkownik próbował zastosować funkcje Excela, takie jak VLOOKUP, ale napotkał problemy z wydajnością, zwłaszcza przy zamkniętych plikach. Ostatecznie, po wielu próbach, udało się znaleźć rozwiązanie z użyciem funkcji INDEKS i PODAJ.POZYCJĘ, które działało efektywnie, nawet gdy plik Y był zamknięty.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA