** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Otros de Microsoft: Windows y Office > Excel
  Mensajes nuevos Mensajes nuevos RSS - gráfico dinámico y ajuste de ejes
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradográfico dinámico y ajuste de ejes

 Responder Responder
Autor
Mensaje
jfca283 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 05/Junio/2008
Localización: Chile
Estado: Sin conexión
Puntos: 221
Enlace directo a este mensaje Tema: gráfico dinámico y ajuste de ejes
    Enviado: 11/Julio/2014 a las 22:26
Buenas
Ojalá me puedan ayudar.
Tengo un gráfico dinámico, muevo el filtro y todo ok.
Pero me gustaría que los mínimos y máximos del eje se ajustaran al valor mínimo y máximo de la serie seleccionada por el filtro.
Espero me haya dado a entender.
Muchas gracias.
Arriba
JCC Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 20/Septiembre/2013
Localización: Chile
Estado: Sin conexión
Puntos: 853
Enlace directo a este mensaje Enviado: 11/Julio/2014 a las 23:19
Publicado originalmente por jfca283 jfca283 escribió:


Pero me gustaría que los mínimos y máximos del eje se ajustaran al valor mínimo y máximo de la serie seleccionada por el filtro.




Hola, Puedes entregar mas datos por ejemplo de donde vienen esos valores mínimos o máximos y en que momento deseas que se ajusten.


saludos,
Saludos desde Chile....
Arriba
jfca283 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 05/Junio/2008
Localización: Chile
Estado: Sin conexión
Puntos: 221
Enlace directo a este mensaje Enviado: 14/Julio/2014 a las 22:06
Claro.
Vienen de la Hoja1.
Esta posee 12 columnas, pero la tabla dinámica que hago solo ocupa  5 de esas columnas.
Como filtro tengo una llamada Area, como filas tengo otra nombrada Fecha.
Las demás son solo valores llamadas FT, Des y Ocup.
Estas tres varían según la localidad que este viendo.
Ejemplo, el área ABC posee 100000 FT 60000 Ocup y 3000 Des.
Pero el área YYZ tiene 5000 FT 4000 Ocup y 500 Des.
Esto se repite así con las áreas.
Me gustaría que una vez seleccionado el filtro los valores de los ejes cambiasen ajustado por el mínimo y máximo de los valores de la región aplicada en el filtro.
Suena simple, pero no lo veo claro.
Arriba
sdgm Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 21/Abril/2005
Localización: Guatemala
Estado: Sin conexión
Puntos: 906
Enlace directo a este mensaje Enviado: 14/Julio/2014 a las 22:43
Como insinúa John, es muy difícil responder si no hay un ejemplo o datos más precisos.

En tu caso, en términos generales te podría sugerir que utilices el evento PivotTableUpdate de la hoja.  Este evento se dispara cuando ejecutas una acción que haga que la tabla dinámica se actualice.  En él podrías asignar a tu gráfico el valor mínimo y máximo de la serie que necesites en la propiedad:

Axes(xlValue).MinimumScale
y
Axes(xlValue).MaximumScale


Cordialmente, David
Arriba
jfca283 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 05/Junio/2008
Localización: Chile
Estado: Sin conexión
Puntos: 221
Enlace directo a este mensaje Enviado: 15/Julio/2014 a las 00:58
Arriba
jfca283 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 05/Junio/2008
Localización: Chile
Estado: Sin conexión
Puntos: 221
Enlace directo a este mensaje Enviado: 15/Julio/2014 a las 01:53
Hice esto
Sub Ejes()
   Dim Eje_min As Long
    Application.ScreenUpdating = False
    Eje_min = Sheets("Hoja1").Range("K1")
    ActiveSheet.ChartObjects("Gráfico 2").Activate
    ActiveChart.Axes(xlValue).MinimumScale = Eje_min
    Application.CommandBars("Format Object").Visible = False
    Application.ScreenUpdating = True

Funciona, pero tuve que crear unos botones a los que asigné esta macro.
Pero no les miento que me da lata tener que pinchar el filtro y luego el botón de "ajustar ejes".
Puedo, de alguna manera, hacer que este código corra cada vez que mueva el filtro de la tabla dinámica?
Es decir, cambio de región en el filtro y automáticamente la macro corra, evitando así el ejecutarla manualmente?
Muchas gracias por sus respuestas.
Arriba
sdgm Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 21/Abril/2005
Localización: Guatemala
Estado: Sin conexión
Puntos: 906
Enlace directo a este mensaje Enviado: 15/Julio/2014 a las 14:56
Pulsa clic derecho en tu tabla dinámica y selecciona "Opciones de tabla dinámica".  En el cuadro de diálogo verás el nombre de la tabla.  Cópialo.

Luego, pulsa clic derecho en la pestaña de tu hoja y selecciona "Ver código".  Allí pegas lo siguiente:

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
    Ejes
End Sub


El evento PivotTableUpdate, se dispara cada vez que modificas el filtro.  De ese modo, se actualiza tu tabla dinámica, tu gráfico dinámico y se modifican las propiedades que estableciste en tu procedimiento.

Pruébalo, y comentas...

Saludos...
Cordialmente, David
Arriba
jfca283 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 05/Junio/2008
Localización: Chile
Estado: Sin conexión
Puntos: 221
Enlace directo a este mensaje Enviado: 15/Julio/2014 a las 16:09
Parecerá tonto, pero no se dónde declarar el nombre de la Tabla dinámica.
Esta se llama "Tabla dinámica 1".
Escribí esto

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
  Call  Ejes
  Call  Ejes_Des
End Sub

Pero claramente está malo, ya que le debo correr la macro recién escrita para luego seleccionar la macro Ejes o Ejes_Des.




Editado por jfca283 - 15/Julio/2014 a las 16:16
Arriba
sdgm Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 21/Abril/2005
Localización: Guatemala
Estado: Sin conexión
Puntos: 906
Enlace directo a este mensaje Enviado: 15/Julio/2014 a las 16:59
El nombre de la tabla dinámica fue un lapsus.  Lo escribí y luego de publicar el mensaje me di cuenta que no es necesario, pero no encontré opción para editar el mensaje...  Disculpa.

Viendo el libro que publicaste, prueba con:


Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
    Dim UL As Long, M1 As Double, M2 As Double, G1 As Double, G2 As Double, I1 As Double, I2 As Double
    UL = Cells(Rows.Count, 1).End(xlUp).Row - 1
    'Calculando límites inferiores de los dos ejes
    M1 = Application.WorksheetFunction.Min(Range("B5:B" & UL), Range("D5:D" & UL))
    M2 = Application.WorksheetFunction.Min(Range("C5:C" & UL))
    'Calculando límites superiiores de los dos ejes
    G1 = Application.WorksheetFunction.Max(Range("B5:B" & UL), Range("D5:D" & UL))
    G2 = Application.WorksheetFunction.Max(Range("C5:C" & UL))
    'Calculando unidad mayor para los dos ejes
    I1 = Round((G1 - M1) / 4, 0)
    I2 = Round((G2 - M2) / 4, 0)
    'Aplicando corrección a la unidad mayor
    If M1 + I1 * 4 < G1 Then G1 = M1 + I1 * 5
    If M2 + I2 * 4 < G2 Then G2 = M2 + I2 * 5
    
    ActiveSheet.ChartObjects("Gráfico 1").Activate
    
        ActiveChart.Axes(xlValue).MinimumScale = _
                Application.WorksheetFunction.RoundDown(M1, 0)
        ActiveChart.Axes(xlValue, xlSecondary).MinimumScale = _
                Application.WorksheetFunction.RoundDown(M2, 0)
        ActiveChart.Axes(xlValue).MaximumScale = _
                Application.WorksheetFunction.RoundUp(G1, 0)
        ActiveChart.Axes(xlValue, xlSecondary).MaximumScale = _
                Application.WorksheetFunction.RoundUp(G2, 0)
        ActiveChart.Axes(xlValue).MajorUnit = I1
        ActiveChart.Axes(xlValue, xlSecondary).MajorUnit = I2
        
End Sub

Cordialmente, David
Arriba
jfca283 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 05/Junio/2008
Localización: Chile
Estado: Sin conexión
Puntos: 221
Enlace directo a este mensaje Enviado: 15/Julio/2014 a las 17:20
Wow. Qué macro.
La mía corre ok.
Declaré en unas celdas los mínimos y máximos de los ejes.
Pero cómo los incorporo a la macro?
Traté con tu código y me ofrece correr otras macros que no están relacionadas con el tuyo.
Algo muy básico estoy haciendo mal.
No estoy ligando el refresco de la tabla dinámica a la macro.
Por si acaso, uso excel 2013.
Muchas gracias por tu ayuda.
Arriba
sdgm Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 21/Abril/2005
Localización: Guatemala
Estado: Sin conexión
Puntos: 906
Enlace directo a este mensaje Enviado: 15/Julio/2014 a las 17:47
Si tu macro no está actualizando automáticamente tu gráfico dinámico, podría ser por dos causas:

1. No se agregó a la hoja donde está la tabla y el gráfico dinámico, o...
2. Tu Excel tiene deshabilitados los eventos.

Para verificar el caso 1: Revisa si al pulsar "clic derecho - Ver código" en la pestaña de la hoja de tu gráfico y tu tabla dinámica se llega a donde tienes el macro "Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)".

Para verificar el caso 2: Estando en el Editor de VBA, pulsa Control+G.  En la ventana que aparece, escribe lo siguiente:

? application.EnableEvents

y pulsas Enter.  Esto te debería responder con "Verdadero".  De no ser así, escribe:

Application.EnableEvents = true

y vuelves a pulsar Enter.  Luego cierras la ventana de Inmediato que apareció cuando pulsaste Control+G.

Por cierto, si recalculas el máximo y el mínimo de tu gráfico en celdas, los puedes asignar a tu macro con líneas como:

    ActiveChart.Axes(xlValue).MinimumScale = Range("K1").value
    ActiveChart.Axes(xlValue, xlSecondary).MinimumScale = Range("K2").value
    ActiveChart.Axes(xlValue).MaximumScale = Range("K3").value
    ActiveChart.Axes(xlValue, xlSecondary).MaximumScale = Range("K4").value

Pero también te recomendaría que calcularas intervalos para la Unidad Mayor de ambos ejes.  Por ejemplo, si deseas cuatro divisiones en cada eje, en K5 podrías poner una fórmula como:

= Redondear((K3 - K1) / 4, 0)

suponiendo que en K3 tienes el máximo del eje principal y en K1 el mínimo del eje principal, y en K6:

= Redondear((K4 - K2) / 4, 0)

donde en K4 está el máximo del eje secundario y en K2 el mínimo del eje secundario.

Luego los asignas a tu gráfico con:

    ActiveChart.Axes(xlValue).MajorUnit = Range("K5").value
    ActiveChart.Axes(xlValue, xlSecondary).MajorUnit = Range("K6").value



Cordialmente, David
Arriba
jfca283 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 05/Junio/2008
Localización: Chile
Estado: Sin conexión
Puntos: 221
Enlace directo a este mensaje Enviado: 30/Julio/2014 a las 17:43
Quiero ver si me aclaran una pequeña duda que no logro entender.
Declaro esto
Sub Eje_total()
'
'
Dim minimo As Double
Dim eje_total As Double
    Application.ScreenUpdating = False
    minimo = Application.WorksheetFunction.Min(Range("E1048503"), Range("E1048503").End(xlDown))
    eje_total = Application.WorksheetFunction.RoundDown(minimo,0)
    ActiveSheet.ChartObjects("Gráfico 60").Activate
    ActiveChart.Axes(xlValue).MinimumScale = eje_total
    'Application.CommandBars("Format Object").Visible = False
    Application.ScreenUpdating = True

End Sub
Corre con una salverdad.
El mínimo del rango especificado es 142.9. Eso me lo arroja una celda para calcular el mínimo. Lo hice para comprobar.
El tema es que corro y no redondea a 142. Lo hace un poco más arriba.
No se por qué lo hace. Pensé que era por el tipo de dato que declaraba en Dim.
Jugué con Long, Integer y Double.
El mismo problema.
Hice una solución algo trucha.
Multiplico el mínimo por 0.9 y se ajusta.
Pero no es 100%.
Qué creen que pueda ser mi error?
Gracias por las respuestas.
Arriba
sdgm Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 21/Abril/2005
Localización: Guatemala
Estado: Sin conexión
Puntos: 906
Enlace directo a este mensaje Enviado: 30/Julio/2014 a las 18:39
El mínimo no debería redondearse, sino truncarse.  Si redondeas, podrías dejar datos fuera del rango de tu gráfico.

Prueba con:

minimo = INT( Application.WorksheetFunction.Min(Range("E1048503"), Range("E1048503").End(xlDown)) )
Cordialmente, David
Arriba
jfca283 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 05/Junio/2008
Localización: Chile
Estado: Sin conexión
Puntos: 221
Enlace directo a este mensaje Enviado: 30/Julio/2014 a las 18:50
No funcionó.
Partió el eje en 275 siendo que el mínimo es 273,45.
Es raro. La web me arroja soluciones como la tuya que no presentan problemas.
Arriba
sdgm Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 21/Abril/2005
Localización: Guatemala
Estado: Sin conexión
Puntos: 906
Enlace directo a este mensaje Enviado: 30/Julio/2014 a las 20:39
Como mencionas: "es raro".  Aparentemente tu Excel está recalculando el valor del mínimo para tu eje.  No debería ser así.

Prueba redefinirlo en tiempo de ejecución, agregando las líneas en azul:

Dim eje_total As Double
    Application.ScreenUpdating = False
    minimo = Application.WorksheetFunction.Min(Range("E1048503"), Range("E1048503").End(xlDown))
    eje_total = Application.WorksheetFunction.RoundDown(minimo,0)
    ActiveSheet.ChartObjects("Gráfico 60").Activate
    ActiveChart.Axes(xlValue).MinimumScale = eje_total
    if ActiveChart.Axes(xlValue).MinimumScale < eje_total then 
        ActiveChart.Axes(xlValue).MinimumScale = _
            ActiveChart.Axes(xlValue).MinimumScale - ActiveChart.Axes(xlValue).MajorUnit
    end if
    'Application.CommandBars("Format Object").Visible = False
    Application.ScreenUpdating = True

End Sub
Cordialmente, David
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable