Excel 2010: VBA Konwertuj przychodzący tekst na listę rozwijaną z wieloma opcjami

0

Regularnie otrzymuję surowy plik eksportu i napisałem makra do formatowania i manipulowania nim. Używam Excel 2010 i jestem umiarkowanie komfortowy w VBA.

Jedna z przychodzących kolumn ma listę nazw, ze znanej (skończonej, ale dużej) listy, oddzielonej średnikami. Jeśli jednak korzystasz z autofiltru, nie traktuje on wpisów jak prawdziwych wielokrotnych selekcji.

Pytanie: Czy mogę programowo powiedzieć programowi Excel, aby zobaczył „jabłko; winogrono” jako wielokrotny wybór zarówno „jabłka”, jak i „winogrona”?

Przykład:

Załóżmy, że wiemy, że lista zawiera tylko następujące nazwy: jabłko wiśnia winogrono Pomarańczowy brzoskwinia

Komórka (komórki) w kolumnie (A) może zawierać jeden, dwa, ... lub pięć z tych owoców w dowolnej kombinacji, oddzielone „;”.

(A1) = jabłko (A2) = jabłko; winogrono (A3) = jabłko; brzoskwinia (A4) = wiśnia; winogrono (A5) = wiśnia; Pomarańczowy

Na szczęście dla mnie dane przychodzące są zawsze eksportowane w porządku alfabetycznym (więc nie będę miał ani jednej komórki zawierającej „jabłko; winogrono” i inną komórkę zawierającą „winogrono, jabłko”).

Problem: AutoFilter zakłada, że ​​każda możliwa kombinacja jest unikalną opcją „wybierz”. W późniejszych krokach muszę połączyć / filtrować na podstawie wielu kryteriów, które utrudniają korzystanie z szyk - ponieważ mam zbyt dużą listę, aby zobaczyć wszystkie kombinacje permutacji jako unikalne możliwości.

[Na przykład: filtruję, aby skopiować grupę danych do nowej karty, a czasami po prostu przenoszę coś z „winogronem” na nową kartę, ale czasami wszystko, co zawiera „winogrono” LUB „wiśnia”, jest kopiowane do ta sama nowa karta.]

Istnieje wyraźna możliwość, że zastanowię się nad tym i utrudnię to, co musi być!

Dzięki!

Edycja: Innymi słowy, nie widzę, jak rozsądnie przechodzić przez zakres (). Pole autofiltrów ... Kryterium1: = () z wykładniczo dużym zestawem kombinacji. Ma sens?

hudsonsedge
źródło
Więc jaki kod masz dotąd i gdzie utkniesz?
Ƭᴇcʜιᴇ007
Wiem, jak (w VBA) utworzyć sprawdzoną listę i amp; przypisz go do rozwijania w kolumnie komórek. Znalazłem kod na liście wielokrotnego wyboru @ blog.contextures.com/archives/2011/04/29/… ale chociaż zwykle mogę wyczuć to, czego potrzebuję z kodu innych, jestem w pewnym stopniu straciła na tym, od czego zacząć. Czy będę przenosić istniejące dane do nowej kolumny?
hudsonsedge
Myślę, że jestem w głowie, ponieważ staram się być skuteczny. Używam tablicy z a dla / obok do tworzenia i nazwij zakładkę dla każdego owocu (używając tego przykładu) i ponownie utwórz listę rozwijaną na każdej karcie. Ale w mojej głowie nie widzę, jak skutecznie (a) używać każdego owocu z listy jako filtru na stronie głównej, (b) skopiować wynikową przefiltrowaną listę do prawidłowo nazwanej karty, (c) wrócić do na stronie głównej, wyczyść filtr i odfiltruj kolejne owoce LUB owoce (ponieważ niektóre z „filtrów” to elementy złożone / wielokrotne). Single, które dostaję - wielokrotności, które powinienem zrobić poza pętlą?
hudsonsedge

Odpowiedzi:

2

Posługiwać się advancedfilter zamiast autofilter ponieważ może obsłużyć dowolną liczbę kryteriów.
Oto działający przykład. Skonfiguruj arkusz Excela tak, jak pokazuje pierwszy zrzut ekranu i uruchom makro.

Przed makro
enter image description here

Sub AdvancedFilterTest()

    'clear old results and old filters
    Range("C:C").Clear
    Range("D:D").Clear

    'criteria header name and data header name needs to be the same
    [C1] = [B1]

    'Split multiple criterias by semicolon and save them as array
    Criterias = Split([A2], ";")

    'write the array to cells since advancedfilter needs a range as criteria
    For i = 0 To UBound(Criterias)
        Cells(i + 2, 3) = Criterias(i)
    Next i

    'Set the cells as a range so advancedfilter can use them
    Set critrange = Range(Cells(1, 3), Cells(UBound(Criterias) + 2, 3))

    'advanced filter will filter and copy your data to a new target range
    Range("B:B").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=critrange, CopyToRange:=Sheets(1).[D1]

End Sub

Po makro
enter image description here

Jestem pewien, że wpadniesz na pomysł i jak go dostosować.

nixda
źródło
Nixda, dziękuję! Nie mogę uwierzyć, że nigdy wcześniej z tym nie grałem. Ma nawet trochę do skopiowania na inną zintegrowaną stronę. Doskonały!
hudsonsedge