Está en la página 1de 8

Mis macros de Powerpoint favoritas

19/12/2018

Cuando pasas 20 años pegada a Microsoft Office, terminas


aprendiendo Visual Basic para poder crear tus propias macros y así
ahorrar tiempo y esfuerzo. Aquí os comparto las que más uso en mi
día a día.
Cambiar el idioma de toda la ppt
Si tienes una plantilla en inglés y tienes que hacer la presentación en
español, o viceversa, o simplemente te salen rayitas rojas en todas las
páginas porque está cogiendo un idioma que no tienes instalado,
simplemente descomenta el idioma en el que estés trabajando y
problema solucionado.

'
----------------------------------------------------------------------
----------
' Pone todos los placeholders con el idioma que se le indique en la
variable idioma
'
----------------------------------------------------------------------
----------
Sub LangInFrames()

Dim ColCount As Integer


Dim RowCount As Integer
Dim sh As Integer
Dim filas, columnas As Integer
Dim idioma As String

' elegir un idioma descomentando el que se quiera

' español
' idioma = msoLanguageIDSpanish

' inglés
' idioma = msoLanguageIDEnglishUK

' francés
' idioma = msoLanguageIDFrench

' más idiomas en https://docs.microsoft.com/en-


us/dotnet/api/microsoft.office.core.msolanguageid?
redirectedfrom=MSDN&view=office-pia

' no tocar nada más

' idioma por defecto


ActivePresentation.DefaultLanguageID = idioma
scount = ActivePresentation.Slides.Count

For j = 1 To scount
fcount = ActivePresentation.Slides(j).Shapes.Count

For k = 1 To fcount

' cajas de texto


If ActivePresentation.Slides(j).Shapes(k).HasTextFrame
Then

ActivePresentation.Slides(j).Shapes(k).TextFrame.TextRange.LanguageID
= idioma
End If

' tablas
If ActivePresentation.Slides(j).Shapes(k).HasTable =
True Then
For sh = 1 To fcount

ColCount =
ActivePresentation.Slides(j).Shapes(k).Table.Columns.Count
RowCount =
ActivePresentation.Slides(j).Shapes(k).Table.Rows.Count

For columnas = 1 To ColCount


For filas = 1 To RowCount

ActivePresentation.Slides(j).Shapes(k).Table.Cell(filas,
columnas).Shape.TextFrame.TextRange.LanguageID = idioma
Next
Next
Next
End If

Next k
Next j

End Sub

Cambiar las fuentes de toda la ppt


Si quieres cambiar todos los textos a una fuente concreta, puedes ir caja por
caja cambiándolos, o puedes usar esta macro, que automáticamente cambia
todo a la fuente que le indiquemos.
'
----------------------------------------------------------------------
----------
' Pone todos los textos con la fuente que le digamos en la variable
fuente.
'
----------------------------------------------------------------------
----------

Sub FuentesIguales()
Dim ColCount As Integer
Dim RowCount As Integer
Dim sh As Integer
Dim filas, columnas As Integer
Dim idioma As String

' cambiar la variable fuente a la tipografía que queramos


fuente = "Helvetica"

' para todas las slides

scount = ActivePresentation.Slides.Count

For j = 1 To scount
fcount = ActivePresentation.Slides(j).Shapes.Count

For k = 1 To fcount

' cajas de texto


If ActivePresentation.Slides(j).Shapes(k).HasTextFrame
Then

ActivePresentation.Slides(j).Shapes(k).TextFrame.TextRange.Font.Name =
fuente
End If

' tablas
If ActivePresentation.Slides(j).Shapes(k).HasTable =
True Then
For sh = 1 To fcount

ColCount =
ActivePresentation.Slides(j).Shapes(k).Table.Columns.Count
RowCount =
ActivePresentation.Slides(j).Shapes(k).Table.Rows.Count

For columnas = 1 To ColCount


For filas = 1 To RowCount

ActivePresentation.Slides(j).Shapes(k).Table.Cell(filas,
columnas).Shape.TextFrame.TextRange.Font.Name = fuente
Next
Next
Next
End If

Next k
Next j

End Sub

Reemplazar fuentes
Si tienes algunos textos en una fuentes, y quieres cambiarlos a otra (por
ejemplo, pasar de Arial a Helvética), usa esta macro indicando la fuente antigua
y la fuente nueva.

Sub Reemplazar_Fuentes()
Dim ColCount As Integer
Dim RowCount As Integer
Dim sh As Integer
Dim filas, columnas As Integer
Dim fuente_vieja As String
Dim fuente_nueva As String

' cambiar las variable fuente_vieja y fuente_nueva a las tipografías


que queramos

fuente_vieja = "Arial"
fuente_nueva = "Helvetica"

' para todas las slides

scount = ActivePresentation.Slides.Count

For j = 1 To scount
fcount = ActivePresentation.Slides(j).Shapes.Count

For k = 1 To fcount

' cajas de texto


If ActivePresentation.Slides(j).Shapes(k).HasTextFrame
Then
If
ActivePresentation.Slides(j).Shapes(k).TextFrame.TextRange.Font.Name =
fuente_vieja Then

ActivePresentation.Slides(j).Shapes(k).TextFrame.TextRange.Font.Name =
fuente_nueva
End If
End If

' tablas
If ActivePresentation.Slides(j).Shapes(k).HasTable =
True Then
For sh = 1 To fcount

ColCount =
ActivePresentation.Slides(j).Shapes(k).Table.Columns.Count
RowCount =
ActivePresentation.Slides(j).Shapes(k).Table.Rows.Count

For columnas = 1 To ColCount


For filas = 1 To RowCount

If
ActivePresentation.Slides(j).Shapes(k).Table.Cell(filas,
columnas).Shape.TextFrame.TextRange.Font.Name = fuente_vieja Then

ActivePresentation.Slides(j).Shapes(k).Table.Cell(filas,
columnas).Shape.TextFrame.TextRange.Font.Name = fuente_nueva
End If

Next
Next
Next
End If

Next k
Next j
End Sub

Cambiar el color de todos los textos


Similar a la anterior macro, puedes personalizar los textos de tu presentación
con un color concreto. Solamente indica el código RGB del color y ejecuta la
macro.
'
----------------------------------------------------------------------
----------
' Pone todos los textos con el color de la variable colorfuente
'
----------------------------------------------------------------------
----------

Sub ColorFontizer()
Dim ColCount As Integer
Dim RowCount As Integer
Dim sh As Integer
Dim filas, columnas As Integer
Dim idioma As String

' indica el color que quieras en la siguiente variable. Todos los


códigos en https://htmlcolorcodes.com/es/
colorfuente = RGB(0, 0, 0)

scount = ActivePresentation.Slides.Count

For j = 1 To scount
fcount = ActivePresentation.Slides(j).Shapes.Count

For k = 1 To fcount

' cajas de texto


If ActivePresentation.Slides(j).Shapes(k).HasTextFrame
Then

ActivePresentation.Slides(j).Shapes(k).TextFrame.TextRange.Font.Color.
RGB = colorfuente
End If

' tablas
If ActivePresentation.Slides(j).Shapes(k).HasTable =
True Then
For sh = 1 To fcount

ColCount =
ActivePresentation.Slides(j).Shapes(k).Table.Columns.Count
RowCount =
ActivePresentation.Slides(j).Shapes(k).Table.Rows.Count

For columnas = 1 To ColCount


For filas = 1 To RowCount

ActivePresentation.Slides(j).Shapes(k).Table.Cell(filas,
columnas).Shape.TextFrame.TextRange.Font.Color.RGB = colorfuente
Next
Next
Next
End If

Next k
Next j

Índice de la presentación
Si quieres hacer una slide con los títulos del resto de slides, esta macro te
ahorrará el tedioso trabajo de revisarlas una por una, y además te genera un
enlace directo a cada slide.
----------------------------------------------------------------------
----------
' Hace una slide en la que te pone un índice con sus enlaces
'
----------------------------------------------------------------------
----------

Sub AgendaLinks()

Dim oSld As Slide


Dim oShp As Shape
Dim oAgenda As TextRange
Dim x As Integer

' Añade un slide al inicio de la presentación

ActivePresentation.Slides.Add 1, ppLayoutText

With ActivePresentation.Slides(1)
.Shapes(1).TextFrame.TextRange = "Índice"
Set oAgenda = .Shapes(2).TextFrame.TextRange
End With

oAgenda = ""

' por cada slide


For Each oSld In ActivePresentation.Slides

' saca el titulo


If oSld.Shapes.HasTitle Then
Set oShp = oSld.Shapes.Title
If oShp.TextFrame.TextRange.Text = "" Then
oAgenda = oAgenda & "Slide " & oSld.SlideIndex & Chr(13)
Else
oAgenda = oAgenda & oShp.TextFrame.TextRange.Text & Chr(13)
End If
Else
oAgenda = oAgenda & "Slide " & oSld.SlideIndex & Chr(13)
End If

Next oSld

' Añade enlace


For x = 1 To oAgenda.Sentences.Count
Set oSld = ActivePresentation.Slides(x)
With
oAgenda.Sentences(x).ActionSettings(ppMouseClick).Hyperlink
.Address = ""
.SubAddress = oSld.SlideID & "," & oSld.SlideIndex & "," &
oAgenda.Sentences(x).Text
End With
Next x

' Borra la primera porque es la del índice que hemos creado


oAgenda.Sentences(1).Delete

End Sub

Una slide con todo el texto de la ppt


Muy útil para hacer un resumen o para traspasar todo el contenido a otro
formato de documento (por ejemplo, un Word).

'
----------------------------------------------------------------------
----------
' Hace una slide en la que pone todo el texto de la powerpoint
'
----------------------------------------------------------------------
----------

Sub Resumen()

Dim oSld As Slide


Dim oShp As Shape
Dim oAgenda As TextRange
Dim x As Integer

' Añadimos una slide más al principio

ActivePresentation.Slides.Add 1, ppLayoutText

With ActivePresentation.Slides(1)
.Shapes(1).TextFrame.TextRange = ""
Set oAgenda = .Shapes(2).TextFrame.TextRange
End With

' La rellenamos con los textos de todos los placeholders de las


otras slides

oAgenda = ""

scount = ActivePresentation.Slides.Count
For j = 1 To scount
fcount = ActivePresentation.Slides(j).Shapes.Count
For k = 1 To fcount
If ActivePresentation.Slides(j).Shapes(k).HasTextFrame
Then
oAgenda = oAgenda &
ActivePresentation.Slides(j).Shapes(k).TextFrame.TextRange.Text &
Chr(13)
End If
Next k
Next j
End Sub

Bola extra: Una barra de progreso de tamaño ajustable a cada página


Esta macro la tenía perdida, así que he tenido que volver a generarla. En
realidad, si miras el código, es muy simple. Se compone de una ppt y una
macro. La ppt está vacía, a excepción de una pequeña barrita situada en la
parte inferior. Ese recuadro se llama “_barra_progreso”. Cópialo en la primera
slide de tu ppt y dale el formato (color, grosor, posición…) que se ajuste a tu
diseño. Al ejecutar la macro se copiará la barrita en todas las slides de tu
presentación y luego se redimensionará gradualmente según el número de
páginas.

Macro barrita de progreso :


Sub BarraProgreso()

'contar el numero de slides


scount = ActivePresentation.Slides.Count

' copia la barra de las slide 1 al resto de slides


ActivePresentation.Slides(1).Shapes("_barra_progreso").Copy
For j = 2 To scount
ActivePresentation.Slides(j).Shapes.Paste
Next j

'tamaño de la página
ancho = Application.ActivePresentation.PageSetup.SlideWidth

' tamaño minimo


minimo = ancho / scount

'tamaño de la barrita por cada slide

For j = 1 To scount
ActivePresentation.Slides(j).Shapes("_barra_progreso").Width =
minimo * j
Next j

End Sub

Nota adicional
Ojo a lo disfuncional que es que un usuario tenga que programar estas
funcionalidades, que debería traer el programa por sí mismo o mediante
sencillos plug-ins (tipo WordPress).