
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 advancedfilter
en lugar de autofilter
ya 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
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
Estoy seguro de que entenderás la idea y cómo adaptarla.