Usuń zduplikowane wpisy, zachowując tylko najnowsze


5

Mam kilka arkuszy kalkulacyjnych z informacjami, które muszę skonsolidować, każdy z inną (a czasem nakładającą się) częścią końcowego zestawu danych, którą mam nadzieję stworzyć. Zazwyczaj łączenie arkuszy kalkulacyjnych z podobnymi danymi jest łatwe do zrobienia poprzez zrzucenie wszystkich danych do jednego arkusza i użycie Usuń duplikaty. Chcę jednak upewnić się, że pozostawione elementy zamówienia reprezentują najnowszą wersję duplikatów.

Będę importować następujące dane z każdego arkusza kalkulacyjnego:

  • Unikalne pole identyfikatora (UID), które identyfikuje przedmiot elementu zamówienia i będzie używane do wykrywania duplikatów między arkuszami wejściowymi.
  • Pole statusu (STATUS), które będzie zawierało informacje o elemencie wywoływanym w polu unikalnego identyfikatora.
  • Pole daty (DATA), które będzie zawierało datę pierwotnego zapisania importowanych danych.

Potrzebuję, aby mój wynik zawierał tylko jeden element zamówienia dla każdego identyfikatora UID i zawierał dane z pola STATUS, które odpowiada najnowszej DATY dla tego identyfikatora UID z arkuszy wejściowych.

Jak najłatwiej to zrobić w programie Excel?


Czy VBA jest prawidłową opcją?
nixda

@nixda Nie jest to preferowane, ale nie byłbym również zainteresowany. Podstawowym kryterium jest to, że powinien on być natywnie obsługiwany w czystej wersji systemu Windows 7 + Excel 2010, a wyniki powinny być w 100% wiarygodne (lub tak blisko 100%, jak to możliwe). Jedynym powodem, dla którego wolałbym nie robić VBA, jest to, że tak naprawdę nie rozumiem go wystarczająco, aby napisać go osobiście (a zatem też nie jest wystarczający, aby naprawdę zrozumieć, co skrypt ma zrobić). Więc jeśli to jest twoje rozwiązanie, upewnij się, że skrypt jest dokładnie opatrzony adnotacjami dla niezainicjowanych.
Iszi

Mam pomysł, jak byłoby to możliwe przy minimalnym f VBA. Czy mogę prosić o przykładowy skoroszyt programu Excel?
nixda

W tej chwili nie mogę go przerobić, ale powyższy post prawie opisuje najważniejsze rzeczy. Identyfikator UID będzie miał mniej więcej podobny format ###.###.###.###-#####, STATUS będzie wprowadzać dowolny tekst, a DATA zostanie sformatowana jako YYYY/MM/DD.
Iszi

Czy nie możesz po prostu posortować wszystkich według daty, a następnie usunąć duplikaty?
Voitcus,

Odpowiedzi:


5

Nie wiem, czy jest to gwarantowane, ale wydaje mi się, że to działa (w bardzo małych testach w programie Excel 2007): weź połączony arkusz danych i posortuj go w odwrotnej kolejności według DATE, więc najnowsze wiersze są powyżej starszych. Następnie usuń duplikaty .

Ta witryna potwierdza to zachowanie: „Gdy program Excel skanuje tabelę, usuwa każdy kolejny rekord, który ma ten sam identyfikator produktu co poprzedni rekord, nawet jeśli reszta danych jest inna”.


2
Pozwoliłem sobie dodać referencję. Potwierdziłem to również własnym testem na małą skalę w programie Excel 2010.
Dane

3

Oto kilkustopniowe rozwiązanie, zakładając, że możesz wykonać niektóre z nich ręcznie i nie potrzebujesz jednego całkowicie zautomatyzowanego rozwiązania: (a jeśli tak, to jestem pewien, że możesz wziąć to stąd ...)

  1. Excel nie jest bazą danych.
  2. Zrzuć wszystkie dane w jednym arkuszu. (Dla przykładu zakładam, że masz UID w kolumnie A, DATE w kolumnie B i STATUS w C).
  3. W drugim arkuszu wykonaj polecenie Usuń duplikaty tylko w kolumnie UID . (np. skopiuj tylko filtrowane unikaty lub skopiuj całą kolumnę, a następnie wykonaj standardowe usuwanie duplikatów).
  4. W kolumnie DATA dodaj następującą formułę Array *:

    {= MAX (JEŻELI (Arkusz danych! A: A = A1, Arkusz danych! B: B))}

    Zasadniczo wybiera najnowszą datę dla każdego identyfikatora UID. (Dotyczy to oczywiście pierwszego rzędu, pamiętaj o wypełnieniu wszystkich pozostałych wierszy A1, A2, ...)

  5. W kolumnie STATUS dodaj następującą formułę macierzy:

    {= INDEKS (JEŻELI (DataSheet! A: A = A1, IF (DataSheet! B: B = B1, DataSheet! C: C)), MATCH (TRUE, IF (DataSheet! A: A = A1, IF (DataSheet! B: B = B1, PRAWDA)), 0))}

(Ponownie zwróć uwagę na pierwszy wiersz, wypełnij resztę).

Ten jest bardziej złożony, podzielmy go:

JEŻELI (Arkusz danych! A: A = A1, JEŻELI (Arkusz danych! B: B = B1, Arkusz danych! C: C))

Ta formuła tablicowa po prostu wykonuje odpowiednik klauzuli SQL WHERE z dwoma warunkami: dla wszystkich wierszy, które pasują zarówno do UID (kolumna A), jak i DATE (kolumna B), zwróć wartość wiersza w kolumnie C (STATUS).

MECZ (PRAWDA, JEŻELI (Arkusz danych! A: A = A1, JEŻELI (Arkusz danych! B: B = B1, PRAWDA)), 0)

Pierwsza formuła powinna być wystarczająco dobra, ale ponieważ nie mamy sposobu na wyciągnięcie tylko wartości innej niż NULL (lub innej niż FAŁSZ), a Excel nie ma formuły WSPÓŁPRACA, musimy skorzystać z odrobiny pośrednictwo.
Formuła MATCH przeszukuje tablicę zwróconą przez JEŻELI (te same warunki, co powyżej, ale po prostu zwraca PRAWDA, jeśli jest zgodna), w celu znalezienia pierwszej wartości PRAWDA. 3 parametr, 0, wymaga dokładnego dopasowania.
Ta formuła po prostu zwraca indeks pierwszego i jedynego wiersza, który jest zgodny z poprzednimi warunkami (dopasowanie UID i DATE (która była maksymalną datą, która pasuje do UID)).

{= INDEKS (JEŻELI ( patrz wyżej ), MATCH ( patrz powyżej ))}

Teraz jest wystarczająco proste, aby pobrać indeks pasującego wiersza z MATCH i wyciągnąć odpowiednią wartość STATUS z tablicy IF. Zwraca to pojedynczą wartość, nowy STATUS, który ma gwarancję (jeśli wykonałeś wszystkie te kroki poprawnie) od najnowszej daty dla każdego identyfikatora UID.

6 Excel nie jest bazą danych.


* FOOTNOTE: jeśli nie znasz formuł tablicowych (choć myślę, że tak jest), spójrz na to : w zasadzie podajesz oryginalną formułę, która powinna dawać tablicę wartości (bez zawijasów {}), a następnie naciśnij CTRL+ SHIFT+ ENTER. Excel dodaje dla ciebie squiggly {} i oblicza wszystkie wartości jako tablicę.

* FOOTNOTE # 2: Poważnie, EXCEL NIE JEST BAZY DANYCH. ;-)


UWAGA: Z drugiej strony myślę - ale jeszcze nie dokładnie przetestowany - że można to jeszcze bardziej uprościć: cały pierwszy zestaw IF () (cały pierwszy parametr do INDEX ()) prawdopodobnie można całkowicie zastąpić zwykłym DataSheet!C:C, ponieważ indeksowanie oparte na MATCH prawdopodobnie działałoby równie dobrze. Jest to wynik budowania formuły od dołu ...
AviD

Btw przy użyciu notacji kolumnowej zamiast notacji określonego zakresu (B: B vs. B1: B2500) wydajność jest poważnie obniżona, ponieważ Excel musi budować, porównywać i zestawiać tablice na całej długości prawie nieskończonych wierszy (dobrze, nie do końca , ale całkiem sporo). Użyłem tego dla jasności przykładu.
AviD

UWAGA 2: Ponieważ zagnieżdżone IF wewnątrz MECZU zwracają tylko PRAWDA (jeśli oba pasują do siebie), możesz to jeszcze bardziej uprościć, zastępując zagnieżdżone IF przez prostsze AND (). Tak więc ostateczna formuła byłaby o wiele czystsza:{=INDEX(DataSheet!C:C,MATCH(TRUE,AND(DataSheet!A:A=A1,DataSheet!B:B=B1),0))}
AviD

Testowałem rozwiązanie w odpowiedzi i działa, ale wydaje się być dość zasobochłonne. Wypełnienie go tylko garstką rzędów zajęło dość zauważalny moment. Nie jestem pewien, czy chciałbym nawet wyobrazić sobie uruchamianie go na setkach / tysiącach wierszy, które będzie miał mój prawdziwy arkusz. Wydaje mi się, że może to mieć coś wspólnego z notacją kolumnową, ale używam notacji kolumnowej w wielu innych dość skomplikowanych formułach (choć nie dotyczy to tablic) bez generalnie takich problemów. I tak, wiem, że to również prawdopodobnie dlatego, że Excel nie jest bazą danych.
Iszi

Przyznana nagroda za pomysłowość, przejrzystość metody (tj .: nie potrzebuję referencji od stron trzecich, aby powiedzieć, że da to wiarygodne wyniki) i za utrzymanie rozwiązania w jednym zeszycie. To nie skala się bardzo dobrze chociaż, że to jest bardzo procesor intensywne.
Iszi

1

@AviD jest poprawne, ponieważ Excel nie jest bazą danych, ale możesz zaimportować dane do innego arkusza kalkulacyjnego za pośrednictwem źródła danych Microsoft Query. Jest to trochę brzydkie, ale da ci dostęp do instrukcji SQL, która powinna umożliwić ci to, czego chcesz.

  1. W nowym arkuszu kalkulacyjnym przejdź na kartę Dane i w grupie Uzyskaj dane zewnętrzne wybierz Z innych źródeł ... i Z zapytania Microsoft.

wprowadź opis zdjęcia tutaj

  1. Wybierz pliki Excel i wybierz zapisane dane
  2. Jeśli pojawi się błąd informujący, że nie można znaleźć żadnych widocznych tabel, po prostu kliknij OK, a następnie w oknie dialogowym Opcje wybierz Tabele systemowe z listy programów. To powinno dać ci dostęp do arkuszy w arkuszu

wprowadź opis zdjęcia tutaj

  1. Dodaj kolumny UID, Status i Data do zapytania

wprowadź opis zdjęcia tutaj

  1. Dalej ... Dalej ... Dalej i wybierz Wyświetl dane lub edytuj zapytanie w Microsoft Query i wybierz Zakończ

wprowadź opis zdjęcia tutaj

  1. Teraz dostajesz arkusz roboczy, który wygląda trochę jak wczesna wersja Access.

wprowadź opis zdjęcia tutaj

  1. Kliknij przycisk SQL, aby uzyskać dostęp do samego zapytania, które moim zdaniem należy zmienić na coś takiego jak poniżej (używając GROUP BY i MAX, aby uzyskać najnowszą datę):

    WYBIERZ Sheet1$.UID, Sheet1$.Status, Max ( Sheet1$.Latest) FROM C:\Users\rgibson\Desktop\Book8.xlsx. Sheet1$ Sheet1$ GROUP BY Sheet1$.UID, Sheet1$.Status

    1. Możesz zamknąć zapytanie i wybrać miejsce, w którym chcesz zaimportować dane:

wprowadź opis zdjęcia tutaj


0

Jeśli chcesz rozważyć skorzystanie z narzędzia innej firmy, poleciłbym BeyondCompare . Jest łatwy w użyciu, ma bardzo hojną wersję próbną przed zakupem, dość niską cenę i jest dobry zarówno do porównywania, jak i łączenia wielu różnych typów plików i katalogów, w tym Excela. Możesz skopiować pojedyncze linie z jednego pliku do drugiego.

(Jestem użytkownikiem BC i nie mam nic wspólnego z firmą).


Wolę unikać narzędzi innych firm, ale dziękuję.
Iszi

0

Jeśli wszystko inne zawiedzie, połącz wszystkie dane w jeden arkusz sortuj według daty (upewnij się, że sformatowano w ten sam sposób), a następnie skopiuj najnowszą datę do nowego arkusza kalkulacyjnego, a następnie następną najbardziej aktualną datę itd. Przejdź na kartę Dane usuń duplikaty. Ponieważ program Excel zachowuje pierwszy rekord wprowadzony do arkusza kalkulacyjnego i usuwa kolejny występujący duplikat, powinno to działać.


0

Obróć arkusz danych. Wprowadź unikatowy identyfikator w wierszu i pole daty w wartości i ustaw wartość na maks. Spowoduje to wygenerowanie dwu kolumnowej tabeli z UID i najnowszą datą powiązaną z tym UID. Sformatuj kolumnę wartości w tabeli przestawnej, aby była dokładnie równa wartości pola daty na karcie danych.

Następnie skopiowałem dane przestawne do nowej karty - nazwałem to „data resolver” - i utworzyłem nazwany zakres dla dwóch kolumn A i B i nazwałem zakres nazwany „date_selector”, który możesz nazwać jak chcesz. Właściwie ustawiłem zakres na $ A: $ B, więc byłoby gotowe, gdybym wrócił i dodał później dodatkowe wiersze.

Potem wróciłem do tabeli danych i dodałem dwie kolumny. Wyszukiwanie AV, które wprowadziło identyfikator UID i zwróciło maksymalną datę z zakresu „date_selector”, a następnie prostą instrukcję if, aby zachować wiersze, w których data z zakresu „date_selector” pasowała do daty w rekordzie.

Mój unikalny identyfikator znajduje się w kolumnie M Data jest w kolumnie H Wartość daty WYSZUKAJ.PIONOWO znajduje się w kolumnie A

WYSZUKAJ.PIONOWO = WYSZUKAJ.PIONOWO (M2, data_resolver, 2, FALSE)

JEŚLI OŚWIADCZENIE = JEŻELI (A2 = H2, „ZACHOWAJ”, „USUŃ”)

W przyszłości wszystko, co muszę zrobić, to odświeżyć oś przestawną, wkleić wyniki przestawne do karty date_resolver, wkleić wiersze z formułą i usunąć wiersze usuwania.

(myśli głęboko w pudełku)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.