Convertir datos de excel en fichero pdf

Tengo un fichero excel donde el número de farmacia puede repetirse o no. Lo que quiero es que cada vez que cambie el número de farmacia, crear un documento pdf con los datos correspondientes a esa farmacia.

                                En este ejemplo vemos cómo las farmacias 20 y 45 se repiten. Pues necesitaría un código vba para extraer los datos de cada farmacia y convertirlos en pdf. Es decir tendría un pdf para la farmacia 5, otro para la 17, otro para la 20 donde irán relacionados los dos medicamentos pero un sólo importe por la suma de los dos, otro pdf para la 33, otro para la 45 (con detalle de los 4 medicamentos y total de los 4) otro para la farmacia 53 y otro para la 54. ¿Cómo sería dicho código?. Gracias. Dam

1 respuesta

Respuesta
2

Asumiendo que los datos empiezan en la celda A1. Prueba esto:

Los archivos se guardarán en la misma carpeta donde tienes tu archivo de excel y nombrados con el número de la farmacia.

Sub Generar_PDF()
  Dim c As Range
  Dim ky As Variant
  '
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  '
  With CreateObject("scripting.dictionary")
    If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False
    For Each c In Range("A2", Range("A" & Rows.Count).End(3))
      .Item(c.Value) = Empty
    Next c
    For Each ky In .Keys
      Range("A1").AutoFilter 1, ky
      ActiveSheet.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\" & ky & ".pdf", xlQualityStandard, True, False, , , False
    Next ky
  End With
  ActiveSheet.ShowAllData
  '
  Application.ScreenUpdating = True
  Application.DisplayAlerts = True
End Sub

Es casi lo que necesitaba. Y digo casi, porque cuando genera el primer pdf que es el de la farmacia 5, cuando genera el segundo pdf que es el de la farmacia 17, aparece tambien relacionada la farmacia 5 y en todos los posteriores siempre aparece la 5. Y otra cosa, ¿cómo se podría poner para que saliera el total de importe de los medicamentos que se relacionan?. Gracias por tu pronta respuesta.

Además, entiendo el procedimiento, es meterle un filtro y luego exportar los datos al pdf. Pero tengo creada una plantilla en excel donde cada dato ha de ir en su lugar correspondiente y luego convertir dicha plantilla en pdf.

Pero tengo creada una plantilla en excel donde cada dato ha de ir en su lugar correspondiente y luego convertir dicha plantilla en pdf.

Eso no lo pusiste en tu petición inicial.

Debes explicar con detalle.

Pon imágenes completas de tus hojas, donde se vean las filas y las columnas de excel.

Es verdad no lo puse anteriormente. Sorry.

La plantilla sería una cosa parecida a esta:

Puedes poner las imágenes de tus hojas completas. Que se vean las filas y las columnas.

Ejemplo:

Sería una cosa como ésta

                

Sería un pdf para cada farmacia, con los medicamentos que tenga cada una de ellas.

Gracias

Te faltó la pantalla donde tienes tus datos. Todavía no sé en cuál celda empiezan tus datos.

¿Y cómo se llaman las 2 hojas?

¿Cómo quieres que se llame cada archivo y cuál carpeta se van a guardar?

Prueba lo siguiente.

NOTA: Nuevamente asumiendo que los datos en la hoja1 están en la celda A1

La hoja plantilla se llama hoja2, ajusta los nombres de las hojas en la macro.

Sub Generar_PDF()
  Dim c As Range
  Dim ky As Variant
  Dim sh1 As Worksheet, sh2 As Worksheet
  Dim lr As Long, lr2 As Long
  '
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  Set sh1 = Sheets("Hoja1")
  Set sh2 = Sheets("Hoja2")
  '
  With CreateObject("scripting.dictionary")
    If sh1.AutoFilterMode Then sh1.AutoFilterMode = False
    lr = sh1.Range("A" & Rows.Count).End(3).Row
    For Each c In sh1.Range("A2:A" & lr)
      .Item(c.Value) = Empty
    Next c
    For Each ky In .Keys
      sh1.Range("A1").AutoFilter 1, ky
      sh2.Range("B7").Value = ky
      sh2.Range("A10:C" & Rows.Count).ClearContents
      sh1.AutoFilter.Range.Range("B2:D" & lr).Copy
      sh2.Range("A10").PasteSpecial xlPasteValues
      lr2 = sh2.Range("A" & Rows.Count).End(3).Row
      sh2.Range("B" & lr2 + 4).Value = "Total :"
      sh2.Range("C" & lr2 + 4).Value = WorksheetFunction.Sum(sh2.Range("C10:C" & lr2))
      sh2.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\" & ky & ".pdf", xlQualityStandard, True, False, , , False
    Next ky
  End With
  sh1.ShowAllData
  '
  Application.ScreenUpdating = True
  Application.DisplayAlerts = True
End Sub

la pantalla donde están mis datos va desde A1 hasta C9. La hoja se llama "plantilla" y la de los datos pues, eso "datos". Los ficheros pdf se crearían como tú bien dijistes al principio, con el número de farmacia.pdf (en el caso de arriba, 5.pdf) y la carpeta podría llamarse "diciembre". Los datos empezarían en el rango ("A10:C10"), y de ahí para abajo.

Te puse la macro, prueba y me comentas.

Sub Generar_PDF()
  Dim c As Range
  Dim ky As Variant
  Dim sh1 As Worksheet, sh2 As Worksheet
  Dim lr As Long, lr2 As Long
  '
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  Set sh1 = Sheets("datos")
  Set sh2 = Sheets("plantilla")
  '
  With CreateObject("scripting.dictionary")
    If sh1.AutoFilterMode Then sh1.AutoFilterMode = False
    lr = sh1.Range("A" & Rows.Count).End(3).Row
    For Each c In sh1.Range("A2:A" & lr)
      .Item(c.Value) = Empty
    Next c
    For Each ky In .Keys
      sh1.Range("A1").AutoFilter 1, ky
      sh2.Range("B7").Value = ky
      sh2.Range("A10:C" & Rows.Count).ClearContents
      sh1.AutoFilter.Range.Range("B2:D" & lr).Copy
      sh2.Range("A10").PasteSpecial xlPasteValues
      lr2 = sh2.Range("A" & Rows.Count).End(3).Row
      sh2.Range("B" & lr2 + 4).Value = "Total :"
      sh2.Range("C" & lr2 + 4).Value = WorksheetFunction.Sum(sh2.Range("C10:C" & lr2))
      sh2.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\" & ky & ".pdf", xlQualityStandard, True, False, , , False
    Next ky
  End With
  sh1.ShowAllData
  '
  Application.ScreenUpdating = True
  Application.DisplayAlerts = True
End Sub

Casi está y gracias por ello. Sólo comentarte que la primera farmacia (la 5) se repite en todas las hojas. la primera hoja sale con la farmacia 5 (bien) pero la segunda sale con la farmacia 5 y la 17, y así sucesivamente.

NOTA: Nuevamente asumiendo que los datos en la hoja1 están en la celda A1

Puedes poner una imagen de tu hoja con datos, según tu ejemplo inicial tienes títulos.

Funciona correctamente. La cuestión estaba en que para hacer la prueba los datos empezaba en la columna A1 (SIN ENCABEZAMIENTO), en cuanto le puse encabezamiento funcionó a la perfección (eres un hacha). Muchas gracias por tu ayuda.

Así es, tu ejemplo en tu pregunta inicial contiene encabezado.

Encantado de ayudarte, gra cias por comentar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas