The code below runs fine for resizing a single chart in a sheet, or sizing multiple charts to the same size. What I am looking for is a method to size (and position) each chart differently depending on cell values on that sheet.
Sub UpdateChart()
Dim objCht As ChartObject
For Each objCht In ActiveSheet.ChartObjects
With objCht.Chart
With .Axes(xlValue)
.MaximumScale = ActiveSheet.Range("E6").Value
.MinimumScale = ActiveSheet.Range("E5").Value
End With
.Parent.Height = ActiveSheet.Range("E7").Value
With .Axes(xlCategory)
.MaximumScale = ActiveSheet.Range("D6").Value
.MinimumScale = ActiveSheet.Range("D5").Value
End With
.Parent.Width = ActiveSheet.Range("D7").Value
End With
Next objCht
End Sub
While inside the For/Next loop I have tried referencing the chart names or objCht index values without success.
Sub UpdateSomeCharts()
Dim objCht As ChartObject
For Each objCht In ActiveSheet.ChartObjects
With objCht.Chart
If objCht.Chart.Name = "Part 1 Chart_Plan" Then
With .Axes(xlValue)
.MaximumScale = ActiveSheet.Range("E6").Value
.MinimumScale = ActiveSheet.Range("E5").Value
End With
Parent.Height = ActiveSheet.Range("E7").Value
With .Axes(xlCategory)
.MaximumScale = ActiveSheet.Range("D6").Value
.MinimumScale = ActiveSheet.Range("D5").Value
End With
.Parent.Width = ActiveSheet.Range("D7").Value
GoTo Size_Charts_Done
Else:
If objCht.Chart.Name = "Part 1 Chart_Right" Then
With .Axes(xlValue)
.MaximumScale = ActiveSheet.Range("E6").Value
.MinimumScale = ActiveSheet.Range("E5").Value
End With
Parent.Height = ActiveSheet.Range("E7").Value
With .Axes(xlCategory)
.MaximumScale = ActiveSheet.Range("D10").Value
.MinimumScale = 0
End With
.Parent.Width = ActiveSheet.Range("D10").Value
GoTo Size_Charts_Done
Else:
If objCht.Chart.Name = "Part 1 Chart_Left" Then
With .Axes(xlValue)
.MaximumScale = ActiveSheet.Range("E6").Value
.MinimumScale = ActiveSheet.Range("E5").Value
End With
Parent.Height = ActiveSheet.Range("E7").Value
With .Axes(xlCategory)
.MaximumScale = 0
.MinimumScale = -(ActiveSheet.Range("D10").Value)
End With
.Parent.Width = ActiveSheet.Range("D10").Value
GoTo Size_Charts_Done
Size_Charts_Done:
End If
End If
End If
End With
Next objCht
End Sub
Using debug.print I can see that the If statements are working, but this fails on the .Parent.Height. saying it is not supported in excel for mac, yet that same line runs on the original code.
As I understand VBA for Mac is a subset of what's available on windows, so not every thing from that world works in Macville.
I got this working. Someone had a great suggestion of recording a macro of the changes you want, then figuring out the syntax and code from that. This macro sets the minimum and maximum scale values and also resizes and positions the charts based on data in the worksheet. It uses the chart names to apply different changes to each chart.
Sub UpdateChart()
ActiveSheet.ChartObjects("Chart_Plan").Activate
With ActiveChart.Axes(xlValue)
.MaximumScale = ActiveSheet.Range("E6").Value
.MinimumScale = ActiveSheet.Range("E5").Value
End With
With ActiveChart.Axes(xlCategory)
.MaximumScale = ActiveSheet.Range("D6").Value
.MinimumScale = ActiveSheet.Range("D5").Value
End With
ActiveSheet.ChartObjects("Chart_Right").Activate
With ActiveChart.Axes(xlValue)
.MaximumScale = ActiveSheet.Range("E6").Value
.MinimumScale = ActiveSheet.Range("E5").Value
End With
With ActiveChart.Axes(xlCategory)
.MaximumScale = ActiveSheet.Range("D10").Value
.MinimumScale = 0
End With
ActiveSheet.ChartObjects("Chart_Left").Activate
With ActiveChart.Axes(xlValue)
.MaximumScale = ActiveSheet.Range("E6").Value
.MinimumScale = ActiveSheet.Range("E5").Value
End With
With ActiveChart.Axes(xlCategory)
.MaximumScale = 0
.MinimumScale = -(ActiveSheet.Range("D10").Value)
End With
ActiveSheet.Shapes("Chart_Plan").Height = ActiveSheet.Range("E7").Value
ActiveSheet.Shapes("Chart_Left").Height = ActiveSheet.Range("E7").Value
ActiveSheet.Shapes("Chart_Right").Height = ActiveSheet.Range("E7").Value
ActiveSheet.Shapes("Chart_Plan").Top = 2.83 * 120
ActiveSheet.Shapes("Chart_Left").Top = 2.83 * 120
ActiveSheet.Shapes("Chart_Right").Top = 2.83 * 120
ActiveSheet.Shapes("Chart_Plan").Width = ActiveSheet.Range("D7").Value
ActiveSheet.Shapes("Chart_Left").Width = 3 * (ActiveSheet.Range("D10").Value)
ActiveSheet.Shapes("Chart_Right").Width = 3 * (ActiveSheet.Range("D10").Value)
ActiveSheet.Shapes("Chart_Left").Left = 2.83 * 240
ActiveSheet.Shapes("Chart_Plan").Left = 2.83 * (240 + (ActiveSheet.Range("D10").Value) + 20)
ActiveSheet.Shapes("Chart_Right").Left = (2.83 * (240 + (ActiveSheet.Range("D10").Value) + 40)) + (ActiveSheet.Range("D7").Value)
End Sub
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.