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

VB Excel 2013 - Jak zwiększyć liczbę iteracji przy porównywaniu dużych kolumn?

wkrzak1 27 Gru 2014 21:21 1413 22
REKLAMA
  • #1 14261791
    wkrzak1
    Poziom 9  
    Posty: 10
    Mam do porównania dwie kolumny:
    pierwsza ma ponad 200.000 wierszy
    druga ma ponad 66.000 wierszy
    Napisałem w VB proste dwie pętle i jeden warunek wstawiający znaczniki w wierszach, gdzie obie pozycje są sobie równe.
    Porównywanie działa tylko do pozycji 48 pierwszej pozycji. Czyli niespełna 3 miliony operacji.
    Pytanie, gdzie można zwiększyć ilość iteracji do wykonania lub zmienić format liczby w Excelu (w formacie zmieniłem na z dwoma miejscami po przecinku), aby traktował liczbę jako double.
    Według mnie są to jedyne z przyczyny blokujące.
    Porównuję numery PESEL jako liczby czyli bez zer na początku. Wersja MS Office 2013.
    Będę bardzo wdzięczny za każdą wskazówkę.
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 14262762
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    wkrzak1 napisał:
    Według mnie są to jedyne z przyczyny blokujące.
    Według mnie, nie. Wrzuć kod (zapomniałeś, zdaje się, wkleić).
  • Pomocny post
    #3 14262798
    PRL
    Poziom 41  
    Posty: 6941
    Pomógł: 953
    Ocena: 905
    Wyszukujemy, czy w kolumnie A znajdują się wartości zawarte w kolumnie B i w kolumnie C zapisujemy je:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    O to chodzi?
    Pomogłem? Kup mi kawę.
  • #4 14263089
    wkrzak1
    Poziom 9  
    Posty: 10
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodano po 6 [minuty]:

    Wiem, że w Excelu jest funkcja porównująca wartości dwóch odrębnych kolumn. Zapomniałem jednak, jak się nazywa i pamiętam, że miałem z nią kiedyś duże kłopoty z prawidłowym jej uruchomieniem.
  • #5 14263211
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    Witaj
    Trochę niejasne, jakie do porównania dwie kolumny? L i Q ?
    Co jest w kolumnie D ?

    Dodano po 2 [minuty]:

    Dołączanie pliku prykladowego jest pożądane
  • REKLAMA
  • #6 14263267
    wkrzak1
    Poziom 9  
    Posty: 10
    W kolumnach A i D mam dane z drugiego (krótszego) zbioru. W kolumnach L i Q z pierwszego. Kolumny A i L służą do przeszukiwania, są ponumerowane od 1 i kończą się -1. Zrobiłem tak ze względu na dodatkowe debugowanie. W kolumnach D i Q są numery PESEL pacjentów (66 656 i 204 107 pozycji). Numery PESEL zapisane są jako liczby, czyli bez zer na początku.

    Dodano po 1 [minuty]:

    Pliku nie mogę dołączyć ze względu na wrażliwość danych. Zaraz dołączę przykład z danymi nieprawdziwymi.

    Dodano po 6 [minuty]:

    Sorry. Jednak nie załączę pliku teraz bo utraciłem zdalny dostęp do swojego komputera w pracy.

    Dodano po 5 [minuty]:

    plik zbioru B PESEL B plik zbioru A PESEL A
    1 123456789 1 113456789
    2 1123456789 2 1223456789
    3 11123456789 3 1224567891
    4 23456789123 4 1225678912
    5 34567891234 5 23456789123
    -1 6 34567891234
    -1

    Dodano po 38 [sekundy]:

    coś mi nie wyszło :-(

    Dodano po 2 [minuty]:

    w załączeniu prosty schemat mojego pliku
    Załączniki:
    • porownanie.xls (17.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #7 14263376
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    wkrzak1 napisał:
    Kolumny A i L służą do przeszukiwania, są ponumerowane

    wkrzak1 napisał:
    Range("L2").Offset(i - 1, 0).Value = licznik
    Range("A2").Offset(j - 1, 0).Value = licznik

    będzie błędne numerowanie
    wkrzak1 napisał:
    jeden warunek wstawiający znaczniki w wierszach

    może w inne kolumny?

    Dodano po 17 [minuty]:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [minuty]:

    i nie trzeba " -1"
  • #8 14263822
    wkrzak1
    Poziom 9  
    Posty: 10
    Dziękuję bardzo za pomoc. Zapuściłem teraz. Jutro zobaczę wynik. Posłuży mi on do zaimportowania danych do tabeli Oracle bez dubli. Jeszcze raz dziękuję i pozdrawiam
  • REKLAMA
  • #9 14263861
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    wkrzak1 napisał:
    Jutro zobaczę wynik

    Metoda zaproponowana przez PRL będzie działać szybciej.
    tylko trzeba trochę przerobić

    Dodano po 2 [minuty]:

    wkrzak1 napisał:
    zaimportowania danych do tabeli Oracle bez dubli

    Excel 2007 wie jak wyeliminować podwaja, nadzieję, że 2013 oraz
  • #10 14263949
    PRL
    Poziom 41  
    Posty: 6941
    Pomógł: 953
    Ocena: 905
    Cytat:
    Posłuży mi on do zaimportowania danych do tabeli Oracle bez dubli


    To nie lepiej SELECT DISTINCT zrobić?
    Pomogłem? Kup mi kawę.
  • #11 14263980
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    SELECT DISTINCT to Z tabeli, nie Do tabeli
    choć być może kiedy importowanie taka opcja jest
  • #12 14263988
    wkrzak1
    Poziom 9  
    Posty: 10
    Select distinct był wywołany podczas wyciągnięcia danych z drugiego systemu. Fatalna jakość tych danych sprawia, że obróbka możliwa jest w excelu. Mam zaimportować podstawowe dane pacjenta z tego co jest. W zasadzie nadaje się tylko imię, nazwisko, data urodzenia, płeć, kod terytorialny (b.Ważne dla NFZ) i PESEL. Cały adres wpisany jest w jedną komórkę. Ale zawsze to coś. Panie nie będą musiały ich wpisywać tylko poprawiać. Politycznie jest to bardziej poprawne od wprowadzania danych od nowa :-)
  • #13 14264026
    PRL
    Poziom 41  
    Posty: 6941
    Pomógł: 953
    Ocena: 905
    JRV,

    chodzi mi o to, żeby pozbyć się dublujących numerów PESEL, bo o tym Autor napisał.
    A więc najpierw 'distinct', a potem 'insert'.

    wkrzak,

    a możesz podać jaka 'kiszka' wyszła z tego

    Cytat:
    Select distinct był wywołany podczas wyciągnięcia danych z drugiego systemu. Fatalna jakość tych danych sprawia, że obróbka możliwa jest w excelu.
    ?
    Pomogłem? Kup mi kawę.
  • #14 14264085
    wkrzak1
    Poziom 9  
    Posty: 10
    Kiszka polega na tym, że w drugim systemie jest inna struktura danych oraz brak szeregu pól wymaganych w "moim" systemie. W tej sytuacji insert jest bardziej pracochłonny. Chcę stworzyć tabelę w excelu tożsamą z tabelą w "moim" systemie. Oracle pozwala na zaczytanie całej tabeli. Muszą ją tylko odpowiednio przygotować. Są pacjenci pojawiający się tu i tu i stąd ta cała moja akcja aby wyeliminować zaczytanie dubli. Gwoli ciekawości jak chcesz, to mogę podesłać nagłówki obu tabel?
  • #15 14264158
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    Można wprowadzać inne podejście.
    w tymczasowej Oracle (wspierające) import tabela ze wszystkimi danymi.
    UPDATE <tabela> SET <pole> WITH SELECT DISTINCT tempTab.pole1 FROM tempTab WHERE tabela.pesel = tempTab.pesel
    Coś podobnego może i do dodawania nowych danych.
    W każdym razie orakl sobie znacznie szybciej
  • #16 14264210
    PRL
    Poziom 41  
    Posty: 6941
    Pomógł: 953
    Ocena: 905
    To ja pójdę po najmniejszej linii oporu.

    Dane z 'innego systemu' zaimportuj do Akcesa.
    Tam dosłownie wyklikaj, co potrzebujesz i zapisz do tabeli Oracle podłączonej przez ODBC.

    Chyba prościej się nie da.
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #17 14264225
    wkrzak1
    Poziom 9  
    Posty: 10
    Też tak można. W sumie można by się zastanowić, co lepsze. Ale kiedy indziej. Wielokrotnie tak robiłem i zawsze było OK. Teraz po 48 pierwszej pętli stawało i nie wiem dlaczego. Kiedyś robiłem to na starym oprogramowaniu. Stąd moje przypuszczenie, że może w nowym oprogramowaniu są zaszyte gdzieś parametry o których pisałem wcześniej. W sumie, nie znalazłem błędu w mojej procedurze ?!?

    Dodano po 2 [minuty]:

    Acsessa znam słabo i więcej zajęło by mi konfigurowanie nagłówków. Pewnie nie mam racji, ale wolę robić metodami, może dłuższy,i, ale przeze mnie sprawdzonymi. Nigdy nie łączyłem się do bazy produkcyjnej przez ODBC i może niech tak zostanie. Import tabeli do Oracle odbywa się bezproblemowo.
  • #18 14264282
    PRL
    Poziom 41  
    Posty: 6941
    Pomógł: 953
    Ocena: 905
    Cytat:
    Też tak można. W sumie można by się zastanowić, co lepsze


    Cytat:
    Acsessa znam słabo i więcej zajęło by mi konfigurowanie nagłówków


    A szkoda. To między innymi wspaniałe narzędzie do przetwarzania danych, za pomocą klikania.;)

    Konfigurowanie, jak to nazywasz 'nagłówków', to nic innego jak (dla przykładu):

    VB Excel 2013 - Jak zwiększyć liczbę iteracji przy porównywaniu dużych kolumn?
    Pomogłem? Kup mi kawę.
  • #19 14264312
    wkrzak1
    Poziom 9  
    Posty: 10
    Pewnie tak. Ale do tego musiałbym mieć legalnego Acessa :-)
  • #20 14264907
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    Hmm, zastanawiam się nad celem tego działania. Jeśli trzeba z obu kolumn wyciągnąć wszystkie unikatowe PESEL'e + dane "towarzyszące", to nie prościej "przelecieć" kolejno obie kolumny z wpisaniem do kolekcji i sprawdzeniem błędu? Jeśli err=0 zapisujemy do tabelki wynikowej (unikat), w przeciwnym wypadku nie.

    Czy koniecznie potrzebny jest wynik porównania "każdy-z każdym"? Tzn informacja które wiersze jednej kolumny duplikują się z wierszami drugiej kolumny?
  • #21 14265255
    wkrzak1
    Poziom 9  
    Posty: 10
    No każdego elementu z każdym nie ma, bowiem warunek jest zatrzymany w momencie większego bądź równego. A czy taka kolekcja nie będzie za duża. Nie można założyć na niej żadnych indeksów trigerów etc. Według mojej wiedzy zrobiłby się trochę zaprzesadny worek, po którym trudno się poruszać na skróty.

    Dodano po 2 [minuty]:

    A tak na prawdę, jest taka funkcja w excelu, tylko jej nie pamiętam a czasu nie mam. Jutro, albo pojutrze ją przedstawię. Na razie muszę skonsumować problem do końca - dzisiaj niestety!
  • #22 14266326
    Konto nie istnieje
    Konto nie istnieje  
  • #23 14267042
    wkrzak1
    Poziom 9  
    Posty: 10
    A tak nawiasem mówiąc, makro się wywaliło.
    Kolega zrobił tak: stworzył tabelę przestawną, gdzie wychwycił duble. Następnie, przekopiował ją obok danych i użył funkcji =WYSZUKAJ.PIONOWO(D1;FT:FU;2;FAŁSZ) gdzie D1 dane 1 zbioru, FT dane 2 zbioru, FU jedynka. Po przeciągnięciu po całym zakresie otrzymałem dokładnie to co chciałem.
    W każdym bądź razie, jeszcze raz bardzo dziękuję i pozdrawiam

Podsumowanie tematu

✨ Użytkownik ma problem z porównywaniem dwóch dużych kolumn w Excelu 2013, gdzie jedna kolumna zawiera ponad 200.000 wierszy, a druga 66.000. Napisał kod w VBA, który działa tylko do 48. pozycji, co sugeruje ograniczenie iteracji. W odpowiedziach zaproponowano różne podejścia do optymalizacji kodu, w tym użycie funkcji CountIf oraz pętli do porównania wartości. Użytkownik rozważał również użycie Accessa do przetwarzania danych oraz eliminacji duplikatów PESEL. Ostatecznie, po kilku próbach, udało mu się uzyskać pożądany wynik za pomocą tabeli przestawnej i funkcji WYSZUKAJ.PIONOWO.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA