简体   繁体   中英

How can I resize multiple charts to different sizes in Excel VBA for Mac?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM