Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Cotas parametrizables en grafico (2)

88 views
Skip to first unread message

jsi...@indaltec.com

unread,
Jul 23, 2004, 10:02:25 AM7/23/04
to
Amigos foreros:
 
Hace un tiempo (Oct-2003) habia planteado un tema, que era el de poder modificar los valores de escala de un grafico, mediante valores de celdas. Recibí la amable respuesta del amigo Héctor Miguel, pero me pareció algo críptico. El amigo Fernando Arroyo habia planteado una solucion más accesible a mi nivel de conocimientos un tiempo atras (May-2003), sin que yo lo hubiera notado. La solucion era usar codigo VBA:
 
    With Worksheets("Hoja1").ChartObjects(1).Chart.Axes(xlValue)
        .MinimumScale = 5
        .MaximumScale = 20
    End With
Lo modifique para adaptarlo a mi planilla:
 
Tengo una hoja, que se llama Parámetros, donde tengo los parametros para generar el grafico, y una hoja llamada Gráfico, que es el grafico en cuestion.
 
Los parametros para generar el grafico son:
 
    Serie de datos:        =Parámetros!$B$13:$B$xx    donde xx es el valor Parámetros!$B$3
    Escala:
        Mínimo:            =Parámetros!$B$11
        Máximo:            =Parámetros!$B$10
        Unidad mayor:      =Parámetros!$B$9
        Unidad menor:      =Parámetros!$B$9
        Eje (X) cruza en:  =Parámetros!$B$8
 
La parte de la serie la venia haciendo a mano, pero intente programar la parte de las escalas, mediante lo siguiente
 
    With Worksheets("Gráfico").ChartObjects("Gráfico").Chart.Axes(xlValue)
       
        .MinimumScale = Worksheets("Parámetros").Range("B11").Value
        .MaximumScale = Worksheets("Parámetros").Range("B10").Value
        .MajorUnit = Worksheets("Parámetros").Range("B9").Value
        .MinorUnit = Worksheets("Parámetros").Range("B9").Value
        .Select
            Selection.CrossesAt = Worksheets("Parámetros").Range("B8").Value
       
    End With
 
Pero este codigo genera el error:
 
    Se ha producido el error '9' en tiempo de ejecución:
    Subíndice fuera del intervalo
 
Donde me estoy equivocando? Desde ya, gracias... totales!
 
Julio.
 
"Acabemos con Sócrates, estoy harto de este invento de que no saber nada es un signo de sabiduría." (Isaac Asimov)
 

Héctor Miguel

unread,
Jul 24, 2004, 1:16:48 AM7/24/04
to
hola, Julio !

> Tengo una hoja, que se llama Parámetros, donde tengo los parametros para generar el grafico

> y una hoja llamada Gráfico, que es el grafico en cuestion [...]
> ... intente programar la parte de las escalas, mediante lo siguiente
> With Worksheets("Gráfico").ChartObjects("Gráfico").Chart.Axes(xlValue) [...]
> ... este codigo genera el error: ... '9' en tiempo de ejecución: Subíndice fuera del intervalo
> Donde me estoy equivocando?

=> un error '9' significa que el codigo 'trata' de tener acceso a un objeto =>que NO 'existe'<= :((
la razon???...
1.- mencionas que tienes una hoja de calculo Y una hoja de graficos
[o... ¿es 'otra' =>hoja de calculo<= con -solamente- el grafico 'incrustado'???
[suponiendo que es una =>hoja de graficos<=... el codigo 'fallara' debido a que...]
2.- en el bloque [With]... le estas indicando que:
- en una hoja de calculo => With Worksheets( ...<=
- 'tienes' un grafico 'incrustado' =>... .ChartObjects( ...<=
3.- [si la suposicion es 'correcta' y se trata de una hoja de graficos...]
=>cambia la referencia al objeto 'principal' en el bloque... de hoja de calculo, a hoja de graficos [p.e.]
With Charts("Gráfico").Axes(xlValue)
4.- [dicho sea 'de paso'...] si NO esta 'activa/seleccionada' la hoja de graficos...
=>NO uses el metodo 'Select'<= [mandaria un error '1004'] :(
usa 'directamente' la propiedad '.CrossesAt' =>igual que usas las otras propiedades<= ;)

si mis 'suposiciones' no son 'acertadas'... ¿comentas datos adicionales?
saludos,
hector.

p.d. dicho sea [tambien] 'de paso...'
con las 'adapatciones' que estas haciendo al codigo...
se esta 'pareciendo' [cada vez mas] a la 'criptica' propuesta que te hice en aquella ocasion
[a donde -creo que- 'vas a llegar', si persiste la intencion 'original' de =>automatizar<= el asunto]
y... [cada vez mas] se esta 'alejando' de la 'accesible' solucion [que has ido adaptando] ;)

jsi...@indaltec.com

unread,
Jul 23, 2004, 3:03:49 PM7/23/04
to
Me respondo a mi mismo!
 
    Charts("Gráfico").SetSourceData Source:=Worksheets("Parámetros").Range _
    ("B13:B" & Worksheets("Parámetros").Range("B2").Value + 12), _
                      PlotBy:=xlColumns
 
    With Charts("Gráfico").Axes(xlValue)
       
        .CrossesAt = Worksheets("Parámetros").Range("B8").Value         'Media
        .MinorUnit = Worksheets("Parámetros").Range("B9").Value         'Desvio Std
        .MajorUnit = Worksheets("Parámetros").Range("B9").Value         'Desvio Std
        .MaximumScale = Worksheets("Parámetros").Range("B10").Value     'Desvio+3*Media
        .MinimumScale = Worksheets("Parámetros").Range("B11").Value     'Desvio-3*Media
       
    End With
Espero que le sirva a alguien.
 
Julio.

jsi...@indaltec.com

unread,
Jul 26, 2004, 7:38:34 AM7/26/04
to
Jejejeje, me imagine que iba a recibir una respuesta por el estilo...
 
De hecho creo que, ahora que la miro con ojos renovados, tu solucion es mas "inteligente", ya que toma en cuenta si no hay modificacion en los valores...
 
Pero bueno, en este caso, "mi" solucion tiene en cuenta el hecho de que el promedio (y todas los demas parametros de centralizacion) sean 0. En ese caso, le asigno valores arbitrarios...
 
En definitiva, el codigo quedo algo asi...
 
Private Sub Worksheet_Calculate()
 
    txtRango = "A" & Worksheets("Parámetros").Range("B1").Value + 11 & ":" & _
               "B" & Worksheets("Parámetros").Range("B2").Value + 11
 
    Charts("Gráfico").SetSourceData Source:=Worksheets("Parámetros").Range(txtRango), _
                                    PlotBy:=xlColumns
                     
    Charts("Gráfico").SeriesCollection(1).Name = "Ausentismo semanal promedio"
 
    If Worksheets("Parámetros").Range("B8").Value > 0 Then
   
        With Charts("Gráfico").Axes(xlValue)
       
            .CrossesAt = Worksheets("Parámetros").Range("B8").Value         'Media
            .MinorUnit = Worksheets("Parámetros").Range("B9").Value         'Desvio Std
            .MajorUnit = Worksheets("Parámetros").Range("B9").Value         'Desvio Std
            .MaximumScale = Worksheets("Parámetros").Range("B10").Value     'Desvio+3*Media
            .MinimumScale = Worksheets("Parámetros").Range("B11").Value     'Desvio-3*Media
       
        End With
       
    Else
   
        With Charts("Gráfico").Axes(xlValue)
       
            .CrossesAt = 0
            .MinorUnit = 1 / 3
            .MajorUnit = 1 / 3
            .MaximumScale = 1
            .MinimumScale = -1
           
        End With
       
    End If
 
End Sub
Demas esta decir, gracias. Cada dia aprendo mas, de ustedes y de todos.
 
Julio.
 
 
0 new messages