Consulta perfecta para un fin de semana. Estoy esperando que mi señora vuelva de la peluquería para luego ir al centro y (como no podría ser de otra forma) comprar un buen regalo para el día de la Madre. Ja, 4 hijas y con todo lo que ello implica, me voy a tener que jugar en serio.
Así que durante esta (eterna) espera de una mujer en la peluquería, voy armando la presente entrada, la cual se basa en el siguiente planteamiento (mas o menos): "como hago para dibujar un mapa en Excel que sea el reflejo de las provincias de un país, para luego colocarle las ventas que realicé en cada una de ellas?".
Diseñé un "país básico" de solo 4 provincias, con la herramienta "Autoformas" (menú Insertar / Imagen / Autoformas).
Básico, pero funciona para el ejemplo.
[+/-] Ver el resto / OcultarPara dibujar "el país" utilicé la herramienta "forma libre", que permite ir dibujando la forma a nuestro antojo, como habitualmente lo hacemos con los programas editores de imágenes.
He visto trabajos realmente artísticos con esta herramienta y las que se encuentran al lado ("curva" y "a mano alzada"), llegando a reproducir paisajes o fotografías humanas. El secreto principal (que se aplica a este proyecto también) es importar la foto a Excel y luego ir "escribiendo" arriba el mapa y así generar las autoformas de manera idéntica a las provincias del país en cuestión. O sea: a la imagen que traemos a Excel (un mapa en este caso) lo usamos como "papel de calcar", luego lo eliminamos y nos quedan las autoformas creadas, con el mismo contorno de la imagen original.
Pero volvamos al trabajo y a las distintas consideraciones a tener en cuenta para realizar esta tarea.
A cada una de las provincias que dibujé les coloqué un nombre distintivo, desde el "cuadro de nombres":
de esta forma tengo a: prov-1, prov-2, prov-3 y prov-4. Cada lector podrá darle el nombre que le sea necesario.
Ahora bien, verán que arriba de la "prov-1" existe una leyenda, que refleja el nombre de la provincia, el total vendido y el porcentaje que tiene esa venta sobre el total a nivel país.
Diseñé una tabla con dichos datos:
en cada fila se encuentra el nombre de la provincia (y por cada una de ellas, recordemos, tengo la respectiva autoforma), con las ventas y el porcentaje. Al rango coloreado de gris le dí el nombre "listado", para recorrerlo mas fácilmente con una macro, como veremos mas adelante.
Ahora nuestra macro deberá relacionar esa tabla con cada una de las etiquetas que coloqué sobre las provincias. Un pseudocódigo aproximado sería:
1) Recorrer las provincias del rango "listado" (el que está coloreado de gris en la tabla")
2) Tomar el nombre, venta y porcentaje de la provincia y colocarlo en la respectiva etiqueta.
3) Listo, se terminó el rollo.
Una consideración mas: cada Shape es un objeto, al cual le deberemos otorgar un nombre unívoco, a los fines de localizarlo posteriormente sin dificultad.
Cada etiqueta se llama: textoprov-1, textoprov-2, textoprov-3 y textoprov-4, asignados desde el cuadro de nombres. (primero seleccionamos la etiqueta en cuestión y luego le damos nombre ingresándolo en el cuadro)
Veremos que esta forma de trabajo nos ahorrará muchos problemas.
La mencionada etiqueta la saqué de la "barra de herramientas de formularios", como se ve en esta imagen:
Siguamos. El código es este:
Sub AsignarValores() 'variables de uso local Dim Celda As Range Dim Provincia As String Dim Fila As Byte 'desprotejo la hoja ActiveSheet.Unprotect Password:="elquesea" 'recorro las provincias que están en la tabla For Each Celda In Range("listado").Cells Provincia = Celda.Value 'tomo el nombre de la provincia Fila = Celda.Row 'y la fila en la que se encuentra 'para identificar correctamente a cada etiqueta, armo el 'nombre, concatenando la palabra "texto" y el nombre de 'la provincia que se encuentra en la celda: ActiveSheet.Shapes("texto" & Provincia).Select 'aqui armo la información y la coloco en la etiqueta: Selection.Characters.Text = Provincia _ & vbNewLine _ & "Vtas: " & Cells(Fila, "I") / 1000 _ & vbNewLine _ & "%: " & Format(Cells(Fila, "J"), "#,##0.00") Next Celda 'y la vuelvo a proteger: ActiveSheet.Protect Password:="elquesea" [g1].Select 'destruyo el objeto, para liberar recursos: Set Celda = Nothing End Sub
La cuestión ahora es: ¿donde ejecuto esa macro? Se me ocurre que en dos eventos: al abrir el libro y cada vez que el usuario cambie algún importe de la columna ventas, así automáticamente queda reflejado en las provincias respectivas. Entonces:
Private Sub Workbook_Open() AsignarValores End Sub
Y en la hoja donde tenemos el mapa:
Private Sub Worksheet_Change(ByVal Target As Range) 'si el cambio se produjo en alguna celda del rango "ventas" 'llamo a la macro para que actualice los valores en el mapa: If Not Intersect(Target, Range("ventas")) Is Nothing Then AsignarValores End If End Sub
Habrán visto que dentro del sub AsignarValores desprotejo y protejo la hoja, con el objetivo de evitar que los usuarios puedan alterar el mapa (colores, formas, valores, etc, etc, etc). La única consideración a tener en cuenta es que desbloqueo el rango "ventas", únicas celdas que el usuario podrá cambiar.
Si asigno nuevos valores:
todo se actualizó automaticamente.
Otras consideraciones: si utilizamos Excel 2007 / 2010 las ventajas gráficas que obtendremos son, sencillamente, enormes. Tanto las autoformas como el texto soportan millones de colores, sombras, efectos 3D... pero solo serán visibles si abren el archivo en dichas versiones, caso contrario deberíamos crear dos hojas: una para el Excel "viejo" y otra para el "nuevo", mostrando la que corresponda.
Si aplican lo visto en la entrada sobre leer datos desde la web, será factible que la tabla tome datos de un sitio, con todas las ventajas que ello implica.
Una idea mas al respecto: ahora vimos el tema "mapas", pero noten que de idéntica forma podemos armar proyectos para (por ejemplo) una empresa de transportes, en donde crearíamos un colectivo y sus asientos con las autoformas, coloreando las plazas vendidas. O también para un consultorio odontológico, en donde no nos traería mayores problemas crear el detalle de las piezas dentales con autoformas. Es mas trabajo, pero le imprime mucho profesionalismo y se vende de otra forma: mejor.... y mas caro. jajaja.
Un abrazo y aquí les dejo el link al archivo.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
insertar filtros ocultos
ResponderEliminarno comprendo tu comentario o pregunta ¿podrías ampliarlo/a?
ResponderEliminarexcelente!!!!!!!!!
ResponderEliminaruna consulta: al final de cada linea me aparece un caracter cuadrado que no quiero que aparezca
Estas usando algun retorno de linea o carro? (tipo vbNewLine o vbCrlf)?
ResponderEliminarSi es asi quitalo o bien podes colocar toda la cadena dentro de la función Trim() para eliminar espacios al principio y final de la cadena.
Avisame y gracias x tu mensaje.
hola un gusto saludarte quisera tu ayuda quisiera un codigo algo parecido al que publicaste en http://damianexcel.blogspot.com/2011/10/crear-mapas-en-excel-y-colocar-valores.html
ResponderEliminares para resultado de ecuaciones digamos que tengo un valor 30 wn la celda I3 quisiera que en un cuadro de texto llamado h. aparesca H=30 y si cambia el valor de la celda a 40 por ejemplo en el cuadro de texto me aparesca H=40
esperare atentamente tu respuesta ...gracias por leer este mensaje
mario:
ResponderEliminarpara hacer las cosas sencillas (ya que vincular autoformas a celdas tiene sus bemoles, aunque no lo parezca) utilizaría una celda auxiliar.
Como dices, supongamos que en A1 tenes el resultado de tu ecuación.
Entonces, en otra celda (ej: B1) colocas lo siguiente:
="=H"&A1
Sigamos. Si en A1 tenes 30 e hiciste como te dije, en B1 te aparecerá "=H30", o sea que concatenamos: el signo igual, la letra H y el valor de A1... todo en B1-
Ahora insertas una shape, la seleccionas y en la barra de fórmulas colocas:
=B1
Listo, al cambiar el valor de A1 se modificará B1 y, a su vez, dicho resultado aparecerá dentro de la shape.
Suerte y cualquier cosa me avisas.
existe alguna posibilidad de ademas de colocarle los valores a las shapes, se les pueda cambiar el color, de acuerdo a determinados parametros??
ResponderEliminarhola que alegria que me respondas pero con tu codigo me saldria una hoja mas limpia te pediria por favor que me puedas ayudar me seria de utilidad ..esperare atentamente tu respuesta
ResponderEliminarSi. El código sería el siguiente, por ej:
ResponderEliminarIf LaVariable = 1 Then
ActiveSheet.Shapes("Rectangle 1").Select
Selection.ShapeRange.Fill.ForeColor.SchemeColor = 10
Selection.ShapeRange.Fill.Visible = msoTrue
Selection.ShapeRange.Fill.Solid
Else
ActiveSheet.Shapes("Rectangle 2").Select
Selection.ShapeRange.Fill.ForeColor.SchemeColor = 8
Selection.ShapeRange.Fill.Visible = msoTrue
Selection.ShapeRange.Fill.Solid
End If
El "schemecolor" es quien define el color de cada figura. el 10 es rojo, el 8 negro. Podes ir probando distintos nros hasta dar con los que necesites.
Mario: no comprendo tu último mensaje.
ResponderEliminar