Изменение размера шрифта метки оси в воронкообразной диаграмме (Excel 2016)

Я хочу изменить размер шрифта по оси xlCategory. Я запускаю код, как показано ниже, но он не работает. Я застрял в поиске обходных путей. График типа "Воронка" 123. На других типах графиков код работает нормально.

With ActiveChart.Axes(xlCategory).TickLabels.font
    .size = 12
    .Name = "Arial"
End With

Я получаю сообщение об ошибке:

"объект не поддерживает это действие"

Я также пытался запустить другой код, но тоже безуспешно.

ActiveChart.Axes(xlCategory).Select
With Selection.Format.TextFrame2.TextRange.font
    .size = 12
End With

Я получаю сообщение об ошибке:

"метод textframe2 объекта chartformat не выполнен"


person Maciek Wojciechowski    schedule 27.11.2018    source источник


Ответы (1)


Это очень своеобразный баг!

Я предполагаю, что это связано с тем, что ось XlCategory становится вертикальной, когда вы используете тип диаграммы "Воронка":

введите здесь описание изображения

Я пробовал все стандартные способы VBA, о которых только мог подумать, и это, похоже, не работает. Я даже пытался посмотреть, можем ли мы сохранить воронкообразную диаграмму в качестве шаблона, а затем использовать VBA для применения этого шаблона, но «Сохранить как шаблон» по какой-то причине недоступно...

введите здесь описание изображения

Итак, причина, по которой я объясняю все это вместо того, чтобы писать решение, заключается в том, что есть обходной путь, но такие вещи следует использовать только в крайнем случае. И если вы не догадались, я говорю об использовании метода SendKeys.

Отказ от ответственности. Как всегда, использование SendKeys несколько сложно и может привести к неожиданным результатам. Я бы порекомендовал прочитать несколько статей, чтобы ознакомиться с ним, прежде чем использовать его. Эта статья может стать хорошей отправной точкой.

Кроме того, во избежание проблем не запускайте макрос с методом SendKeys с помощью кнопки «Выполнить» введите здесь описание изображения в VBE, так как нажатие клавиши должно быть отправлено в окно Excel, а не в окно VBE. Я предлагаю запустить макрос с помощью ярлыка для запуска вашего макроса. Например, вы можете использовать приложение . OnKey метод, запустив макрос, подобный этому:

Sub SetShortcut()

    'Set the shortcut for the macro to be CTRL+ALT+m
    Application.OnKey "^%m", "NameOfYourMacro"

End Sub

Пример использования Sendkeys

Идея состоит в том, чтобы использовать Sendkeys для отправки последовательности нажатий клавиш, которая даст нам желаемый результат. Здесь мы хотим изменить размер и имя шрифта оси XlCategory. Этого можно добиться, используя правильную последовательность сочетаний клавиш Alt. Я не уверен, что последовательность одинакова для всех версий Excel, но в Office 365, если бы мы хотели изменить имя шрифта, это было бы так:

  1. Введите Alt, чтобы активировать комбинацию клавиш Alt.
  2. Введите «H» — чтобы перейти на вкладку «Главная».
  3. Введите «FF» — чтобы выбрать текстовое поле «Имя шрифта».
  4. Введите «Arial» и нажмите Enter, чтобы изменить шрифт на Arial.

Чтобы применить это к оси XlCategory, нам нужно убедиться, что она уже выбрана до запуска макроса. Если он выбран, следующий код должен помочь:

Sub ChangeCategoryAxisFont()

    'Font Name
    Application.SendKeys Keys:="%", Wait:=True
    Application.SendKeys Keys:="H", Wait:=True
    Application.SendKeys Keys:="FF", Wait:=True
    Application.SendKeys Keys:="Arial", Wait:=True
    Application.SendKeys Keys:="~", Wait:=True 'Press Enter

    'Size
    Application.SendKeys Keys:="%", Wait:=True
    Application.SendKeys Keys:="H", Wait:=True
    Application.SendKeys Keys:="FS", Wait:=True
    Application.SendKeys Keys:="12", Wait:=True
    Application.SendKeys Keys:="~", Wait:=True 'Press Enter

    'Restore Numlock (which gets disabled when your macro runs at least one SendKeys command)
    Application.SendKeys Keys:="{NUMLOCK}", Wait:=True

End Sub

Если он еще не выбран (даже если диаграмма выбрана), у вас может возникнуть другая проблема: если вы включите ActiveChart.Axes(xlCategory).Select в свой макрос, параметры, доступные на ленте, не будут обновлены правильно, и макрос выше не будет работать. Чтобы позволить ленте обновиться, нам нужно было бы прекратить выполнение любого макроса на короткую секунду, а затем продолжить наш макрос.

Например, вы можете использовать метод Application.OnTime, чтобы запланировать запуск макроса на одну секунду позже, например:

Sub PreSelectAxisAndRunMainMacro()

    ActiveChart.Axes(xlCategory).Select
    Application.OnTime Now + TimeSerial(0, 0, 1), "ChangeCategoryAxisFont"

End Sub

Я знаю, что вы можете подумать: «Все это только для того, чтобы изменить шрифт?!». Да, я знаю, но, по крайней мере, если вы ознакомитесь с тем, как использовать метод SendKeys, вы сможете использовать его в других контекстах, где это необходимо...

person DecimalTurn    schedule 28.11.2018
comment
Большое спасибо. Этот обходной путь решил мою проблему, на которую я потратил много часов. - person Maciek Wojciechowski; 28.11.2018
comment
@MaciekWojciechowski Я рад, что смог помочь. Если это решит ваш вопрос, подумайте о том, чтобы принять его, нажав на галочку. Это не является обязательством, но это показывает более широкому сообществу, что вы нашли решение, и дает некоторую репутацию как отвечающему, так и вам. - person DecimalTurn; 29.11.2018