Visual Basic para Aplicaciones - Autoajuste de ejes en gráficos de Excel según máximo y mínimo de una celda

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil

Autoajuste de ejes en gráficos de Excel según máximo y mínimo de una celda

Publicado por Fernando (5 intervenciones) el 14/06/2014 11:14:37
Como sabéis los gráficos de Excel tienen la posibilidad de autoajustar sus ejes X e Y de manera automática en las opciones de gráfico, pero por alguna extraña razón, cuando el rango de los datos de origen es superior a un valor determinado, el valor mínimo de los ejes te lo deja en 0, y no autoajusta adecuadamente la gráfica. Así, tratando de resolver este problema he creado el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Dim objCht As ChartObject
   For Each objCht In ActiveSheet.ChartObjects
       With objCht.Chart
        ' Valores para el eje (Y)
             With .Axes(xlValue)
                .MaximumScale = Sheets("Calibración").Range("Chart1MaxY").Value
                .MinimumScale = Sheets("Calibración").Range("Chart1MinY").Value
               '.MajorUnit = Sheets("Calibración").Range("CalUnitY").Value
           End With
      ' Valores para el eje (X)
          With .Axes(xlCategory)
               .MaximumScale = Sheets("Calibración").Range("Chart1MaxX").Value
               .MinimumScale = Sheets("Calibración").Range("Chart1MinX").Value
              '.MajorUnit = Sheets("Calibración").Range("CalUnitY").Value
        End With
     End With
   Next objCht
End Sub

El código funciona perfectamente autoajustando los ejes de las gráficas si se modifican los datos primarios de la gráfica Chart1, si no fuera porque, como veréis en el ejemplo, actúa sobre todas las gráficas de la hoja activa. Así, cuando en la misma hoja hay varias gráficas, todas ellas se autoajustan en base a los mismos valores máximo y mínimo que se le han especificado, en este caso, los correspondientes a la gráfica Chart1: Chart1MaxY, Chart1MinY y Chart1MaxX y Chart1MinX.

Mi problema, y por lo que escribo en el foro, es porque no sé cómo indicar en el código que para cada gráfica (Chart1 y Chart2) quiero que los valores de autoajuste de X y de Y sean diferentes, es decir, quiero que para la gráfica Chart1 coja los que hay en el código (Chart1MaxY, Chart1MinY y Chart1MaxX y Chart1MinX) y para Chart2 los suyos (Chart2MaxY, Chart2MinY y Chart2MaxX y Chart2MinX). Para facilitar la comprensión del caso, adjunto un archivo de ejemplo donde lo explico:

"Ejmplo autoajuste ejes.xlsm"
https://www.dropbox.com/s/gfuc7w7hod0t1gl/Ejmplo%20autoajuste%20ejes.xlsm

Agradezco de antemano cualquier comentario o ayuda que podáis prestarme.

Un saludo,
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JuanC

Autoajuste de ejes en gráficos de Excel según máximo y mínimo de una celda

Publicado por JuanC (565 intervenciones) el 14/06/2014 14:23:50
podrías hacerlo teniendo en cuenta el nombre de los gráficos:

1
2
3
4
5
6
7
8
With objCht.Chart
        Select Case .Name
         Case "grafico 1"
              'Valores para Ejes
         Case "grafico 2"
              'Valores para Ejes
        End Select
End With

Saludos, desde Baires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Autoajuste de ejes en gráficos de Excel según máximo y mínimo de una celda

Publicado por Fernando (5 intervenciones) el 14/06/2014 18:01:57
Hola Juan,

Muchas gracias por responder tan rápido. Acabo de probar lo que propones y no me funciona, da error y no sé si es que he escrito mal el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim objCht As ChartObject
  For Each objCht In ActiveSheet.ChartObjects
     With objCht.Chart
         Select.Case.Name
                  Case "Chart1"
                         ' Valores para el eje (Y) Chart1
                          With .Axes(xlValue)
                                  .MaximumScale = Sheets("Calibración").Range("Chart1MaxY").Value
                                  .MinimumScale = Sheets("Calibración").Range("Chart1MinY").Value
                                 '.MajorUnit = Sheets("Calibración").Range("CalUnitY").Value
                          End With
                        ' Valores para el eje (X) Chart1
                        With .Axes(xlCategory)
                                 .MaximumScale = Sheets("Calibración").Range("Chart1MaxX").Value
                                 .MinimumScale = Sheets("Calibración").Range("Chart1MinX").Value
                                '.MajorUnit = Sheets("Calibración").Range("CalUnitY").Value
                       End With
 
                Case "Chart2"
                      ' Valores para el eje (Y) Chart2
                      With .Axes(xlValue)
                              .MaximumScale = Sheets("Calibración").Range("Chart2MaxY").Value
                              .MinimumScale = Sheets("Calibración").Range("Chart2MinY").Value
                             '.MajorUnit = Sheets("Calibración").Range("CalUnitY").Value
                      End With
                     ' Valores para el eje (X) Chart2
                      With .Axes(xlCategory)
                             .MaximumScale = Sheets("Calibración").Range("Chart2MaxX").Value
                             .MinimumScale = Sheets("Calibración").Range("Chart2MinX").Value
                            '.MajorUnit = Sheets("Calibración").Range("CalUnitY").Value
                      End Select
     End With
  Next objCht
End Sub

Muchas gracias por la ayuda, se agradece mucho.

Un saludo,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JuanC

Autoajuste de ejes en gráficos de Excel según máximo y mínimo de una celda

Publicado por JuanC (565 intervenciones) el 14/06/2014 21:58:22
creo que el error está en la línea

Select.Case.Name

debería ser

Select Case .Name


Saludos, desde Baires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Autoajuste de ejes en gráficos de Excel según máximo y mínimo de una celda

Publicado por Fernando (5 intervenciones) el 14/06/2014 23:07:04
Hola Juan,

Efectivamente había metido un punto de más, buen ojo. Aun así, sigue sin funcionar, de hecho ahora no hace nada:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim objCht As ChartObject
For Each objCht In ActiveSheet.ChartObjects
With objCht.Chart
Select Case .Name
Case "Gráfico 2"
' Valores para el eje (Y) Chart1
With .Axes(xlValue)
.MaximumScale = Sheets("Calibración").Range("Chart1MaxY").Value
.MinimumScale = Sheets("Calibración").Range("Chart1MinY").Value
'.MajorUnit = Sheets("Calibración").Range("CalUnitY").Value
End With
' Valores para el eje (X) Chart1
With .Axes(xlCategory)
.MaximumScale = Sheets("Calibración").Range("Chart1MaxX").Value
.MinimumScale = Sheets("Calibración").Range("Chart1MinX").Value
'.MajorUnit = Sheets("Calibración").Range("CalUnitY").Value
End With
Case "Gráfico 3"
' Valores para el eje (Y) Chart2
With .Axes(xlValue)
.MaximumScale = Sheets("Calibración").Range("Chart2MaxY").Value
.MinimumScale = Sheets("Calibración").Range("Chart2MinY").Value
'.MajorUnit = Sheets("Calibración").Range("CalUnitY").Value
End With
' Valores para el eje (X) Chart2
With .Axes(xlCategory)
.MaximumScale = Sheets("Calibración").Range("Chart2MaxX").Value
.MinimumScale = Sheets("Calibración").Range("Chart2MinX").Value
'.MajorUnit = Sheets("Calibración").Range("CalUnitY").Value
End Select
End With
Next objCht
End Sub

En cualquier caso, muchas gracias. He estado probando mil combinaciones y no lo consigo y estoy seguro de que no tiene que ser muy complicado, pero no acabo de conseguir que el código llame a cada uno de los gráficos de manera independiente.

Un saludo,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JuanC

Autoajuste de ejes en gráficos de Excel según máximo y mínimo de una celda

Publicado por JuanC (565 intervenciones) el 14/06/2014 23:08:14
pasame x email el libro completo y te lo corrijo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Autoajuste de ejes en gráficos de Excel según máximo y mínimo de una celda

Publicado por Fernando (5 intervenciones) el 14/06/2014 23:14:35
Te lo acabo de mandar por email.

Lo dicho, muchísimas gracias por la ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Autoajuste de ejes en gráficos de Excel según máximo y mínimo de una celda

Publicado por Fernando (5 intervenciones) el 14/06/2014 23:43:11
¡¡Muchas gracias Juan!!

Finalmente, y por si a alguien le interesa, el asunto estaba en que no estaba citando adecuadamente a cada uno de los gráficos. Os pongo el código que me ha arreglado JuanC:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim objCht As ChartObject
For Each objCht In ActiveSheet.ChartObjects
With objCht.Chart
Select Case .Name
Case "Calibración Gráfico 2"
' Valores para el eje (Y) Chart1
With .Axes(xlValue)
.MaximumScale = Sheets("Calibración").Range("Chart1MaxY").Value
.MinimumScale = Sheets("Calibración").Range("Chart1MinY").Value
.MajorUnit = Sheets("Calibración").Range("Chart1UnitY").Value
End With
' Valores para el eje (X) Chart1
With .Axes(xlCategory)
.MaximumScale = Sheets("Calibración").Range("Chart1MaxX").Value
.MinimumScale = Sheets("Calibración").Range("Chart1MinX").Value
.MajorUnit = Sheets("Calibración").Range("Chart1UnitX").Value
End With
Case "Calibración Gráfico 3"
' Valores para el eje (Y) Chart2
With .Axes(xlValue)
.MaximumScale = Sheets("Calibración").Range("Chart2MaxY").Value
.MinimumScale = Sheets("Calibración").Range("Chart2MinY").Value
.MajorUnit = Sheets("Calibración").Range("Chart2UnitY").Value
End With
' Valores para el eje (X) Chart2
With .Axes(xlCategory)
.MaximumScale = Sheets("Calibración").Range("Chart2MaxX").Value
.MinimumScale = Sheets("Calibración").Range("Chart2MinX").Value
.MajorUnit = Sheets("Calibración").Range("Chart2UnitX").Value
End With
End Select
End With
Next objCht
End Sub

Un saludo a todos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar