Como modificar Macro Guarda Factura

Necesito por favor que dicha macro cuando va a la hoja "Detalle de Facturas" insertar los datos en la fila 2 y que la fecha la tome como numero y no como texto.

Sub GuardaFactura(): Dim n As Long
With Worksheets("Detalle de Facturas")
If Application.CountIf(.Range("b:b"), Range("g2")) Then _
CreateObject("wscript.shell").PopUp "Remito YA registrado !", 3, "Cancelando ...": Exit Sub
n = Application.Count(Range("a2:a15")) ' <= revisa este rango en la hoja "Reporte" por si lo de/creces '
With .Cells(Rows.Count, 1).End(xlUp).Offset(1)
.Resize(n, 3).Value = Array(Range("f4").Text, Range("g2").Text, Range("a4").Text)
.Offset(, 3).Resize(n, 2).Value = Range("a6").Resize(n, 2).Value
.Offset(, 5).Resize(n).Value = Range("e6").Resize(n).Value
.Offset(, 6).Resize(n).Value = Range("g6").Resize(n).Value
End With
End With
End Sub

1 Respuesta

Respuesta
1

Lo primero que se podría pensar, para no modificar la macro, es ordenar el rango por fecha o N° de factura al finalizar el pase a la última fila como estaba programado.

Para modificar esta macro, a continuación te dejo una opción.

Lo que hace ahora es copiar la fila 2 e insertarla por encima. Se mantienen formatos y fórmulas. En los comentarios dejo indicado qué instrucción dejar en caso de que tu fila no tenga celdas con fórmulas.

Sub GuardaFactura()
Dim n As Long
With Worksheets("Detalle de Facturas")
    If Application.CountIf(.Range("b:b"), Range("g2")) Then _
    CreateObject("wscript.shell").PopUp "Remito YA registrado !", 3, "Cancelando ...": Exit Sub
    n = Application.Count(Range("a2:a15")) ' <= revisa este rango en la hoja "Reporte" por si lo de/creces '
'EM: insertar fila manteniendo formatos y fórmulas de la 'actual' fila 2
    With .Rows("2:2")
        .Copy
        .Insert Shift:=xlDown
    End With
    .Range("A2:E2, G2").ClearContents    'se omiten las celdas con fórmula para no borrarlas
    .[A2].Select    'se posiciona en la primera columna de la fila insertada
'... a partir de aquí comenzaría el pase de tus datos. Deberás ajustar tus instrucciones de pase.
'... recordá que siempre estarás pasando datos a la fila 2
'Por ejemplo, aquí 2 modos de enviar info a las celdas: con corchetes o Range
    .[A2] = Range("a6")
    .Range("C2") = Range("E6")
End With
End Sub

 La  instrucción de ejemplo:  .Range("A2:E2, G2").ClearContents

Lo que hace es omitir la celda F2 y H2 porque tienen fórmula. Si en tu caso no hay fórmulas, la instrucción sería, para este rango de ejemplo:

.Range("A2:H2").ClearContents

PD) Siempre es conveniente que dejes una imagen de tu hoja, por lo menos títulos y encabezados para poder programar con más precisión.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas