如何偏移 VBA 中同一工作表中的所有图表?

how do i offset all the charts in the same worksheet in VBA?

目前,在 运行 我的代码之后,我的所有图表都挤在同一工作表的同一位置。所以要查看它们,我必须手动将它们拖动并移动到另一个位置。那么有没有一种方法可以让我按预期输出所示有序地放置所有图表?如果真的不可能做这样的事情,我可以接受每 20 个单元格偏移一次图形,尽管这对于查看来说有点不方便,但我仍然尝试这样做,但是当我在当前输出中包含代码时未能实现使用抵消代码。

当前输出(看起来有1个图表,但所有图表都在同一个位置)

下面是我当前输出的代码

Sub plotgraphs()

'Call meangraph
Call sigmagraph

End Sub
Private Sub sigmagraph()
    Dim i As Long, c As Long
    Dim shp As Shape
    Dim Cht As chart, co As Shape
    Dim rngDB As Range, rngX As Range, rngY As Range

    Dim Srs As Series
    Dim ws As Worksheet

    Set ws = Sheets("Data")

    Set rngDB = ws.Range("A1").CurrentRegion

    Set rngX = rngDB.Columns(1)
    Set rngY = rngDB.Columns(4)

    Do While Application.CountA(rngY) > 0

        Set co = Worksheets("meangraphs").Shapes.AddChart
        Set Cht = co.chart

        With Cht
            .ChartType = xlXYScatter
            'remove any data which might have been
            '  picked up when adding the chart
            Do While .SeriesCollection.Count > 0
                .SeriesCollection(1).Delete
            Loop
            'add the data
            With .SeriesCollection.NewSeries()
                .XValues = rngX.Value
                .Values = rngY.Value
            End With
            'formatting...
            With Cht.Axes(xlValue)
                .MinimumScale = 0
                .MaximumScale = 0.5
                .TickLabels.NumberFormat = "0.00E+00"
            End With
            Cht.Axes(xlCategory, xlPrimary).HasTitle = True
            Cht.Axes(xlValue, xlPrimary).HasTitle = True
        End With

        Set rngY = rngY.Offset(0, 2) 'next y values

    Loop

每20个单元格偏移图表的代码(未能实现)

 Dim OutSht As Worksheet
'
   Dim PlaceInRange As Range

    Set OutSht = ActiveWorkbook.Sheets("sigmagraphs") '<~~ Output sheet
   Set PlaceInRange = OutSht.Range("B2:J21")        '<~~ Output location
'


'    To place charts at a distance between them
    For Each chart In Sheets("sigmagraphs").ChartObjects
'        OutSht.Paste PlaceInRange
'        Code below changes the range itself to something 20 rows below
        Set PlaceInRange = PlaceInRange.Offset(20, 0)
   Next chart

预期输出

您要查找的是包含图表的形状的 .Left.Top 属性。

例如,将图表设置为 2 列网格的宏如下所示:

Sub SetupChartsIntoGrid()

    Const TopAnchor As Long = 50
    Const LeftAnchor As Long = 50
    Const HorizontalSpacing As Long = 10
    Const VerticalSpacing As Long = 10
    Const ChartHeight As Long = 211
    Const ChartWidth As Long = 360

    Dim shp As Shape
    For Each shp In ActiveSheet.Shapes
        If shp.Type = msoChart Then
            Dim Counter As Long
            Counter = Counter + 1
            With shp
                .Top = TopAnchor + (WorksheetFunction.RoundUp(Counter / 2, 0) - 1) * (VerticalSpacing + ChartHeight)
                .Left = LeftAnchor + ((Counter + 1) Mod 2) * (HorizontalSpacing + ChartWidth)
            End With
        End If
    Next

End Sub