Macro para copiar rango variable con condición a otra hoja

Sigo el foro hace mucho tiempo aunque nunca me he atrevido a preguntar. Agradezco vuestro conocimiento y vuestras explicaciones.

Tengo que crear un fichero copiando los datos de una hoja cuyas columnas son siempre las mismas pero la última fila la desconozco. Las filas a copiar son solo las que en la columna "F" contenga como condición una "P". El rango a copiar comenzaría desde la fila 4 columna c hasta la columna "AE". El final del rango sería hasta que la columna "F" no contenga la condición "P". Los datos deben copiarse en la celda A1 en formato texto para que Excel no convierta en científica ciertos datos y la copia seria en una nueva hoja

Os doy las gracias tenga o no respuesta ya que siempre ha sido muy útil para mi consultar este foro.

1 respuesta

Respuesta
2

Ingresa al Editor de macros (con ALT + F11)

Inserta un módulo y allí copia lo siguiente:

Sub copiaFiltrada()
'x  Elsamatilde
'ultima fila de la tabla
filx = Range(ActiveSheet.UsedRange.Address).Rows.Count
'se filtra la tabla x col F, criterio 'P'
    Range("A3").Select
    ActiveSheet.Range("$A$3:$I$" & filx).AutoFilter Field:=6, Criteria1:="D"
'se evalúa si hay registros filtrados
fily = Range("A" & Rows.Count).End(xlUp).Row
If fily < 4 Then
    MsgBox "No se encontraron registros con este criterio"
    'se quita el modo filtrado
    ActiveSheet.ShowAllData
    Exit Sub
End If
'se copia el rango filtrado
    Range("A3:I" & fily).Copy
'se agrega una hoja y allí se pega valores y formatos
    Sheets.Add After:=ActiveSheet
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
'formato texto a todo el rango
    Selection.NumberFormat = "@"
    Range("A1").Select
'se quita el modo filtrado de la hoja anterior
ActiveSheet.Previous.ShowAllData
End Sub

Podrás ejecutarla desde el mismo Editor o desde la hoja, menú Desarrollador, Macros.

Otras opciones para ejecutar macros las encontrarás explicadas en mi sitio que dejo al pie.

Dejé mis referencias ... ajusta por favor estas líneas con tu rango y tu criterio:

    ActiveSheet.Range("$A$3:$AE$" & filx).AutoFilter Field:=6, Criteria1:="P"
Y también el rango donde encuentres el siguiente comentario:
'se copia el rango filtrado
    Range("A3:AE" & fily). Copy

Sdos!

Muchísimas gracias, funciona genial

Tengo una pregunta, ¿es posible que los números se copien como texto? la hoja que copia tiene valores con más de 11 dígitos y los convierte en científica. Por más que doy formato a las celdas, Excel no respeta el formato y al crear la hoja nueva, aunque en la macro que amablemente me has facilitado, habla del formato Selection.NumberFormat = "@" no lo deja como número normal y lo convierte en científica. 

Una vez más, muchas gracias por la macro. Eres una genio

Si te queda algo como en la siguiente imagen: formato científica pero aparece como General en la celda como resultado de la macro:

En ese caso solo dale un ancho mayor a la columna.

Sdos!

Buenos días Elsa

Una vez más agradecerte todas las molestias generadas

Ojala se solucionase tan fácil. El tema es que el fichero lo convierto a csv y como lo convierte en un fichero plano tanto en las columnas "C" y "D" que hay datos con más de 11 caracteres Excel en la nueva hoja generada no respeta los formatos y los deja en notación. Puedo cambiarlo manualmente pero si la macro puede hacerlo automáticamente sería genial. 

Si puedes, no quiero complicarte que bastante me has ayudado

Un saludo y mil gracias

Buenos días Elsa

Quería comentarte que he visitado tu sitio: http://aplicaexcel.galeon.com/macros.htm y esta muy bien

Allí en mi sitio aparecen mis correos. Enviame una muestra de 1 o 2 filas de datos y la macro para ajustarla.

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas