Добавить в корзинуПозвонить
Найти в Дзене
Макрос решает

Почему в VBA не меняется шрифт — разбор ошибки с Font.Name

Разбираем, почему в VBA не меняется шрифт, хотя код выполняется. Причины, ловушки и реальные примеры. Вы пишете макрос, всё выглядит правильно, ошибок нет, код отрабатывает для каждой ячейки — а на листе не меняется ничего. И возникает ощущение, что VBA «не применяет» изменения. На практике в 90% случаев проблема не в коде. Она в том, как Excel работает с форматированием. Разберёмся на реальном примере. Есть цикл по ячейкам: For Each old_c In Current.Range(Current.Cells(1, 1), Current.Cells(lLastRow, lLastCol)).Cells
Set new_c = new_sh.Cells(old_c.Row, old_c.Column)
new_c.Font.Name = old_c.Font.Name
Next old_c Код проходит по всем ячейкам, выполняется без ошибок, но шрифт визуально не меняется. И кажется, что строка: new_c.Font.Name = old_c.Font.Name не работает. Самая частая ситуация — банальная. Шрифт уже одинаковый. Вы копируете:
— Calibri → Calibri
— Arial → Arial Excel честно выполняет присвоение, но визуально ничего не происходит. Код отработал идеально, просто результата не ви
Оглавление

Разбираем, почему в VBA не меняется шрифт, хотя код выполняется. Причины, ловушки и реальные примеры.

Вы пишете макрос, всё выглядит правильно, ошибок нет, код отрабатывает для каждой ячейки — а на листе не меняется ничего. И возникает ощущение, что VBA «не применяет» изменения.

На практике в 90% случаев проблема не в коде. Она в том, как Excel работает с форматированием. Разберёмся на реальном примере.

Ситуация, с которой сталкиваются почти все

Есть цикл по ячейкам:

For Each old_c In Current.Range(Current.Cells(1, 1), Current.Cells(lLastRow, lLastCol)).Cells
Set new_c = new_sh.Cells(old_c.Row, old_c.Column)
new_c.Font.Name = old_c.Font.Name
Next old_c

Код проходит по всем ячейкам, выполняется без ошибок, но шрифт визуально не меняется.

И кажется, что строка:

new_c.Font.Name = old_c.Font.Name

не работает.

Главная причина: менять нечего

Самая частая ситуация — банальная. Шрифт уже одинаковый.

Вы копируете:
— Calibri → Calibri
— Arial → Arial

Excel честно выполняет присвоение, но визуально ничего не происходит. Код отработал идеально, просто результата не видно.

Почему это вводит в заблуждение

Потому что:

— цикл идёт по каждой ячейке
— ошибок нет
— логика выглядит правильной

Но Excel не обязан «показывать изменение», если оно фактически отсутствует.

Вторая причина: шрифт задаётся не напрямую

В Excel есть уровни, на которых формируется внешний вид ячейки:

— прямое форматирование
— стиль
— условное форматирование

И вот здесь начинается самое интересное. Даже если VBA присвоил:

new_c.Font.Name = "Arial"

Excel может отрисовать ячейку иначе.

Когда шрифт «перекрывается»

Есть два механизма, которые чаще всего мешают.

1. Условное форматирование

Если на диапазоне есть правило, которое меняет формат текста, оно применяется после VBA.

То есть:

— VBA установил шрифт
— Excel применил правило
— вы видите не то, что задали

И создаётся ощущение, что код не сработал.

2. Стили

Стили работают мягче, но эффект похожий. Если ячейка привязана к стилю, который задаёт параметры шрифта, визуально изменения могут не проявляться. Особенно в корпоративных шаблонах, где стили используются активно.

Третья причина: меняется не то, что вы думаете

Многие считают, что достаточно изменить:

Font.Name

Но внешний вид текста — это не только имя шрифта. На него влияют:

— размер
— жирность
— курсив
— цвет
— тема

В итоге вы меняете имя, а визуально разницы почти нет.

Почему это выглядит как «код не работает»

Потому что мозг ожидает:

«Я изменил шрифт → текст должен выглядеть иначе»

А Excel делает:

«Я изменил имя шрифта → но внешний вид почти не поменялся»

И появляется ощущение, что ничего не произошло.

Четвёртая причина: защита листа

Если лист защищён, часть форматирования может блокироваться. Код выполняется, но результат не применяется. И снова:
— ошибок нет
— результата нет

Пятая причина: Rich Text внутри ячейки

Это более редкий, но неприятный случай. Если в одной ячейке текст оформлен частями (разные шрифты внутри одной строки), то:

— изменение через .Font.Name применяется не так, как ожидается
— визуально может казаться, что ничего не изменилось

Потому что Excel хранит формат на уровне символов.

Почему строка работает, но вы этого не видите

Вот ключевая мысль, которую важно понять. Строка:

new_c.Font.Name = old_c.Font.Name

в большинстве случаев работает корректно. Но:

— либо значение не меняется
— либо его перекрывает Excel
— либо изменение визуально незначительное

И всё это выглядит как «макрос не сработал».

Самая частая ошибка в логике

Новички думают:

«Если код выполнился — должен быть видимый результат»

Но в Excel это не так. Иногда:

— код изменил свойство
— Excel пересчитал отображение
— вы видите прежнюю картинку

Когда шрифт действительно не меняется

Такие ситуации тоже бывают, но они редкие:

— защита листа блокирует форматирование
— внешние ограничения (шаблон, надстройка)
— конфликт с условным форматированием

Во всех остальных случаях код выполняется нормально.

Итог

Если шрифт «не меняется», это почти никогда не ошибка VBA. Это особенность Excel. Причины обычно такие:

— шрифт уже одинаковый
— его перекрывает условное форматирование
— влияет стиль
— меняется только имя, а не внешний вид
— в ячейке сложное форматирование

И самое важное:

👉 код чаще всего работает правильно
👉 проблема в ожиданиях, а не в VBA

Если вы это понимаете, вы перестаёте «чинить код, который не сломан» и начинаете быстрее находить реальные причины.

📌 В Telegram разбираю такие ситуации на реальных примерах и показываю, как их диагностировать.

Напишите в комментариях, где у вас «ничего не менялось» в Excel — разберём и покажу, что на самом деле происходило.