none
Indicar a una gráfica el valor maximo y minimo en una grafica

    Pregunta

  • Hola!

    Tengo varias gráficas y me gustaria saber si puedo poner en dos celdas dos valores y pasarlos a las gráficas como valores máximo y minimo de un eje .
    Es possible?
    guif
    martes, 20 de octubre de 2009 9:57

Respuestas

  • hola, !

    suponiendo que se puede obtener cada valor (p.e.) de las celdas E2, E3, E4 y E5
    ->  (maximo/minimo y los intervalos en los saltos de la escala)...

    -> tendrias que hacerlo por codigo y para que sea automatico, manejar los eventos de la hoja

    === en el modulo de codigo de la hoja ===
    (ya sea en el evento _calculate o _change)

      With Me.ChartObjects(1).Chart.Axes(xlValue)
        .MinimumScale = Range("e2")
        .MaximumScale = Range("e3")
        .MajorUnit = Range("e4")
        .MinorUnit = Range("e5")
      End With

    -> cambia las celdas por las reales y si se trata de una hoja de graficos aparte...
        habria que definir con exactitud de que hoja y rangos se tomaran los valores
        y modificar el Me.ChartObjects(1).Chart por su correspondiente hoja de graficos

    si cualquier duda (o informacion adicional)... comentas ?
    saludos,
    hector.

    miércoles, 21 de octubre de 2009 4:09

Todas las respuestas

  • hola, !

    suponiendo que se puede obtener cada valor (p.e.) de las celdas E2, E3, E4 y E5
    ->  (maximo/minimo y los intervalos en los saltos de la escala)...

    -> tendrias que hacerlo por codigo y para que sea automatico, manejar los eventos de la hoja

    === en el modulo de codigo de la hoja ===
    (ya sea en el evento _calculate o _change)

      With Me.ChartObjects(1).Chart.Axes(xlValue)
        .MinimumScale = Range("e2")
        .MaximumScale = Range("e3")
        .MajorUnit = Range("e4")
        .MinorUnit = Range("e5")
      End With

    -> cambia las celdas por las reales y si se trata de una hoja de graficos aparte...
        habria que definir con exactitud de que hoja y rangos se tomaran los valores
        y modificar el Me.ChartObjects(1).Chart por su correspondiente hoja de graficos

    si cualquier duda (o informacion adicional)... comentas ?
    saludos,
    hector.

    miércoles, 21 de octubre de 2009 4:09
  • Entiendo que esto lo tengo que poner, haciendo boton derecho sobre la grafica > Asignar macro... > Creo una nueva macro:

    Sub grafica1()

    End Sub

    y pongo:


    Sub grafica1()
     With Me.ChartObjects(1).Chart.Axes(xlValue)
        .MinimumScale = Range("e2")
        .MaximumScale = Range("e3")
        .MajorUnit = Range("e4")
        .MinorUnit = Range("e5")
      End With
    End Sub

    Me da un error de compilación en el "Me." Yo las graficas las tengo en una hora llamada Graficas

    guif
    miércoles, 21 de octubre de 2009 8:44
  • he conseguido actualizar los datos

    Sub graf()
    ActiveSheet.ChartObjects("2 Gráfico").Activate
    With ActiveChart.Axes(xlValue)
    .MaximumScale = Range("R53")
    End With
    End Sub


    como puedo hacer para que al poner el valor en mi campo R53 que se actualice automaticamente?
    guif
    miércoles, 21 de octubre de 2009 15:23
  • hola, !

    el ejemplo asumia que se trata de un grafico incrustado en la hoja X (la hoja activa ?)
    por ello fue la sugerencia de utilizar el evento '_change' o el evento '_calculate' del modulo de codigo de "esa" hoja
    y al tratarse de una grafica incrustada, la palabra clave "Me" hace referencia al objeto contenedor ("la hoja X")

    para determinar si es mejor el evento _change o el _calculate habria que conocer si la celda (R53) cambia su valor por actualizacion de formula (usar el evento _calculate) o por entrada directa del usuario (usar el evento _change)

    creo que solo leiste demasiado aprisa los comentarios en el mensaje, pero...
    si cualquier duda (o informacion adicional)... comentas ?
    saludos,
    hector.
    miércoles, 21 de octubre de 2009 21:32
  • He visto las horas de los comentarios y tal como comento me ha funcionado.
    Lo que me gustaria saber es como puedo modificar mi campo y que actualice la grafica automaticamente.

    Otro problema que tengo es que las graficas tienen el mismo nombre!!! (será porque he hecho copiar y pegar) Se pueden modificar? Lo he intentado pero no se cambia el nombre. Donde se cambia?
    guif
    jueves, 22 de octubre de 2009 9:24
  • hola (...), ?????

    (creo que) no importa el orden y secuencia de los mensajes, y lo que comentas que "te ha funcionado", en tu segundo mensaje indicas que "falla" la referencia a "Me" (correcto ?)

    tambien sin animo de crear polemica, tu consulta original es +/- con el estilo de:
    "adivinen cuales celdas quiero utilizar como limites a la escala de valores de un grafico que tengo por ahi"
    razon por la que aventure una propuesta indicando cuales eran los supuestos utilizados para su posible solucion

    comentas (ahora) que tienes dos (o mas) graficos (incrustaros ???) en una hoja producto de copiar uno varias veces
    esto causa que el nombre del grafico quede "repetido" n_veces y toda referencia al nombre sera siempre al primero

    regresando "al punto", si quieres que la escala se (auto)actualice cuando cambia el valor de "la celda", es necesario conocer si "la celda" (R53) cambia su valor por efecto de actualizarce una formula (?) o por entrada "directa" (?)

    para ello es necesario que el codigo que se utilice este en el modulo de codigo de "la hoja" (donde esta "la celda") y dependiendo de "la forma" en que "la celda" cambia su valor (formula o entrada), el codigo debiera estar en algun evento: si cambia por formula, en el evento '_change' o si cambia por entrada directa, en el evento '_change'

    para cambiar el nombre de un objeto (grafico incrustado) copiado, puedes seleccionarlo (en la interfaz de usuario) y usar codigo (p.e.) desde la ventana de inmediato en el editor de vba: selection.name="nuevo nombre"

    (disculpa que insista, pero creo que sigues leyendo SIN estudiar/analizar/... lo propuesto)

    si cualquier duda (o informcion adicional)... comentas ?
    saludos,
    hector.

    jueves, 22 de octubre de 2009 16:42
  • hola de nuevo (...), ?????

    si tienes problemas para entender mis intentos de explicacion, prueba consultando esta pagina:

    Link Chart Axis Scale Parameters to Values in Cells.
    http://peltiertech.com/Excel/Charts/AxisScaleLinkToSheet.html

    saludos,
    hector.
    jueves, 22 de octubre de 2009 17:12
  • Excelente explicación Héctor.

    Lo he realizado y me ha funcionado de maravilla, sólo que ahora me surge una pregunta: ¿qué debo hacer para que esto siga funcionando pero con varias gráficas (del mismo tipo y con diferente nombre, todas en la misma hoja de cálculo), es decir, que con las mismas celdas que modifican a la primer gráfica se ajusten las demás?

    Debes saber que tengo 12 gráficas del mismo tipo en una hoja de excel (misma de donde concentro los datos que las generan), pero al ejecutar la macro sólo se ajusta el eje de la gráfica 1 y quisiera que con esos mismo valores se ajustara el eje Y del resto de graficas. Lo anterior, con el fin de que todas tengan la misma escala y se vean proporcionales a ésta y entre ellas...

    Espero tus valiosas sugerencias... Te agradezco de antemano!!! Salu2

    PD. Cabe mencionar que ya consulte la liga que adjuntas al final de este post (http://peltiertech.com/Excel/Charts/AxisScaleLinkToSheet.html) y funciona exactamente igual: sólo modifica a la primer grafica y las demas quedan estáticas.


    • Editado Kamou_Soñduñ miércoles, 24 de julio de 2013 2:31 Me equivoqué en la especificación del eje
    miércoles, 24 de julio de 2013 1:22
  • lo que no esta claro es si utilizas código en un modulo estándar o algún evento en el modulo de código de "esa" hoja (?)

    asumiendo que usas un modulo estándar (?), podrías emplear un bucle para recorrer cada una de las graficas incrustadas en la hoja activa con algo +/- así:

      Dim n As Byte
      With ActiveSheet
        For n = 1 To .ChartObjects.Count
          With .ChartObjects(n).Chart.Axes(xlValue)
            .MinimumScale = Range("e2")
            .MaximumScale = Range("e3")
            .MajorUnit = Range("e4")
            .MinorUnit = Range("e5")
          End With
        Next
      End With

    saludos,

    hector.

    jueves, 25 de julio de 2013 17:44
  • Que tal Miguel...! Gracias por responder.

    En efecto, tienes razón, omití mencionar que el código utilizado en el módulo de esa hoja, está en el evento "Calculate" (Worksheet_Calculate); ya que el valor de las celdas de las cuales depende el ajuste de los rangos y valores (máximo, mínimo) del eje, resultan de una fórmula...

    El código que utilicé fue:

    Private Sub Worksheet_Calculate()
    With Me.ChartObjects(1).Chart.Axes(xlValue)
    .MinimumScale = Range("E2")
    .MaximumScale = Range("E3")
    .MajorUnit = Range("E4")
    .MinorUnit = Range("E5")
    End With
    End Sub


    Saludos. Quedo en espero de tu apreciable ayuda!!!
    martes, 30 de julio de 2013 2:09
  • la adaptación que requieres es muy sencilla, copia/pega (o escribe) el ultimo código sugerido entre las líneas:

    Private Sub Worksheet_Calculate()
      ' AQUI ... '
    End Sub

    solo cambia en la segunda línea:
      With ActiveSheet

    por:
      Witn Me

    saludos,

    hector.

    martes, 30 de julio de 2013 18:11
  • Que tal Miguel.

    Francamente no tengo palabras para agradecerte el tiempo y conocimiento empleados para responder cada una de las cuestiones planteadas... Te comento que he conseguido lo que necesito a partir de las sugerencias que me has dado. Al final del día el código empleado (lo dejo por si a alguien le pudiera servir en otro momento bajo las mismas condiciones planteadas en el resto del post) fue, tal como lo sugeriste:

    Private Sub Worksheet_Calculate()
    Dim n As Byte
     With Me
        For n = 1 To .ChartObjects.Count
          With .ChartObjects(n).Chart.Axes(xlValue)
            .MinimumScale = Range("E2")
            .MaximumScale = Range("E3")
            .MajorUnit = Range("E4")
            .MinorUnit = Range("E5")
          End With
        Next
      End With
    End Sub

    Nuevamente muchas gracias!!! Saludos cordiales


    • Editado Kamou_Soñduñ martes, 30 de julio de 2013 18:37 complementar información
    martes, 30 de julio de 2013 18:36