Combinación de Correspondencia (Mail Merge) en PowerPoint usando VBA y una base de datos SQL Server.

PowerPoint no tiene combinación de correspondencia como sí lo tiene Word. Existen productos pagados que te dan esta funcionalidad pero si no quieres pagar, esta solución te podría servir.

Vamos a crear una simple combinación de correspondencia (mail merge) en PowerPoint utilizando Visual Basic for Applications (VBA) y la lista de personas estará en una base de datos Microsoft SQL Server. He escrito una versión de este artículo que utiliza Excel en vez de SQL Server como la fuente de datos, creo que es una mejor opción para los usuarios de casa.

Recuerda que necesitas la pestaña de desarrollador (Developer Tab), tengo un artículo en este mismo blog que te permite activarla.

Activar la pestaña de desarrollador.

Cosas que necesitas:

1. En SQL Server una base de datos llamada “DB” y una tabla “Empleados”. Esta tabla servirá como fuente de datos para PowerPoint.

CREATE TABLE Employees
(
    Id int NOT NULL,
    FirstName varchar(50) NULL,
    LastName varchar(50) NULL,
    FileName varchar(300) NULL
)

Cada registro de la tabla representará un empleado, Id es la clave única (PK o Primary Key), FirstName = nombre del empleado, LastName = apellido del empleado.

Las fotos o imágenes de cada empleado estarán en archivos PNG o JPG ubicados en una carpeta. La columna (o campo) llamada FileName (nombre de archivo) contendrá la ruta completa, por ejemplo: “C:\Fotos\1.jpg”.

Como ejercicio puedes incrustar la imagen en una columna de tipo image en la misma tabla y leer las fotos de ahí. En ese caso no necesitas la carpeta con las fotos. Necesitarás insertar las imágenes así:

insert into Employees (ImageColumn) 
SELECT BulkColumn 
FROM Openrowset( Bulk 'C:\Fotos\1.jpg', Single_Blob) as img

2. Insertar los registros en la tabla:

INSERT DB.dbo.Employees VALUES(1,'John','Smith','C:\Fotos\1.jpg')
INSERT DB.dbo.Employees VALUES(2,'Michael','Wilson','C:\Fotos\2.jpg')
INSERT DB.dbo.Employees VALUES(3,'Ned','Bach','C:\Fotos\3.jpg')
INSERT DB.dbo.Employees VALUES(4,'Adolf','Wright','C:\Fotos\4.jpg')

3. Crea la carpeta “C:\Fotos” y copia 4 fotos con la extensión JPG y ponles de nombre “1.jpg”, “2.jpg”, “3.jpg”, “4.jpg”. Si te da pereza copia una sola foto 4 veces y renómbrala, al menos serán todas del mismo tamaño.

4. Abre PowerPoint y presiona “ALT + F11” para abrir el IDE (ambiente de desarrollo integrado) para VBA (Visual Basic for Applications).

5. Agrega una referencia: Herramientas\Referencias… Ubica en la lista “Microsoft ActiveX Data Objects 2.8 Library” y márcala luego clic OK.

6. Agrega un Módulo y copia y pega el siguiente código:

Public Sub DoMailMerge()
    On Error GoTo errHandler
    Dim x As Slide
    Dim sh As Shape
    Dim i As Long
 
    'Delete all slides
    RemoveSlides
 
    Dim Cn As New ADODB.Connection
    Dim Rs As New ADODB.Recordset
    Cn.Open "Provider=SQLNCLI11;Server=YOURCOMPUTERNAME\SQLEXPRESS;Database=DB;Trusted_Connection=yes;"
    Rs.Open "SELECT Id, FirstName, LastName, FileName FROM DB.dbo.Employees", Cn, adOpenStatic, adLockReadOnly
 
    If Rs.EOF = True Then
        MsgBox "No Results"
        Exit Sub
    End If
 
    'Add slides needed.
    Dim NumSlides As Long
    'We are going to use 3 records by slide, that's why we use 3 in the following code.
    NumSlides = Int(Rs.RecordCount / 3)
    'Add 1 if remainder of division greater than zero
    If Rs.RecordCount Mod 3 > 0 Then
        NumSlides = NumSlides + 1
    End If
    Dim num As Long
    For num = 1 To NumSlides
        AddSlides
    Next num
    'As we created all the slides needed we just navigate through them
    For Each x In ActiveWindow.Presentation.Slides
        'iterate 3 records
        For i = 1 To 3
            If Rs.EOF = False Then
                'Add a Title
                Set sh = x.Shapes.AddTextbox(msoTextOrientationHorizontal, 35, 30 + ((i - 1) * 150), 280, 14)
                sh.TextFrame.AutoSize = ppAutoSizeNone
                sh.TextFrame.TextRange.ParagraphFormat.Alignment = ppAlignCenter
                sh.TextFrame.TextRange.Font.Name = "Times New Roman"
                sh.TextFrame.TextRange.Font.Size = 10
                sh.TextFrame.TextRange.Font.Color.RGB = vbWhite
                sh.TextFrame.TextRange.Font.Bold = msoTrue
                sh.Fill.ForeColor.RGB = RGB(31, 73, 125)
                sh.TextFrame.VerticalAnchor = msoAnchorMiddle
                sh.Fill.Solid
                sh.TextFrame.TextRange.Text = "Employee " & Right("00000" & Trim(CStr(Rs!Id & "")), 5)
                'Add employee info from database
                Set sh = x.Shapes.AddTextbox(msoTextOrientationHorizontal, 36, 50 + ((i - 1) * 150), 145, 100) '.TextFrame.TextRange.Text = "hello"
                sh.TextFrame.TextRange.Font.Name = "Arial"
                sh.TextFrame.TextRange.Font.Size = 8
                sh.TextFrame.TextRange.Font.Bold = msoTrue
                sh.TextFrame.TextRange.Lines.ParagraphFormat.SpaceWithin = 1.5
                sh.TextFrame.TextRange.Text = "First Name : " & Trim(Rs!FirstName & "") & vbNewLine & _
                                "Last Name: " & Trim(Rs!LastName & "") & vbNewLine & _
                                "Id : " & Right("00000" & Trim(CStr(Rs!Id)), 5)
                'Add picture
                Set sh = x.Shapes.AddPicture(Rs!FileName & "", msoFalse, msoTrue, 190, 50 + ((i - 1) * 150))
                'Read the following record
                Rs.MoveNext
            Else
                Exit For
            End If
        Next i
    Next
errHandler:
    If Err.Number = -2147024809 Then 'File Not Found
        Resume Next
    End If
End Sub
 
Sub AddSlides()
    Dim Pre As Presentation
    Dim Sld As Slide
    Set Pre = ActivePresentation
    Set Sld = Pre.Slides.Add(Pre.Slides.Count + 1, ppLayoutBlank)
End Sub
 
Sub RemoveSlides()
    Dim Pre As Presentation
    Dim x As Long
    Set Pre = ActivePresentation
    For x = Pre.Slides.Count To 1 Step -1
        Pre.Slides(x).Delete
    Next x
End Sub

mailmerge

Notas:

  1. En la cadena de conexión YOURCOMPUTERNAME tienes que reemplazarlo con el nombre del servidor SQL Server (normalmente el nombre de tu computadora).
  2. En la imagen de arriba puedes ver que la foto del empleado está repetida 4 veces, necesitas usar 4 fotos diferentes. Yo utilicé la misma foto porque soy super ocioso.
  3. Cuando la diapositiva incluye muchas formas (shapes), imágenes de fondo, líneas, recuadros, etc. Es buena idea que pongas todo el contenido estático en la diapositiva maestra (Slide Master). Y como ventaja adicional no puedes manipularlos por error puesto que no podrás seleccionar el contenido que pongas en la diapositiva maestra desde una diapositiva normal.
  4. Esto fue probado en PowerPoint 2007, 2010 y 2013.

Un pensamiento en “Combinación de Correspondencia (Mail Merge) en PowerPoint usando VBA y una base de datos SQL Server.”

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s