GENERAR ORGANIGRAMA JERÁRQUICO POR ÁREAS CON SMARTART

Hola  todos. ¿Qué tal estáis? 🙂 espero que bien!

En esta web ya llevo varios post dedicados al mundo de SmartArt en Excel, pero complementándolo con VBA. SmartArt ofrece un sensacional efecto visual y un acabado muy profesional en nuestro trabajos. Existen multitud de gráficos y cada uno tiene unas especificaciones concretas en cuanto a utilidad y fin, y eso también se aplica a VBA a la hora de programar un gráfico concreto.

Podréis ver varios ejemplos si escribís en el el buscador de la web la palabra SmartArt, tanto para generar organigramas de varios tipos, como árboles de decisión o estructuras de procesos.

Hoy quiero dedicar un post a un tipo concreto de gráfico de jerarquía, que se denomina en SmartArt como “Jerarquía de tabla”, lo podéis ver en la ficha:

generar-organigrama-jerarquico-por-areas-con-smartart4

Para realizar un ejemplo, he rescatado unos datos usados en uno de los últimos post dedicados a este tema:

generar-organigrama-jerarquico-por-areas-con-smartart2

 

Tenemos la distribución por áreas de una empresa, y necesitamos crear un gráfico que nos muestre un organigrama, empezando por las últimas áreas en la jerarquía hasta la última (Gerencia). No queremos nombres de personas, solo áreas y que se visualicen en bloques.

Para hacerlo vamos a utilizar el siguiente código:

Sub JERARQUIA_POR_AREAS()
'Declaramos variables
Dim Diseño As SmartArtLayout
Dim Shape As Excel.Shape
Dim oNodos As SmartArtNodes
Dim i As Integer, Fin As Integer
With Sheets("ESTRUCTURA")
.Select
'Eliminamos TODOS objetos en la hoja "ESTRUCTURA"
For Each Shape In .Shapes
Shape.Delete
Next
'Insertamos objeto SmartArt, en este caso "Jerarquía de tabla"
Set Diseño = Application.SmartArtLayouts("urn:microsoft.com/office/officeart/2005/8/layout/hierarchy4")
Set inserta = .Shapes.AddSmartArt(Diseño)
Set oNodos = inserta.SmartArt.AllNodes
'Verificamos número de nodos necesarios contando los ítems de la página "DATOS"
Fin = Application.CountA(Sheets("DATOS").Range("A:A"))
'Creamos nodos
Do While oNodos.Count < Fin
oNodos.Add.Promote
Loop
'Eliminamos nodos sobrantes y los nombramos con la información de la hoja "DATOS"
For i = 2 To Fin
Do While oNodos(i - 1).Level < Sheets("DATOS").Range("B" & i).Value
oNodos(i - 1).Demote
Loop
With oNodos(i - 1)
.TextFrame2.TextRange.Text = Sheets("DATOS").Range("A" & i)
End With
Next
'Eliminamos último nodo (estará vacío al tener encabezado la hoja "DATOS")
oNodos(Fin).Delete
'aplicamos estilos
For Each Shape In .Shapes
'Colores
Shape.SmartArt.Color = Application.SmartArtColors("urn:microsoft.com/office/officeart/2005/8/colors/accent2_1")
'Estilos rápidos
Shape.SmartArt.QuickStyle = Application.SmartArtQuickStyles("urn:microsoft.com/office/officeart/2005/8/quickstyle/simple2")
'Dimensionamos la imagen
With .Shapes(1)
.Height = 581.25 'Alto del objeto
.Width = 1375.5 'Ancho del objeto
.Top = 6.749921 ' Altura en la hoja
.Left = 14.25 ' A la izquierda de la hoja
End With
Next
End With
End Sub

El resultado es el siguiente:

generar-organigrama-jerarquico-por-areas-con-smartart1

Como podéis apreciar, obtenemos el efecto deseado, para este ejemplo he utilizado un estilo rápido y colores específicos, pero podéis indicar los que más os gusten, por ejemplo, con colores por cada unidad jerárquica:

generar-organigrama-jerarquico-por-areas-con-smartart3

Para obtener los ID y los nombres, podéis visitar este post: OBTENER NOMBRE E ID DE LOS DISEÑOS, COLORES Y ESTILOS RÁPIDOS DE SMARTART PARA VBA 

Otro consejo 🙂 para este ejemplo estoy utilizando una pantalla grande, es posible que deseéis cambiar el tamaño del gráfico y la posición, para hacer de una forma eficaz, utilizad la pantalla de “inmediato” de vuestro editor de VBA. Primero configurar manualmente el gráfico en la pantalla del ordenador (el aspecto y tamaño que os gustaría que tuviese) y luego, en la pantalla de inmediato, mediante estos comandos obtendréis el ancho, el largo y posición dentro de la hoja, por ejemplo, la altura que debemos indicar:

generar-organigrama-jerarquico-por-areas-con-smartart5

Y este ha sido el ejercicio de hoy. Espero que con esta macro podáis aplicar un estilo diferente a vuestro proyectos 🙂

Descarga el archivo pulsando en: GENERAR ORGANIGRAMA JERÁRQUICO POR ÁREAS CON SMARTART

 

Anuncios

ELIMINAR TODAS LAS IMÁGENES (FORMAS) DE UNA HOJA O UN LIBRO EN EXCEL CON VBA

Hace unos días recibí una consulta sobre cómo se podría modificar el tamaño de todas las imágenes de una hoja o de un libro mediante una macro.

Aunque este tema ha sido muy tratado en diferentes webs y foros de internet, me ha parecido útil escribir un post acerca del tratamiento de imágenes (o mejor, de cualquier objeto de la colección shapes).

Es decir, en Excel podemos estar trabajando con una fotografía, un organigrama de SmarArt, un gráfico o un objeto Ole, etc).  Todo ellos objetos que forman parte de la colección Shapes.

Siguiendo un caso práctico, imaginad que tenemos un libro con las siguientes formas (imágenes, autoformas, llamadas, objeto SmartArt):

eliminar-todas-las-imagenes-formas-de-una-hoja-o-un-libro-en-excel-con-vba

Dicho esto, si quisiéramos eliminar todos los objetos de la primera hoja de nuestro libro, lo haríamos así:

Sub Borrar_Hoja()
Dim Shape As Excel.Shapes
'Por cada forma en la hoja 1
For Each Shapes In Sheets(1).Shapes
' Eliminamos forma
With Shapes
.Delete
End With
Next
End Sub

Si quisiéramos eliminar todas las formas (Shapes) que existen el libro, tendríamos que utilizar la macro anterior pero dentro de un bucle for – next que recorra todas las hojas del libro:

Sub Borrar_Libro()
Dim nHoja As Integer
Dim Shape As Excel.Shapes
'Contamos las hojas del libro activo
nHoja = ActiveWorkbook.Worksheets.Count
'Inicimiamos bucle.
For i = 1 To nHoja
'En cada hoja seleccionamos todas las formas
For Each Shapes In Sheets(i).Shapes
'y las borramos
With Shapes
.Delete
End With
Next
Next i
End Sub

Sin embargo, si solo queremos eliminar un tipo de forma, tendríamos que especificar en el código el tipo que deseamos eliminar. Antes de seguir, os dejo un enlace a Microsoft donde se especifica el nombre y valor de todas las formas de la colección shapes:

https://msdn.microsoft.com/en-us/library/office/ff860759.aspx

eliminar-todas-las-imagenes-formas-de-una-hoja-o-un-libro-en-excel-con-vba1

*en el caso del valor 24, como observaréis, he modificado el Name que aparece publicado en Microsoft en el enlace de Microsoft (msoIgxGraphic) por (msoSmartArt), el motivo es que he probado el nombre msoIgxGraphic en todas las versiones desde 2010 en adelante y no funciona, pero sí lo hace con msoSmartArt.

Por lo tanto, para realizar la prueba vamos a elegir un tipo determinado de forma a eliminar, tanto en la primera hoja como en todo el libro. La elección serán las fotografías, que equivalen según el cuadro anterior a msoPicture y con valor 13.

Para eliminar las fotografías de la primera hoja, usaremos el siguiente código:

Sub Borrar_Hoja_Tipo()
Dim Shape As Excel.Shapes
'Por cada forma en la hoja 1
For Each Shapes In Sheets(1).Shapes
' Eliminamos forma
With Shapes
'Si la forma es entonces la borramos
If .Type = 13 Then
.Delete
End If
End With
Next
End Sub

Y para eliminar las fotografías en todo el libro, usaremos el siguiente:

Sub Borrar_Libro_Tipo()
Dim nHoja As Integer
Dim Shape As Excel.Shapes
'Contamos las hojas del libro activo
nHoja = ActiveWorkbook.Worksheets.Count
'Inicimiamos bucle.
For i = 1 To nHoja
'En cada hoja seleccionamos/detectamos todas las formas
For Each Shapes In Sheets(i).Shapes
With Shapes
'Si la forma es entonces la borramos
If .Type = 13 Then
.Delete
End If
End With
Next
Next i
End Sub

El resultado después de aplicar la macro sería este:

eliminar-todas-las-imagenes-formas-de-una-hoja-o-un-libro-en-excel-con-vba2

Y hemos eliminado las fotografías en todo el libro.

Evidentemente, podemos utilizar las macros para cualquier otro tipo de acción sobre las formas, como por ejemplo darle formato, colores, alto, ancho, etc … Pero para este ejemplo, nos hemos limitado a eliminar (en otros post que tengo pensado ir publicando iremos trabajando otras acciones).

En el archivo adjunto os dejo las macros. Sin embargo los botones que he dejado para ejecutarlas, solo son para los casos donde determinamos el tipo de forma a eliminar. Las macros que eliminan todas las formas de la hoja y del libro, si pusiese un botón en la hoja, directamente lo eliminaría, dado que también se trata de una forma (control de formulario).

Espero que os sea de utilidad 🙂

Descarga el archivo de ejemplo pulsando en: ELIMINAR TODAS LAS IMÁGENES DE UNA HOJA O UN LIBRO EN EXCEL CON VBA