Excel 2010: VBA convierte el texto entrante en una lista desplegable de selección múltiple

Excel 2010: VBA convierte el texto entrante en una lista desplegable de selección múltiple

Regularmente recibo un archivo de exportación sin formato y he escrito macros para formatearlo y manipularlo. Utilizo Excel 2010 y me siento moderadamente cómodo con VBA.

Una de las columnas entrantes tiene una lista de nombres, de una lista conocida (finita pero grande), separados por punto y coma. Sin embargo, si utiliza Autofiltro, no trata las entradas como verdaderas selecciones múltiples.

Pregunta:¿Puedo decirle a Excel mediante programación que vea "manzana; uva" como una selección múltiple de "manzana" y "uva"?

Ejemplo:

Supongamos que sabemos que la lista sólo contiene los siguientes nombres: manzana, cereza, uva, naranja, melocotón

Las celdas de la columna (A) pueden contener una, dos, ... o cinco de estas frutas en cualquier combinación, separadas por ";".

(A1) = manzana (A2) = manzana; uva (A3) = manzana; melocotón (A4) = cereza; uva (A5) = cereza; naranja

Por suerte para mí, los datos entrantes siempre se exportan en orden alfabético (por lo que nunca tendré una celda que contenga "manzana; uva" y otra celda que contenga "uva; manzana").

El problema:Autofiltro supone que cada combinación posible es una opción de "selección" única. En pasos posteriores, necesito combinar/filtrar en función de múltiples criterios que complican el uso de unformación- porque tengo una lista demasiado grande para ver todas las permutaciones combinadas como posibilidades únicas.

[Por ejemplo: estoy filtrando para copiar un grupo de datos a una nueva pestaña y, a veces, simplemente muevo cualquier cosa que contenga "uva" a una nueva pestaña, pero a veces cualquier cosa que contenga "uva" O "cereza" se copia en la misma pestaña nueva.]

¡Existe una clara posibilidad de que esté pensando demasiado en esto y haciéndolo más difícil de lo necesario!

¡Gracias!

Editar: En otras palabras, no veo cómo recorrer razonablemente Range().Autofilter Field... Criteria1:=() con un conjunto exponencialmente grande de combinaciones. ¿Tener sentido?

Respuesta1

Úselo advancedfilteren lugar de autofilterya que puede manejar tantos criterios como desee.
Aquí hay un ejemplo práctico. Configure su hoja de Excel como se muestra en la primera captura de pantalla y ejecute la macro.

antes de la macro
ingrese la descripción de la imagen aquí

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

Después de la macro
ingrese la descripción de la imagen aquí

Estoy seguro de que entenderás la idea y cómo adaptarla.

información relacionada