Pasar datos a una plantilla automáticamente

Estoy intentando crear informes automáticamente, pasando datos a una plantilla, he encontrado este código en algunas preguntas, pero no me funciona.

Alguien me puede ayudar por favor.

Sub InvoiceNumber()
'Por.Dante Amor
    Set h1 = Sheets("datos")
    Set h2 = Sheets("ej1")
    Set h3 = Sheets("plantilla")
    h2.Cells.Clear
    '
    j = 1
    i = 2
    n = 0
    '
    ant = h1.Cells(2, "F")
    encabezado h1, h2, h3, i, j
    For i = 2 To h1.Range("F" & Rows.Count).End(xlUp).Row
        If ant <> h1.Cells(i, "f") Then
            n = 0
            encabezado h1, h2, h3, i, j
        End If
        ant = h1.Cells(i, "F")
        If h1.Cells(i, "P") = "Duty Charges" Then
            duty h1, h2, h3, i, j, n
        Else
            n = n + 1
            productos h1, h2, h3, i, j, n
        End If
    Next
    h2.Select
    MsgBox "Proceso terminado", vbInformation, "PLANTILLA"
End Sub
Sub encabezado(h1, h2, h3, i, j)
'Por.Dante Amor
    h3.Rows(1 & ":" & 3).Copy h2.Rows(j)
    '
    h2.Cells(j, "B") = h1.Cells(i, "F")  'invoice num
    h2.Cells(j, "C") = h1.Cells(i, "J")  'invoice date
    h2.Cells(j, "D") = h1.Cells(i, "G")  'CURRENCY
    h2.Cells(j, "E") = h1.Cells(i, "AB") 'PO
    h2.Cells(j, "F") = h1.Cells(i, "O")  'PAYMENT_TERM
    j = j + 1
    h2.Cells(j, "B") = h1.Cells(i, "A")  'BILL_TO_CUSTOMER_NAME
    h2.Cells(j, "C") = h1.Cells(i, "Y")  'VAT NUMNER PURCHASING COMPANY
    j = j + 1
    h2.Cells(j, "B") = h1.Cells(i, "Z")  'SELLER
    h2.Cells(j, "C") = h1.Cells(i, "AA") 'SELLER VAT
    j = j + 1
End Sub
Sub productos(h1, h2, h3, i, j, n)
'Por.Dante Amor
    h3.Rows(4 & ":" & 6).Copy h2.Rows(j)
    '
    h2.Cells(j, "B") = n                 'consecutivo
    h2.Cells(j, "C") = h1.Cells(i, "P")  'DESCRIPTION
    j = j + 1
    h2.Cells(j, "C") = h1.Cells(i, "K")  'QUANTITY_INVOICED
    h2.Cells(j, "D") = h1.Cells(i, "M")  'EXTENDED_AMOUNT
    h2.Cells(j, "K") = h1.Cells(i, "V")  'TAX_TOTAL
    j = j + 2
End Sub
Sub duty(h1, h2, h3, i, j, n)
'Por.Dante Amor
    h3.Rows(19 & ":" & 21).Copy h2.Rows(j)
    '
    h2.Cells(j, "B") = n                 'consecutivo
    'h2.Cells(j, "C") = h1.Cells(i, "P")  'DESCRIPTION
    j = j + 1
    h2.Cells(j, "C") = h1.Cells(i, "K")  'QUANTITY_INVOICED
    h2.Cells(j, "D") = h1.Cells(i, "M")  'EXTENDED_AMOUNT
    h2.Cells(j, "K") = h1.Cells(i, "V")  'TAX_TOTAL
    j = j + 2
End Sub

1 respuesta

Respuesta
4

Los códigos que encuentres en otras consultas, especialmente cuando no están explicadas como para hacerles un seguimiento, no son tan fáciles de adaptar ya que fueron creadas para un ejemplo puntual.

Tampoco podemos resolverla si no nos indicas tus referencias o muestres la estructura de tus hojas en una imagen. Aquí se toman algunos datos de 2 hojas... debes indicarme cuáles son tus hojas, tus rangos a copiar y todo lo que puedas aportar para adaptar este código, o directamente desarrollarte uno nuevo a tu medida ;)

Si te resulta más cómodo enviarme directamente tus hojas explicando lo que necesitas informar, encontrarás mis correos en sección Contactos de mi sitio. Copia el de gmail por favor.

Hola,

No veo el correo que me comentas.

Te comento por aquí lo que necesito:

Tengo una hoja de informe tipo y necesito que al rellenar la hoja y dar generar informe se genere otra hoja con el nombre de una celda y todo los datos ya rellenados, asimismo, que esa hoja informe tipo quede en blanco y pueda volver a rellenar otro informe y volver ha realizar el mismo proceso. 

1. Relleno el informe 

2. Genero informe a partir de una celda que se llamará ¨Nombre del fichero¨

Espero haberme explicado bien.

Gracias de antemano.

Dejo imagen para que encuentres mi correo ;)

Si la nueva hoja será una copia del formulario, es decir con los datos en las mismas ubicaciones, lo mejor será que la macro realice una copia, la renombre y eventualmente, si hubiese fórmulas las deje como valores (para no dejarla vinculada a la plantilla).

Sub GeneraCopia()
'x Elsamatilde
Dim sino, hojaForm
'siempre es conveniente confirmar antes de crear/limpiar hojas
sino = MsgBox("¿Confirmas guardar copia de este formulario?", vbQuestion + vbYesNo, "Confirmar")
'si respondes que no se cancela y se queda en el formulario
If sino <> vbYes Then Exit Sub
'guarda el nombre de la planilla para regresar
    hojaForm = ActiveSheet.Name
'realiza una copia dejándola al final de las pestañas
    ActiveSheet.Copy After:=Sheets(Sheets.Count)
'la copia pasa a ser la hoja activa y se le cambia el nombre por el contenido de una celda
    ActiveSheet.Name = [C8]     
'a las celdas que tienen fórmulas se las deja como valores
    With Range("C10:C17")    'AJUSTAR RANGOS .... esto es solo un ejemplo
        .Copy
        .PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
            xlNone, SkipBlanks:=False, Transpose:=False
    End With
'regresa a la hoja formulario
Sheets(hojaForm).Select
'se limpia el rango de valores.....NO limpiar celdas que puedan tener fórmula
'ver ejemplos de cómo seleccionar rangos
'opcional: seleccionar la primer celda para el llenado de un nuevo documento
[B5].Select
MsgBox "Fin del guardado."
End Sub

El código va explicado por lo que podrás ajustar todas las referencias a tu modelo. Como verás, no es posible en una imagen detectar las que tienen fórmula.

Por otro lado, tampoco queda claro si necesitas una copia de la hoja, o quieres pasar solo los campos y ubicarlos tipo hoja base... o quieres otro libro (mencionas nombre del fichero).

Sdos.

Elsa

* Los invito a visitar la sección Manuales de mi sitio... acabo de publicar el Manual 500Macros+365 (revisión y actualización completa del manual 500Macros incluyendo código apto para la versión Excel 365 + nuevos capítulos). Imperdible!

Hola, Elsa,

Gracias, por la macro, me ha servido muchísimo.

Ahora tengo otro problema y es en el paso 3. A parte de copiar el nombre de la hoja creada, necesitaría copiar otros 3 valores más, he usado el mismo código, pero no sale nada,

3- Se agrega el nombre de la nueva hoja a la lista en 'Hoja Control'
'previamente se verifica si esta hoja existe
On Error Resume Next
buscarHoja = Worksheets("Hoja Control").Name <> ""
If buscarHoja = False Then
Sheets.Add before:=Sheets(1)
ActiveSheet.Name = "Hoja Control"
End If
Hoja4.Select 'vuelve a la hoja informe
'primer fila libre para agregar el nombre creado
x = Sheets("Hoja Control").Range("A" & Rows.Count).End(xlUp).Row + 1
Sheets("Hoja Control").Range("A" & x) = [B21]
x = Sheets("Hoja Control").Range("B" & Rows.Count).End(xlUp).Row + 1
Sheets("Hoja Control").Range("B" & x) = [B19]
x = Sheets("Hoja Control").Range("C" & Rows.Count).End(xlUp).Row + 1
Sheets("Hoja Control").Range("C" & x) = [C56]

Gracias de ante mano.

Para mayor comodidad y rapidez en la escritura de las instrucciones se utiliza una variable para encontrar la fila de destino. En este caso usé 'x'. NO es necesario buscarla en cada pase, sino que te sirve para todos los pases.

'primer fila libre para agregar el nombre creado
x = Sheets("Hoja Control").Range("A" & Rows.Count).End(xlUp).Row + 1
Sheets("Hoja Control").Range("A" & x) = [B21]
Sheets("Hoja Control").Range("B" & x) = [B19]
Sheets("Hoja Control").Range("C" & x) = [C56]

Ahora, podemos avanzar un poco más en la mejora del código cuando vayamos a realizar varios pases a la misma hoja, dejándola dentro de un With ... End With de este modo:

'primer fila libre para agregar el nombre creado
With Sheets("Hoja Control")
    x = .Range("A" & Rows.Count).End(xlUp).Row + 1
    .Range("A" & x) = [B21]
    .Range("B" & x) = [B19]
    .Range("C" & x) = [C56]
End With

* Mira el video N° 19 de mi canal donde dejo más ejemplos de Bucles y otras estructuras importantes en VBA.

Sdos.

Elsa

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas