sábado, abril 12, 2014

Copiar filas de una tabla filtrada en Excel con Vba (macros)

Numerador automático para facturas es una de las páginas más populares de este blog. Una de las consultas más frecuentes es cómo hacer para guardar copias de las facturas, así que, después de varios años (la nota es del 2008), decidí rehacer el modelo que incluye, además de corregir varios bugs, la posibilidad de manejar los datos de las facturas en una base de datos.
Toda esta introducción viene a cuento de que una de las rutinas que tuve que desarrollar para el nuevo modelo, que estaré publicando en breve, se basa en filtrar las filas de la base de datos y copiarlas a otra hoja (lo hoja que contiene la copia de la factura).
En esta nota mostraré dos métodos eficientes para hacerlo. Como ejemplo utilizaremos los datos de ventas de la base de datos Northwind

Ventas Northwind

Dado que los métodos de Excel, como Autofiltro, suelen ser más eficientes que el código que podamos escribir, podemos grabar las acciones y luego mejorar el código reemplazando, por ejemplo, las referencias a rangos por variables.
Supongamos que queremos copiar a otra hoja todas las ventas a la Argentina. Después de aplicar Autofiltro, grabamos las acciones para el copiado obteniendo este código

Sub Macro1()

'
    Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("Hoja2").Select
    ActiveSheet.Paste
End Sub


Hacemos dos mejoras a este código


  • usamos la propiedad CurrentRegion de Range en lugar de Selection.End(xlToRight) y Selection.End(xlDown),
  • eliminamos los Select abreviando el código


Sub Macro2()
'
    Selection.CurrentRegion.Copy
    Sheets("Hoja2").Paste
 
End Sub


Pero existe una posibildad más sencillla usando AutoFilter.Range

Sub Macro3()

    ActiveSheet.AutoFilter.Range.Copy
    Sheets("Hoja2").Paste

End Sub


La ventaja de usar AutoFilter.Range es que funciona aún si la celda activa no pertenece a la tabla filtrada.



2 comentarios:

  1. Será que me servirá para copiar la factura a otra hoja?, es decir;

    Relleno la factura en determinadas celdas, digamos que en la celda
    C7 el RIF/CI del cliente
    C8 El nombre Cliente
    C9 Dirección
    C11 Telf.
    E11 Fecha
    C14 hasta C23 Descripción Producto
    E14 Hasta E23 cantidad Precio
    F14 hasta F23 Valor Total por cantidad de producto
    F26 IVA y
    F27 Total

    Esto lineal, digamos que en una línea un producto, mas líneas si se trata del mismo cliente pero con productos diferentes en la misma fecha.

    Para nueva factura sea dl mismo cliente sea de otro, dejar una línea en blanco

    Será posible?

    ResponderBorrar
  2. Así como esstá planteado tu ejemplo la respuesta es no. Tendrías que tener una base de datos/tabla, donde tenés una fila para cada producto en la factura. Si tenés un poco de papciencia, en los próximos días estaré publicando un modelo de factura que maneja una base de datos, donde uso esta técnica.

    ResponderBorrar

Nota: sólo los miembros de este blog pueden publicar comentarios.