Rango de gráfico por macro

He terminado de diseñar un proyecto sobre ratios mensuales y su representación en un gráfico. Lo único que se me está escapando es la posibilidad de modificar el rango de las series del gráfico. Tengo la siguientes series de datos:
Ene-02 Feb-02 ... Dic-02 Ene-03.
Ratio 1
Ratio 2
Ratio 3
...
Ratio 9
El usuario selecciona el período que desea representar en el gráfico, de forma que cuando lo selecciona, se copia como datos valor en la hoja del gráfico.
Lo que estoy haciendo en estos momentos es que el usuario desproteja la hoja y cambie manualmente el rango a representar, con el consiguiente peligro de borrado de datos accidentales.
¿Se puede controlar de alguna forma el rango que se va a representar en el gráfico?
He consultado algunos manuales y libros, pero no he sacado nada en claro.
Si te sirve de algo, he conseguido que mediante un MsgBox informar al usuario del rango válido de representación que debe marcar (lo he hecho verificando las columnas del copiado de los datos como valor que contenían como nombre de la columna el nombre del mes-año).
Gracias por tu colaboración. Si necesitas alguna aclaración más házmelo saber. Puedo hacer llegar el código que ya poseo. También me gustaría aclararte que no me importaría replantear el proyecto en la parte concerniente a la repersentación del gráfico con tal de poder automatizar el rango a representar.
César

1 respuesta

Respuesta
1
El concepto esencial para resolver tu planteo es que MS Excel NO gráfica lo que NO vé.
Aprovechando esta situación, sugiero crear un solo gráfico que incluya todas las series (mes-año).
Luego, en la hoja el usuario indica qué serie le interesa ver.
Una macro, ocultará las columnas de los períodos que estén fuera del indicado, por ejemplo en un rango llamado A_ini
Esta debería ser algo así como:
Range("C4").Select ' donde está la primera fecha
Do Until IsEmpty(ActiveCell)
If ActiveCell.Value <> Range("A_ini").Value Then
ActiveCell.EntireColumn.Hidden = True
End If
ActiveCell.Offset(0, 1).Select
Loop
---
Sobre la misma idea, existe una alternativa, para lo cual deberías "rotar" tu cuadro, es decir: lo que son
títulos de columnas (fechas) pasaría a ser filas y los que son filas se mostrarían en columnas.
A tal matriz, le aplicas un filtro automático y, también, al seleccionar una fecha determinada ocultará el resto y el gráfico sólo representará lo que esté visible.
Espeor que esto te ayude
Ojalá te satisfaga.
Un abrazo!
Fernando
Fernando:
He estudiado la solución que planteas. He renombrado el rango que contiene las series en todos los períodos por "A_ini" (D46:DS46). Este rango presenta en su primera fila los meses-años (ENE-02, FEB-02,..., DIC-11) y en el resto de filas presentan las series o ratios para cada uno de los períodos (Ratio 1,..., Ratio 12). Entonces lo que pretendo es que, tal y como tú dices, ocultar las columnas que no estén dentro del intervalo seleccionado.
He incorporado el código de tu macro y al ejecutarla (junto con el resto del código) aparece un error "No coinciden los tipos". He ido a la ayuda y la verdad es que estoy bastante perdido. Se que es un error en la asignación del tipo de variable, pero esto para mí ya cae fuera de mis posibilidades. Para facilitarte un poco la labor, me gustaría poder enviarte el código fuente que se ejecuta:
Sub Actualizar_Gráfico()
Dim rangotot As Variant
Dim rangototal As Variant
' DESPROTECCIÓN DE LA PESTAÑA DEL GRÁFICO
ActiveSheet.Unprotect "35314479"
' COPIADO DE DATOS VALOR DE LOS DATOS PARAMETRIZADOS
Sheets("GRÁFICOS RDO.").Select
Range("D46:BS58").Clear
Sheets("GRÁFICOS PARÁMETROS ").Select
Range("H24").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy
Sheets("GRÁFICOS RDO.").Select
Range("D46").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
With Selection.Font
.Name = "Tahoma"
.Size = 8
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
' ESTABLECIMIENTO DEL RANGO DE DATOS PARA LA SELECCIÓN REALIZADA.
Range("C46").Select 'donde está la primera fecha
Do Until IsEmpty(ActiveCell)
If ActiveCell.Value <> Range("A_ini").Value Then
ActiveCell.EntireColumn.Hidden = True
End If
ActiveCell.Offset(0, 1).Select
Loop
rangototal = Worksheets("GRÁFICOS RDO.").Range("H65").Value
'x = MsgBox("El rango que debe poner es " & rangototal, vbCritical, "PRUEBA")
'Exit Sub
' FORMATEO DE TITULOS A INCLUIR EN EL GRÁFICO
ActiveSheet.ChartObjects("Gráfico 4").Activate
ActiveChart.ChartArea.Select
'ActiveChart.SetSourceData Source:=Sheets("GRÁFICOS RDO.").Range(rangototal), PlotBy:= _
xlRows
x = MsgBox("El rango que debe poner es " & rangototal, vbCritical, "PRUEBA")
With ActiveChart
.HasTitle = True
.HasLegend = True
.ChartTitle.Text = "EVOLUCIÓN DE RATIOS - " & Range("a1").Value & "" & Chr(13) & _
"INTERVALO: " & Range("A2").Value & " a " & Range("A3") & Chr(13) & _
"DATOS " & Range("A4") & "ES"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = " . INTERVALOS " & Range("A4") & "ES ."
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = ". DIAS ."
.Axes(xlValue, xlSecondary).HasTitle = True
.Axes(xlValue, xlSecondary).AxisTitle.Characters.Text = ". % ."
End With
' PROTECCIÓN DE LA PESTAÑA DEL GRÁFICO
ActiveSheet.Protect "35314479"
End Sub
No te fijes mucho en las instrucciones (muchas de ellas las he obtenido del grabador de macros). Sé que se podría depurar más pero no me atrevo a tocarlo.
Gracias por tu valioso tiempo.
Un abrazo.
César
Hasta donde puedo apreciar, el problema parece estar en la definición del rango "A_ini". Este debe ser una única celda (no los títulos de tus columnas) donde se guarda la fecha que se desea graficar.
Luego la macro va a la primer celda con fechas (y asegúrate de que sean efectivamente fechas y no textos que parezcan fechas), supuestamente -según veo- sería la C46 (¿o debería ser la D46?) Realizando una comparación de cada fecha con la que quedó guardada en A_ini. Si difieren la macro oculta la columna activa y así hasta revisar todas, debiendo quedar una única columna visible (la que coincida con la fecha de A_ini) cual será la que el gráfico muestre.
Intenta con estas consideraciones y coméntame el resultado.
Un abrazo!
Fernando
Hola fernando:
Ahora he entendido tu planteamiento. Sé que me estoy alargando un poco y perdona que abuse de tu tiempo. Solamente me queda aclararte que no solamente quiero representar en el gráfico un período o una fecha (Ej: ENE-03), sino un conjunto de ellos. En otra pestaña del libro de excel, el usuario hace una selección:
INTERVALO: (mensual, bimensual, trimestral,.., anual)
MES INICIO: (enero,.., diciembre)
MES FINAL: (enero,.., diciembre)
AÑO INICIO: (2002,..., 2011)
AÑO FINAL: (2002,.., 2011)
Con estos parámetros, se representan los datos en la tabla de ratios a incluir en el gráfico. Por lo tanto podría ser que quiera representar lo siguiente:
INTERVALO: Bimensual
MES INICIO: Enero MES FINAL: Diciembr
Año inicio: 2002 año final: 2002
Los datos que aparecen en la tabla son (por columnas):
ENE-02, MAR-02, ..., OCT-02, DIC-02
En total se representan en la tabla los datos de 6 períodos.
Pero si la selección es:
INTERVALO: Mensual
MES INICIO: Enero MES FINAL: Diciembr
Año inicio: 2002 año final: 2002
Los datos que aparecen en la tabla son (por columnas):
ENE-02, FEB-02, ..., NOV-02, DIC-02
Por lo tanto generalmente se representarán varios períodos, en función de la solicitud hecha por el usuario.
No se si me he explicado lo suficiente.
Gracias de nuevo por tu tiempo.
Un abrazo.
César
Para el caso de pretender un gráfico que muestre más de un período, necesitarás también una celda que indique el final del lapso a graficar.
Supongamos que tal celda se llama "A_fin", donde indicarás una fecha que será la última del período a mostrar.
Nuevamente, insisto en la recomendación de que en todos los casos se trate de *fechas*.
Así A_ini debería tener una fórmula que arme la fecha inicial del período a partir de la selección que hagas en MES INICIO y AÑO INICIO, algo así como esto:
=FECHA(<Año>,<Mes>,1)
Donde <Año> es la celda donde está AÑO INICIO y <Mes> es donde está MES INICIO.
Así siempre tendrás la fecha a comienzo de mes.
Otro tanto debería pasar en A_fin, es decir una fórmula que arme la fecha hasta la cual considerar.
Obviamente las fechas encabezado de columnas también deberás estar referidas al principio de cada mes aunque puedes darle *formato* mes-año.
Una vez establecidos los límites del período en tales celdas, bastará que modifiques la línea del condicional en la macro para que considere ambos límites al momento de decidir si debe ocultar o no cada columna.
Esto es, donde dice:
If ActiveCell.Value < Range("A_ini").Value Then
reeplázalo por:
If ActiveCell.Value < Range("A_ini").Value Or ActiveCell.Value > Range("A_fin").Value Then
----
Tal vez hayas notado que, hasta ahora, no hice mención al INTERVALO, que mencionaste recién en tu última pregunta...
Aprovecho aquí la misma frase conque comencé mi primera respuesta:
El concepto esencial para resolver tu planteo es que MS Excel NO gráfica lo que NO vé
Por lo tanto, para graficar intervalos, los datos consolidados deberán existir *físicamente* en tu archivo.
Es decir: deberá haber una matriz con los valores mensuales, otra con los bimestrales, otra con los trimestrales y así sucesivamente.
La macro dada seguirá siendo válida también para estas planillas, en tanto y en cuanto, designes cada uno de esos períodos con la fecha del primer mes del período.
Desde luego tendrás "baches" entre fechas para cuando la tabla del INTERVALO no fuese Mensual, pero como la macro considera las fechas mayores que la inicial o menores que la final, esto no debería ser problema.
Considero que esta es la única forma de resolver el problema de los agrupamientos por intervalos.
Espero haberte ayudado.
Un abrazo!
Fernando
Probaré esta solución. Muchísimas gracias por tu ayuda y la claridad en las explicaciones, Fernando.
Un abrazo y hasta pronto.
www.porloschicos.com
César

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas