Реальное кодирование зависит от точных требований. Я сделал быстрый пример, который упорядочивает все графики по заголовкам. Он имеет некоторые ограничения (например, он не выполняет сортировку) и помещает все диаграммы с одинаковыми заголовками в одну строку.
Код использует словарь с заголовком диаграммы в качестве ключей, логической позицией (содержащей строки и столбцы) и значением.
Он перебирает все графики, выбирает заголовок и проверяет, есть ли заголовок в словаре. Если да, он получает позицию предыдущего графика с тем же заголовком и увеличивает логический столбец на 1. Если нет, в словарь добавляется новая логическая строка (строка = размер словаря и столбец = 0).
Диаграмма размещается путем вычисления Width
и Height
с использованием логической позиции, умноженной на некоторые константы.
Sub sortChartsByTitle()
Const startX = 50 ' Left margin
Const startY = 50 ' Top margin
Const deltaX = 400
Const deltay = 260
Dim chartTitleList As Dictionary, co As ChartObject
Dim chartPos As cPos
Set chartTitleList = New Dictionary
For Each co In ActiveSheet.ChartObjects
Dim title As String
title = ""
If co.Chart.HasTitle Then
title = co.Chart.ChartTitle.Text ' Get ChartTitle (if any)
End If
If title = "" Then
title = "(no title)" ' Set a default if chart has no title or title is empty
End If
If chartTitleList.Exists(title) Then
' There was already one chart with same title.
Set chartPos = chartTitleList(title) ' Get logical position
chartPos.col = chartPos.col + 1 ' Jump one to the left
Set chartTitleList(title) = chartPos ' Remember thus new position
Else
Set chartPos = New cPos ' Create a new logical position
chartPos.row = chartTitleList.Count ' Row = size of dictionary
chartPos.col = 0 ' Col = 0
Call chartTitleList.Add(title, chartPos) ' Add to Dictionary
End If
' Position chart
co.Left = startX + chartPos.col * deltaX
co.Top = startY + chartPos.row * deltay
Next co
End Sub
Вам нужен тип объекта для хранения логической позиции, поэтому добавьте модуль класса с именем cPos
. Все, что вам нужно, есть (конечно, вы можете обернуть это с помощью сеттера и геттера ...)
Option Explicit
Public row As Integer
Public col As Integer