Nube de etiquetas en Excel con VBA

Una nube de palabras es una herramienta de visualización muy importante porque nos permite mostrar gráficamente la importancia de cada palabra utilizando el tamaño de la fuente. Una palabra con una importancia muy alta tendrá un tamaño de fuente mayor que aquellas palabras de menor importancia.

Este comportamiento es muy común en los sitios Web donde, a través de una nube de palabras, podrás visualizar los temas de los cuales se ha escrito con mayor frecuencia dentro del sitio Web.

Nube de palabras en Excel

En esta ocasión pondremos a prueba nuestros conocimientos de programación para crear una nube de palabras en Excel haciendo uso del lenguaje VBA. Este será un excelente ejercicio para aprender conceptos referentes a las macros.

Datos para la nube de palabras en Excel

El objetivo de nuestro ejercicio será generar una nube de palabras basándonos en una tabla de datos que contiene solamente dos columnas, la primera columna contiene nombres de países y la segunda columna tiene el  porcentaje de habitantes de cada país en base a la población total del mundo.

Cómo hacer una nube de palabras en Excel

La lógica de la macro que vamos a crear es simple: Se leen los valores de ambas columnas y se crean 2 arreglos. El primer arreglo tendrá las palabras de la primera columna y el segundo arreglo tendrá los valores numéricos. Seleccionaremos una celda vacía e insertaremos los textos de las palabras modificando el tamaño de la fuente para cada una de ellas. El resultado de la macro sobre los datos de ejemplo es el siguiente:

Macro para hacer una nube de palabras en Excel

A continuación encontrarás el código de la macro que nos ayudará a conseguir este objetivo.

Macro para la nube de palabras en Excel

Es importante mencionar que esta macro se ejecuta sobre un rango de celdas previamente seleccionado. Si no se hace dicha selección se enviará un mensaje de error el cual está indicado en la línea 55 y que informa al usuario de la necesidad de seleccionar una tabla de datos. Otra condición necesaria para que la macro funcione correctamente es que la tabla de datos sea de dos columnas tal y como se observa en los datos de ejemplo.

La cantidad de filas que contenga la tabla de datos no importa, solo será necesario seleccionar las celdas que deseamos incluir en la creación de la nube de palabras. Una vez que hemos dejado esto en claro, te presento el código de la macro y por debajo un análisis más detallado del código.

Sub crearNubeEtiquetas()
On Error GoTo MensajeError

Dim tamano As Integer
Dim celda As Integer
Dim indice As Integer
Dim etiquetas() As String
Dim importancia()
Dim maxImportancia
Dim minImportancia
tamano = Selection.Count / 2
ReDim etiquetas(1 To tamano) As String
ReDim importancia(1 To tamano)

celda = 1
indice = 1

For Each cell In Excel.Selection
If celda Mod 2 = 1 Then
listaEtiquetas = listaEtiquetas & cell.Value & ", "
etiquetas(indice) = cell.Value
Else
importancia(indice) = Val(cell.Value)

If importancia(indice) > maxImportancia Then
maxImportancia = importancia(indice)
End If

If importancia(indice) < minImportancia Then
minImportancia = importancia(indice)
End If

indice = indice + 1
End If

celda = celda + 1
Next cell

Range("D2").Select
ActiveCell.Value = listaEtiquetas
ActiveCell.Font.Size = 8
inicio = 1

For i = 1 To tamano
With ActiveCell.Characters(Start:=inicio, Length:=Len(etiquetas(i))).Font
.Size = 6 + Math.Round((importancia(i) - minImportancia) / (maxImportancia - minImportancia) * 14, 0)
End With

inicio = inicio + Len(etiquetas(i)) + 2
Next i

Exit Sub
MensajeError:

MsgBox "Necesita seleccionar una tabla de datos.", vbCritical + vbOKOnly
End Sub

Comenzamos con la declaración de todas las variables haciendo uso de la instrucción Dim a partir de la línea 4. La variable tamaño almacenará el resultado de la división de la cantidad de celdas seleccionadas entre dos y la instrucción ReDim nos ayuda a establecer los elementos que tendrá el arreglo etiquetas y el arreglo importancia en base al valor recién obtenido en la variable tamaño.

Posteriormente asignamos el valor 1 a las variables celda e indice. La variable celda nos ayudará a saber si estamos en una celda de la columna izquierda o de la columna derecha y la variable indice nos servirá para saber la fila en la que nos encontramos y poder asignar los valores correspondientes a los arreglos.

En la línea 18 utilizamos un bucle For each para recorrer cada una de las celdas del rango previamente seleccionado. La instrucción If que tiene la condición Mod 2 = 1 es útil par saber si estamos en una celda de la columna izquierda en cuyo caso almacenamos el valor de la palabra en dos lugares: en la variable ListaEtiquetas y dentro del arreglo etiquetas.

Por el contrario, si estamos en una celda de la segunda columna, almacenaremos el valor en el arreglo importancia. Si tomamos en cuenta los datos de nuestro ejemplo, el primer elemento del arreglo etiquetas tendrá la palabra China y el primer elemento del arreglo importancia tendrá el valor 19.50, el segundo elemento del arreglo etiquetas tendrá la palabra India y el segundo elemento del arreglo importancia tendrá el valor 17.30 y así sucesivamente.

Antes de terminar el bloque Else, comparamos el valor numérico de la segunda columna con los valores que se hayan almacenado previamente para saber si es el valor máximo o el valor mínimo lo cual será de mucha utilidad posteriormente para determinar adecuadamente el tamaño de fuente para cada palabra.

En la línea 39 seleccionamos la celda D2 de nuestra hoja ya que en dicha celda crearemos la nube de etiquetas. Si lo deseas puedes elegir una celda diferente modificando esta línea de código. En esta celda colocaremos el valor de la variable listaEtiquetas, que es una lista de todas las palabras separadas por una coma. También establecemos el tamaño 8 para la fuente de la celda D2 de manera que en ese momento todas las palabras se verán del mismo tamaño.

Finalmente en la línea 44 encontrarás el bucle For responsable de cambiar el tamaño de la fuente de cada palabra contenida en la celda D2. Este bucle se ejecutará una vez por cada palabra y determinará el tamaño de la fuente que le corresponde en base a su valor en la segunda columna y al valor máximo registrado en la tabla.

Puedes ver que la propiedad modificada es Font.Size, pero el cambio de tamaño de la fuente no se hace sobre toda la celda sino que se aplica solamente sobre los caracteres definidos por el método ActiveCell.Characters el cual se encarga de seleccionar una sola palabra a la vez para cada ciclo del bucle For. Es así como al terminar este bucle se habrá creado la nube de palabras dentro de la celda D2.

Te invito a descargar el archivo de trabajo que he utilizado en la creación de este artículo para que pruebes la macro por ti mismo. La mejor manera de incrementar tus habilidades de programación es practicando una y otra vez, así que te recomiendo descargar el archivo y practicar con la creación de nubes de palabras en Excel con VBA.