Reputation: 23
I have to cycle through each chart in a given presentation and adjust its Y axis.
I copied code from the internet and adjusted it.
Sub Chartaxes()
Dim cht As ChartObject
Dim srs As Series
Dim FirstTime As Boolean
Dim MaxNumber As Double
Dim MinNumber As Double
Dim MaxChartNumber As Double
Dim MinChartNumber As Double
Dim Padding As Double
'Input Padding on Top of Min/Max Numbers (Percentage)
Padding = 0.1 'Number between 0-1
'Optimize Code
Application.ScreenUpdating = False
'Loop Through Each Chart On ActiveSheet
For Each cht In ActiveSheet.ChartObjects
'First Time Looking at This Chart?
FirstTime = True
'Determine Chart's Overall Max/Min From Connected Data Source
For Each srs In cht.Chart.SeriesCollection
'Determine Maximum value in Series
MaxNumber = Application.WorksheetFunction.Max(srs.Values)
'Store value if currently the overall Maximum Value
If FirstTime = True Then
MaxChartNumber = MaxNumber
ElseIf MaxNumber > MaxChartNumber Then
MaxChartNumber = MaxNumber
End If
'Determine Minimum value in Series (exclude zeroes)
MinNumber = Application.WorksheetFunction.Min(srs.Values)
'First Time Looking at This Chart?
FirstTime = False
Next srs
'Rescale Y-Axis
cht.Chart.Axes(xlValue).MinimumScale = 0
cht.Chart.Axes(xlValue).MaximumScale = MaxChartNumber * (1 + Padding)
Next cht
'Optimize Code
Application.ScreenUpdating = True
End Sub
Images for reference:
Upvotes: 0
Views: 156
Reputation: 42236
Please, try the next adapted version, able to work in Outlook
. VBA Outlook does not have Min
, Max
functions and I built them, too:
Sub ModffCharts()
Dim sh As Shape, ch As Chart, srs, Padding As Double, FirstTime As Boolean
Dim MaxChartNumber As Double, MaxNumber As Double, MinNumber As Double
Padding = 0.1
For Each sh In Application.ActiveWindow.View.Slide.Shapes 'shapes of the active slide...
If sh.HasChart = msoTrue Then
Set ch = sh.Chart
FirstTime = True
'Debug.Print ch.SeriesCollection.Count
For Each srs In ch.SeriesCollection
'Determine Maximum value in Series
MaxNumber = MaX(srs.Values)
'Store value if currently the overall Maximum Value
If FirstTime = True Then
MaxChartNumber = MaxNumber
ElseIf MaxNumber > MaxChartNumber Then
MaxChartNumber = MaxNumber
End If
'Determine Minimum value in Series
MinNumber = MiN(srs.Values)
'First Time Looking at This Chart?
FirstTime = False
Next srs
ch.Axes(xlValue).MinimumScale = 0
ch.Axes(xlValue).MaximumScale = MaxChartNumber * (1 + Padding)
End If
Next sh
End Sub
Function MaX(arr) As Double
Dim i As Long, Mx As Double
For i = LBound(arr) To UBound(arr)
If arr(i) > Mx Then Mx = arr(i)
Next i
MaX = Mx
End Function
Function MiN(arr) As Double
Dim i As Long, Mn As Double
Mn = MaX(arr)
For i = LBound(arr) To UBound(arr)
If arr(i) < Mn Then Mn = arr(i)
Next i
MiN = Mn
End Function
Please, test it and send some feedback.
Edited:
Please, test the updated version. It will use the same maximum scale for first three chart, calculate it for the fourth and use it for rest of charts:
Sub ModffCharts_bis()
Dim sh As Shape, ch As Chart, srs, Padding As Double, FirstTime As Boolean
Dim MaxChartNumber As Double, MaxNumber As Double, MinNumber As Double
Dim i As Long
Padding = 0.1
FirstTime = True
For Each sh In Application.ActiveWindow.View.Slide.Shapes
If sh.HasChart = msoTrue Then
Set ch = sh.Chart
i = i + 1
Select Case i
Case 2, 3: GoTo OverCalculation
Case Is > 4: GoTo OverCalculation
End Select
'Debug.Print ch.SeriesCollection.Count
For Each srs In ch.SeriesCollection
'Determine Maximum value in Series
MaxNumber = MaX(srs.Values)
'Store value if currently the overall Maximum Value
If FirstTime = True Then
MaxChartNumber = MaxNumber
ElseIf MaxNumber > MaxChartNumber Then
MaxChartNumber = MaxNumber
End If
'Determine Minimum value in Series
MinNumber = MiN(srs.Values)
'First Time Looking at This Chart?
FirstTime = False
Next srs
OverCalculation:
ch.Axes(xlValue).MinimumScale = 0
ch.Axes(xlValue).MaximumScale = MaxChartNumber * (1 + Padding)
End If
Next sh
End Sub
Upvotes: 1