Условно добавить изображения в пузырьковую диаграмму?
Мне нужно массово производить пузырьковые диаграммы для большого набора групп пиров, где каждая диаграмма показывает анонимные данные группы пиров, но выделяет интересующую группу с логотипом своей команды. Я хотел бы автоматизировать это с VBA, но мне интересно, можно ли вообще условно добавить картинку к пузырю интереса на каждом графике? Прямо сейчас это ручной процесс и занимает довольно много времени.
Например, на диаграмме 1 команда A представляет интересующую команду и имеет свой логотип на своем пузыре, в то время как остальные пузыри имеют одинаковый сплошной цвет. На диаграмме 2 команда B - это команда интересов и т. Д.
2 ответа
Я понял это. Началось с того, что мне нужно было настроить мои данные с двумя определенными рядами, где один ряд представляет интересующую группу, а второй - группы пиров, а затем условно заполнить ячейки в моей таблице данных на основе группы. Настройка потребовала много времени, чтобы разобраться и выглядит исчерпывающей в инструкциях ниже, но на самом деле это не так уж плохо.
Все, выделенное синим цветом, является формулой, поэтому вот как я это сделал:
- В столбце B я использовал формулу, чтобы определить, какой ряд какой: =IF(A5<>A$1,"Peers","Group")
- Введены мои значения X и Y (столбцы C и D).
- Установите размер моего пузыря (столбец E) для автоматической настройки в зависимости от серии: =IF(A5=A 1000 250 долл. США)
- Используются столбцы F и G для обрезки десятичных разрядов.
- Столбцы с H по L отражают фактическую серию данных, основанную на том, является ли группа равноправной или интересующей группой.
- X всегда будут оставаться одинаковыми, поэтому я связал столбец H с исходным значением оси X: =C5
- Столбец I получает соответствующее значение Y, если это группа пиров: =IF($B5=$I3,$D5,NA())
- Столбец J устанавливает размер пузыря в группе равных: =IF(ISNA($I5),NA(),$E5)
- Столбец K выводит соответствующее значение Y, если это интересующая группа: =IF($B5=$K$3,$D5,NA())
- В столбце L задается размер пузырька группы интересов: =IF(ISNA($K5),NA(),$E5)
- Столбец M устанавливает все размеры пузырьков одинаково и используется для окончательного создания диаграммы, где все группы и их логотипы отображаются вместе.
- Ячейки O4 (=VLOOKUP(A1, логотипы!A:B,2,FALSE)) и P4 (=IF(O4=1,"группа1",IF(O4=2,"группа2",IF(O4=3,"group3",IF(O4=4,"group4"))))) определить и вытащить правильный логотип при выборе группы интересов.
Затем мне пришлось настроить и связать все свои логотипы / изображения на отдельной вкладке ("Логотипы"). YouTube Oz du Soleil на YouTube на тему "Выберите изображение на основе значения ячейки" был очень полезен для достижения этой цели. У меня недостаточно репутации, чтобы разместить прямую ссылку.
Я создал и отформатировал свои пузырьковые диаграммы, затем выбрал необходимые данные для каждой серии, используя столбцы H (ось X), I/K (ось Y) и J/L (ось Z для размера пузырьков).
Для полной диаграммы логотипа группы мне понадобилась только одна серия, потому что все пузырьки были бы одинакового размера. Я использовал столбцы C, D и M для осей X, Y и Z соответственно. Затем я применил логотип каждой группы к соответствующим пузырькам.
Сам код оказался довольно простым после установки:
Dim i As Long
Dim iLastRow As Long
Dim Cells As Range
'This section looks up each group name on the tab and cycles through the loop
Application.ScreenUpdating = False
With ActiveSheet
iLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
For i = 4 To iLastRow - 1 'Group names start in A5
'Selects, copies, and pastes the next group name in the list
Sheets("Groups").Select
ActiveSheet.Cells(i + 1, 1).Copy
Range("A1").Select
Selection.PasteSpecial paste:=xlPasteValues
'Selects, copies, and pastes the group logo onto the bubble
ActiveSheet.Shapes.Range(Array("Picture 7")).Select
Selection.CopyPicture xlScreen, xlPicture
ActiveSheet.ChartObjects("Chart 6").Activate
ActiveChart.FullSeriesCollection(2).Select
Selection.paste
'Variables needed for directory and file names
GroupName = Sheets("Groups").Range("A1")
yearmo = Sheets("Groups").Range("A2")
'Will create a new folder for the final images if it doesn't already exist
If Len(Dir("DirPath\" & yearmo, vbDirectory)) = 0 Then
MkDir "DirPath\" & yearmo
End If
'Set up image file names
Dim NewFileName As String
NewFileName = "\" & yearmo & " - " & GroupName & " - X_Y.jpg"
'Selects and saves the bubble chart as a JPG
ActiveChart.ChartArea.Select
ActiveChart.Export "DirPath\" & yearmo & NewFileName
Next i
End With
'After all individual bubble have been created, need to
'set up state file name to generate image with all logos for the state
Dim StateFileName As String
StateFileName = "\" & yearmo & " - STATE - X_Y.jpg"
'Selects and saves the state bubble chart as a JPG
ActiveSheet.ChartObjects("Chart 4").Activate
ActiveChart.Export "DirPath\" & yearmo & StateFileName
Я выбрал использование меток на графике, потому что попытка их динамического позиционирования не стоила усилий. Вместо этого я начал создавать связанные текстовые поля под диаграммой.
Надеюсь, это поможет другим; это, безусловно, экономит время благодаря ручным обновлениям.
Я не могу оставить комментарий. Но отчасти проблема в том, что вы каждый раз регенерируете данные и графики. Таким образом, решение для использования обычно "косвенное". Решите более простую проблему.
Не могли бы вы иметь скрытый лист, на котором есть все логотипы. Рядом с логотипами находится номер, соответствующий этому логотипу (логотип или имя файла логотипа).
Затем напишите макрос, который, если эти числа верны, назначает нужный логотип (т.е. вы просто обновляете этот лист и используете этот лист в качестве массива в VBA).
Наконец, если вы отправляете лист, вы обновляете только ОДИН логотип, то я бы включил это либо в часть имени файла (и использовал его в формуле), либо поместил бы его в более заметную ячейку. Тогда ваша связь сделана. Одно изменение в этой ячейке, нажмите макрос, и все готово.
Не видя немного больше кода, с которым вы работаете. Я не могу дать больше помощи.