Бесплатный урок Авторский курс AI University
Урок 03 · Текст · ~5 мин

Excel для конструктора: формулы, которые пишет ИИ

Урок 3 из 15 курса «ИИ для инженера-конструктора: макросы, API САПР, Excel и расчёты»: неофициальный курс AI University о применении ИИ в работе конструктора. Этот урок бесплатный.

Ведомость металлопроката у многих конструкторов живёт в Excel и собирается вручную: выписали из модели позиции, нашли в справочнике массу погонного метра, перемножили, сложили по профилям. Ошибка в одной ячейке или лишний пробел в слове «Уголок» тихо съедают десятки килограммов, и это всплывает уже на складе. Формулы, которые всё это считают сами, давно есть в Excel, просто мало кто помнит их синтаксис наизусть. Помнить и не нужно: формулы отлично пишет ИИ, если правильно описать ему лист.

Авторский курс AI University. Названия программ и товарные знаки принадлежат их правообладателям. Код из уроков проверяйте на копиях файлов: ответственность за результат на инженере.

В этом уроке вы научитесь ставить ИИ задачу на формулу так, чтобы она сработала с первого раза, соберёте справочник сортамента на отдельном листе, посчитаете массу по длине и количеству, сведёте итоги по профилям и настроите подсветку ошибок. В практикуме будет готовая ведомость металлопроката и короткий скрипт на Python, который независимо пересчитывает её и ловит расхождения. Все формулы урока мы проверили в Excel из Microsoft 365, а пересчёт сверили с Python.

ИИ как автор формул: как поставить задачу

Модель не видит ваш файл. Она видит только то, что вы написали в чате. Поэтому главный навык в работе с формулами: описать лист так, чтобы его можно было представить, не открывая. Хорошее описание отвечает на пять вопросов.

1. Программа и версия: Excel из Microsoft 365, Excel 2016, Р7-Офис, LibreOffice.
   От этого зависит, есть ли ПРОСМОТРX, ФИЛЬТР, LET и динамические массивы.
2. Язык интерфейса: русский Excel ждёт русские имена функций (СУММЕСЛИМН, а не SUMIFS)
   и точку с запятой между аргументами, а не запятую.
3. Структура: имя листа, буквы столбцов, строка заголовка, с какой строки данные,
   где справочник. Лучше всего вставить 3-5 строк образца как текст.
4. Что нужно получить: в какой ячейке, что считать, что выводить, если данных нет.
5. Подводные камни, которые вы знаете: пробелы, русская и латинская «х» в типоразмере,
   пустые строки, длины в миллиметрах, а масса в кг на метр.

Пункт про язык интерфейса важнее, чем кажется. Модели чаще всего видели в обучающих данных английские формулы с запятыми, и по умолчанию напишут =SUMIFS(H:H,B:B,"Уголок"). В русском Excel такая формула не вставится. Попросите прямо: «русские имена функций, разделитель аргументов точка с запятой, десятичный разделитель запятая». Если ИИ всё-таки выдал английскую версию, просто ответьте: «переведи на русские имена функций и точку с запятой».

Вот функции, которые закрывают почти всю табличную рутину конструктора. Запоминать их не нужно, но полезно знать, что они существуют, чтобы просить нужное.

ВПР (VLOOKUP)          поиск по первому столбцу справочника; старая, работает везде
ПРОСМОТРX (XLOOKUP)    поиск по любому столбцу, с ответом «если не найдено»; Excel 2021, 365
СУММЕСЛИМН (SUMIFS)    сумма по нескольким условиям: масса по профилю и марке стали
СУММПРОИЗВ (SUMPRODUCT) сумма произведений; умеет условия с обработкой текста внутри
ФИЛЬТР (FILTER)        выбирает строки по условию, результат «разливается» на соседние ячейки
УНИК, СОРТ (UNIQUE, SORT)  список без повторов, сортировка; удобно для итогов
LET                    даёт имена промежуточным значениям внутри одной формулы
ТЕКСТ (TEXT)           число в текст по маске: =ТЕКСТ(A2;"0,00") для подписей и обозначений
ТЕКСТДО, ТЕКСТПОСЛЕ    часть строки до и после разделителя: «57x3,5» -> 57 и 3,5
ЕСЛИОШИБКА (IFERROR)   подставляет своё значение вместо #Н/Д и прочих ошибок

ФИЛЬТР, УНИК, СОРТ и LET работают в режиме динамических массивов: вы пишете формулу в одну ячейку, а результат занимает столько строк, сколько нужно. Если ниже стоят какие-то данные, Excel покажет ошибку #ПЕРЕНОС! (в английском интерфейсе #SPILL!). Мы на неё наступили при проверке урока: формула ФИЛЬТР хотела вывести три столбца, а в третьем уже была другая формула. Лечится тем, что под и справа от такой формулы оставляют пустое место.

ВПР против ПРОСМОТРX: если в вашем Excel есть ПРОСМОТРX, просите её. Она не зависит от порядка столбцов, не ломается при вставке столбца в справочник и сразу принимает текст на случай «не найдено». ВПР оставьте для старых версий и файлов, которые откроют на чужих машинах.

LET стоит попросить, когда формула становится длинной. Без LET одно и то же выражение, например очищенный от пробелов типоразмер, приходится повторять несколько раз, и при правке вы обязательно забудете один из повторов. С LET вы один раз пишете size;ПОДСТАВИТЬ(СЖПРОБЕЛЫ(C2);"х";"x"), а дальше используете имя size. Такую формулу проще читать и вам, и ИИ, когда вы попросите её поправить.

Ещё один приём: просите ИИ объяснить формулу по частям. Фраза «разбери эту формулу по шагам и скажи, что вернёт каждая часть для строки 5» быстро показывает, понял ли он задачу. Если в объяснении всплывает «предполагаю, что данные начинаются со строки 1», а у вас заголовок в строке 3, вы поймали ошибку до того, как она попала в ведомость.

Справочник сортамента и расчёт массы

Масса погонного метра не должна жить внутри формул в виде чисел. Сделайте отдельный лист «Сортамент» и оформите его как таблицу Excel: выделите диапазон, «Вставка», «Таблица», затем на вкладке «Конструктор таблиц» задайте имя таблицы, например «Сортамент». Теперь формулы могут ссылаться на столбцы по именам: Сортамент[Масса], Сортамент[Профиль]. При добавлении строк в справочник ссылки растут сами.

Структура справочника для примера урока:

Профиль   Типоразмер  D    S    Масса   ГОСТ
Швеллер   10П                   8,59    ГОСТ 8240-97
Швеллер   12П                   10,4    ГОСТ 8240-97
Швеллер   16П                   14,2    ГОСТ 8240-97
Швеллер   20П                   18,4    ГОСТ 8240-97
Уголок    50x5                  3,77    ГОСТ 8509-93
Уголок    63x5                  4,81    ГОСТ 8509-93
Уголок    63x6                  5,72    ГОСТ 8509-93
Уголок    75x6                  6,89    ГОСТ 8509-93
Уголок    100x8                 12,25   ГОСТ 8509-93
Труба     57x3,5      57   3,5  формула ГОСТ 8732-78
Труба     76x4        76   4    формула ГОСТ 8732-78
Труба     89x4        89   4    формула ГОСТ 8732-78
Труба     108x4       108  4    формула ГОСТ 8732-78

Значения массы для швеллеров и уголков мы сверили с таблицами ГОСТ 8240-97 и ГОСТ 8509-93 (масса 1 м в кг, плотность стали 7,85 г/см³). Это несколько строк для примера, а не полный сортамент. Свой справочник заполняйте из текста стандарта или из справочника вашего предприятия, и не просите ИИ «заполнить таблицу масс по ГОСТ»: модель уверенно выдаст правдоподобные числа, часть из которых окажется неверной. Справочные значения ИИ не генерирует, их переписывают из первоисточника. А вот формулы и проверку справочника ИИ делает хорошо.

Для бесшовных труб ГОСТ 8732-78 сам даёт формулу массы 1 м: 0,02466 умножить на толщину стенки S и на разность наружного диаметра и стенки (D минус S), всё в миллиметрах, результат в килограммах. В справочнике это одна формула для всего столбца:

=ОКРУГЛ(0,02466*[@S]*([@D]-[@S]);2)

Для 57x3,5 получается 4,62 кг, для 76x4 ровно 7,10, для 89x4 8,38, для 108x4 10,26. Тот же результат даёт Python в практикуме. Формулу удобно держать в справочнике, а не в ведомости: тогда ведомость всегда ищет готовую массу по одному правилу для всех профилей.

Одно наблюдение из проверки урока: Excel капризничает с именами столбцов, где смешаны латиница, кириллица и подчёркивание. Ссылка [@D_мм] у нас не принималась, а [@D] и [@Стенка] работали. Называйте столбцы справочника коротко и одним алфавитом, это избавит от непонятных отказов.

Расчёт массы в ведомости выглядит так. В строке позиции есть профиль (B), типоразмер (C), длина в мм (D) и количество (E). Масса метра ищется по двум условиям сразу: профиль и типоразмер.

F2 (масса 1 м):
=LET(prof;СЖПРОБЕЛЫ(B2);size;ПОДСТАВИТЬ(СЖПРОБЕЛЫ(C2);"х";"x");
 ПРОСМОТРX(1;(Сортамент[Профиль]=prof)*(Сортамент[Типоразмер]=size);Сортамент[Масса];"нет в справочнике"))

G2 (масса 1 шт): =ЕСЛИ(ЕЧИСЛО(F2);F2*D2/1000;0)
H2 (масса всего): =ЕСЛИ(ЕЧИСЛО(G2);G2*E2;0)

Конструкция (условие1)*(условие2) внутри ПРОСМОТРX превращает два столбца истинности в столбец единиц и нулей, а мы ищем в нём единицу. Это стандартный приём поиска по нескольким условиям, и ИИ его знает, если попросить «поиск по двум столбцам через ПРОСМОТРX». СЖПРОБЕЛЫ убирает пробелы по краям, ПОДСТАВИТЬ меняет кириллическую «х» на латинскую, потому что в справочнике типоразмеры набраны латиницей. Именно эти две мелочи чаще всего ломают ведомости, собранные из выгрузок САПР и ручного ввода.

Если типоразмера трубы нет в справочнике, массу можно посчитать прямо из строки «89x5» той же формулой ГОСТ:

=LET(ts;ПОДСТАВИТЬ(C9;"х";"x");d;ЗНАЧЕН(ТЕКСТДО(ts;"x"));s;ЗНАЧЕН(ТЕКСТПОСЛЕ(ts;"x"));
 ОКРУГЛ(0,02466*s*(d-s);2))

Для «89x5» это 10,36 кг/м. ЗНАЧЕН в русском Excel читает «3,5» с запятой, а в английском понадобится заменить запятую на точку: это ровно та разница локалей, о которой стоит сказать ИИ заранее. ТЕКСТДО и ТЕКСТПОСЛЕ есть в Excel из Microsoft 365 и Excel 2024, в более старых версиях попросите ИИ переписать через ПОИСК и ПСТР.

Power Query и проверки: сведение выгрузок и подсветка ошибок

Когда исходные данные приходят не одной таблицей, а пачкой файлов (выгрузка спецификации из каждой сборки, отчёт из САПР по каждому листу), формулы неудобны. Для сведения однотипных файлов в Excel есть встроенный Power Query. По справке Microsoft путь такой: «Данные», «Получить данные», «Из файла», «Из папки», выбрать папку, затем внизу окна кнопка «Объединить» и пункт «Объединить и преобразовать данные». Power Query возьмёт один файл как образец, разберёт его структуру и применит ко всем остальным. В редакторе запросов вы удаляете лишние строки и столбцы, задаёте типы, и при следующей выгрузке достаточно нажать «Обновить все».

Перед объединением уберите из папки посторонние файлы: Power Query честно попробует сложить всё, что лежит рядом. Точные подписи кнопок в разных сборках Excel немного отличаются, ориентируйтесь на свою версию. ИИ здесь помогает в двух местах. Первое: он пишет шаги на языке M, если вставить ему текст запроса из «Расширенного редактора» и описать, что нужно поменять. Второе: он объясняет, почему запрос упал на новом файле. Чаще всего причина в том, что в одной из выгрузок переименовали столбец. Если структура файлов сильно гуляет или нужна логика вроде «найди строку заголовка, пропусти разделы», удобнее Python: этим занимается урок 4.

Вторая половина надёжной ведомости: она сама показывает, где ошибка. Для этого три инструмента.

Проверка данных (Данные, Проверка данных, тип «Список»):
  в столбце «Профиль» можно выбрать только значение из справочника,
  опечатки «Швелер» и «Уголок » с пробелом не пройдут на входе.

Условное форматирование (Главная, Условное форматирование, Создать правило,
«Использовать формулу для определения форматируемых ячеек»), диапазон A2:H100:
  =НЕ(ЕЧИСЛО($F2))            красная строка: масса не найдена в справочнике
  =ИЛИ($D2<=0;$D2>12000)      оранжевая строка: длина ноль или длиннее хлыста 12 м

Счётчик и список ошибок на листе «Итоги»:
  =СЧЁТЕСЛИ(Ведомость!F2:F100;"нет в справочнике")
  =ФИЛЬТР(Ведомость!A2:C100;Ведомость!F2:F100="нет в справочнике";"ошибок нет")

Знак доллара перед буквой столбца в правиле ($F2) важен: он заставляет каждую ячейку строки смотреть на свой столбец F, поэтому подсвечивается вся строка, а не одна ячейка. Если ИИ написал правило без доллара и подсветка «поехала», скажите ему именно это.

Итоги по профилям проще всего собрать формулами динамических массивов. Список профилей:

A2: =СОРТ(УНИК(СЖПРОБЕЛЫ(ФИЛЬТР(Ведомость!B2:B100;Ведомость!B2:B100<>""))))

Сумму массы по профилю хочется посчитать через СУММЕСЛИМН, и тут нас поджидала ловушка, которую мы поймали при проверке. В тестовой ведомости в одной строке было написано «Уголок » с пробелом в конце. СУММЕСЛИМН сравнивает текст буквально, и эта строка в сумму не попала: Excel показал 202,25 кг уголка вместо 269,21. Ни ошибки, ни подсветки, просто минус 67 кг. Поэтому для итогов мы взяли СУММПРОИЗВ, внутри которой можно почистить текст:

B2: =СУММПРОИЗВ((СЖПРОБЕЛЫ(Ведомость!$B$2:$B$100)=A2)*Ведомость!$H$2:$H$100)
C2 (длина, м): =СУММПРОИЗВ((СЖПРОБЕЛЫ(Ведомость!$B$2:$B$100)=A2)*Ведомость!$D$2:$D$100*Ведомость!$E$2:$E$100)/1000

Формулы B2 и C2 протяните вниз на столько строк, сколько профилей в списке. СУММПРОИЗВ не любит текст в перемножаемых ячейках, поэтому в G и H при ненайденной массе стоит 0, а не пустая строка. Ноль в сумму не попадает незаметно: строка всё равно горит красным, а счётчик ошибок не равен нулю.

Excel, Р7-Офис, МойОфис, LibreOffice: что совместимо

Многие предприятия перешли на российские офисные пакеты или работают в смешанной среде. Формулы из этого урока переносятся не все, и об этом надо сказать ИИ в первой же строке промпта. Что мы смогли проверить на 14.11.2026:

Excel (Microsoft 365, 2021, 2024):
  всё из урока работает; ТЕКСТДО и ТЕКСТПОСЛЕ только в 365 и 2024.
  Power Query есть в Excel для Windows, Mac и в веб-версии (по справке Microsoft).

Excel 2016, 2019:
  нет ПРОСМОТРX, ФИЛЬТР, УНИК, СОРТ, LET; просите ВПР, ИНДЕКС с ПОИСКПОЗ,
  СУММЕСЛИМН и сводные таблицы. Power Query встроен начиная с 2016.

LibreOffice Calc:
  с версии 24.8 (август 2024) появились XLOOKUP, XMATCH, FILTER, SORT, SORTBY,
  UNIQUE, LET, SEQUENCE, RANDARRAY. Power Query нет. Макросы на Basic и Python, не VBA.

Р7-Офис:
  макросы пишутся на JavaScript (по документации Р7), код VBA не выполняется,
  его нужно переписать. По отзывам пользователей ФИЛЬТР и СОРТ есть, но массивы
  ведут себя как в старом Excel. ПРОСМОТРX и LET мы в документации не нашли.

МойОфис Таблица:
  макросы на Lua; код VBA из файла можно прочитать, для перевода на Lua есть
  отдельный инструмент (по материалам МойОфис), напрямую VBA не выполняется.
  Поддержку ПРОСМОТРX и ФИЛЬТР подтвердить не удалось.

Практический вывод простой. Если файл уйдёт смежникам, у которых неизвестно что установлено, пишите формулы попроще: ВПР вместо ПРОСМОТРX, СУММЕСЛИМН вместо ФИЛЬТР, без LET. Если файл живёт только у вас, пользуйтесь всем. Для российских пакетов перед тем, как переводить ведомость, откройте маленький тестовый файл с каждой нужной функцией и посмотрите, считается ли он. Это пять минут, которые экономят день разбирательств. И помните про конфиденциальность: в промпт идёт структура листа и пара строк образца, а не вся ведомость заказчика с обозначениями.

Практикум

Задача: ведомость металлопроката для сварной рамы. Есть список позиций «профиль, типоразмер, длина, количество». Нужно посчитать массу каждой позиции и итоги по профилям, подсветить ошибки, а потом независимо проверить расчёт на Python.

Шаг 1. Промпт для ИИ. Подставьте свои данные вместо угловых скобок.

Нужны формулы для ведомости металлопроката в Excel.
Программа: <Excel из Microsoft 365, русский интерфейс>. Нужны русские имена функций,
разделитель аргументов точка с запятой, десятичный разделитель запятая.

Лист «Сортамент» оформлен как таблица Excel с именем «Сортамент», столбцы:
Профиль, Типоразмер, D, S, Масса (кг на 1 м), ГОСТ. Для труб D и S заполнены,
массу трубы считать по формуле ГОСТ 8732-78: 0,02466*S*(D-S), округлить до 0,01.

Лист «Ведомость», заголовок в строке 1, данные со строки 2:
A Поз., B Профиль, C Типоразмер, D Длина, мм, E Кол-во, шт,
F Масса 1 м, G Масса 1 шт, H Масса всего.
Пример строк:
<1 | Швеллер | 16П | 6000 | 4>
<5 | Уголок  | 50x5 | 740 | 24>
<7 | Труба | 57x3,5 | 3200 | 10>

Нужно:
1) формула в F2: масса 1 м из справочника по двум условиям (профиль и типоразмер),
   перед поиском убрать пробелы по краям и заменить кириллическую «х» на латинскую x,
   если не найдено, вывести текст «нет в справочнике»; используй LET и ПРОСМОТРX;
2) формулы G2 и H2; если массы нет, ставить 0, а не пустую строку;
3) лист «Итоги»: список профилей без повторов, масса и суммарная длина в метрах
   по каждому профилю; учти, что в столбце B могут быть лишние пробелы;
4) правила условного форматирования: строка красная, если масса не найдена,
   оранжевая, если длина <= 0 или больше <12000> мм;
5) счётчик строк с ошибками и формула ФИЛЬТР со списком этих строк.
Для каждой формулы укажи ячейку и одним предложением объясни, что она делает.
Справочные значения массы не придумывай, они уже в таблице.

Последняя строка промпта нужна, чтобы ИИ не начал «дополнять» справочник своими числами. Подсказка про пробелы в пункте 3 важна: без неё модель почти наверняка предложит СУММЕСЛИМН, и итог разойдётся так, как описано выше.

Шаг 2. Результат. Ответ ИИ может отличаться в деталях, но по смыслу должен совпасть с этим набором. Эти формулы мы проверили в Excel из Microsoft 365 на тестовой ведомости из десяти позиций, сравнивайте с ними то, что выдала ваша модель.

Лист «Сортамент», столбец Масса, только строки труб:
=ОКРУГЛ(0,02466*[@S]*([@D]-[@S]);2)

Лист «Ведомость»:
F2: =LET(prof;СЖПРОБЕЛЫ(B2);size;ПОДСТАВИТЬ(СЖПРОБЕЛЫ(C2);"х";"x");ПРОСМОТРX(1;(Сортамент[Профиль]=prof)*(Сортамент[Типоразмер]=size);Сортамент[Масса];"нет в справочнике"))
G2: =ЕСЛИ(ЕЧИСЛО(F2);F2*D2/1000;0)
H2: =ЕСЛИ(ЕЧИСЛО(G2);G2*E2;0)
Условное форматирование на A2:H100:
  =НЕ(ЕЧИСЛО($F2))          заливка красная
  =ИЛИ($D2<=0;$D2>12000)    заливка оранжевая

Лист «Итоги»:
A1: Профиль   B1: Масса, кг   C1: Длина, м   E1: Ошибок   F1: Строки с ошибками
A2: =СОРТ(УНИК(СЖПРОБЕЛЫ(ФИЛЬТР(Ведомость!B2:B100;Ведомость!B2:B100<>""))))
B2: =СУММПРОИЗВ((СЖПРОБЕЛЫ(Ведомость!$B$2:$B$100)=A2)*Ведомость!$H$2:$H$100)
C2: =СУММПРОИЗВ((СЖПРОБЕЛЫ(Ведомость!$B$2:$B$100)=A2)*Ведомость!$D$2:$D$100*Ведомость!$E$2:$E$100)/1000
    (B2 и C2 протянуть вниз по числу профилей)
E2: =СЧЁТЕСЛИ(Ведомость!F2:F100;"нет в справочнике")
F2: =ФИЛЬТР(Ведомость!A2:C100;Ведомость!F2:F100="нет в справочнике";"ошибок нет")

На тестовой ведомости Excel выдал: швеллер 832,22 кг и 59,26 м, уголок 269,21 кг и 54,36 м, труба 240,18 кг и 44,00 м. Красным загорелась позиция «Труба 89x5», которой нет в справочнике, оранжевым позиция швеллера длиной 13 500 мм. Строка «Уголок » с пробелом и строка «75х6» с кириллической «х» посчитались правильно.

Теперь независимая проверка. Скрипт открывает сохранённую книгу, сам пересчитывает каждую позицию по справочнику (трубы считает по формуле ГОСТ, не доверяя ячейке) и сравнивает с тем, что посчитал Excel.

# proverka_vedomosti.py
# Независимая проверка ведомости металлопроката: пересчитывает массу на Python
# и сравнивает с тем, что посчитал Excel. Книгу перед проверкой сохраните в Excel,
# иначе в файле не будет посчитанных значений формул.
import sys
from openpyxl import load_workbook

FILE = sys.argv[1] if len(sys.argv) > 1 else "ведомость.xlsx"
TOL = 0.01          # допустимое расхождение, кг
MAX_LEN = 12000     # длина хлыста, мм

def norm(text):
    """Убирает пробелы по краям и меняет кириллическую «х» на латинскую x."""
    return str(text or "").strip().replace("х", "x").replace("Х", "x")

# data_only=True: читаем не формулы, а значения, которые Excel сохранил в файле
wb = load_workbook(FILE, data_only=True)

# 1. Справочник: ключ (профиль, типоразмер) -> масса 1 м, кг
sort = {}
ws = wb["Сортамент"]
head = [c.value for c in ws[1]]
col = {name: i for i, name in enumerate(head)}
for row in ws.iter_rows(min_row=2, values_only=True):
    if not row[col["Профиль"]]:
        continue
    d, s = row[col["D"]], row[col["S"]]
    if d and s:
        # труба: масса по формуле ГОСТ 8732-78, считаем сами, не верим ячейке
        mass = round(0.02466 * s * (d - s), 2)
    else:
        mass = row[col["Масса"]]
    sort[(norm(row[col["Профиль"]]), norm(row[col["Типоразмер"]]))] = mass

# 2. Ведомость: пересчёт каждой строки
ws = wb["Ведомость"]
problems, totals = [], {}
for r in ws.iter_rows(min_row=2, values_only=True):
    pos, prof, size, length, qty, xl_m1, xl_m_piece, xl_total = r[:8]
    if pos is None:
        continue
    key = (norm(prof), norm(size))
    m1 = sort.get(key)
    if m1 is None:
        problems.append(f"поз. {pos}: {prof} {size} нет в справочнике")
        continue
    if not length or length <= 0 or length > MAX_LEN:
        problems.append(f"поз. {pos}: длина {length} мм вне диапазона 1..{MAX_LEN}")
    total = m1 * length / 1000 * qty
    totals[key[0]] = totals.get(key[0], 0) + total
    if not isinstance(xl_total, (int, float)):
        problems.append(f"поз. {pos}: в Excel нет числа в «Масса всего» ({xl_total!r})")
    elif abs(total - xl_total) > TOL:
        problems.append(f"поз. {pos}: Python {total:.2f} кг, Excel {xl_total:.2f} кг")

# 3. Итоги по профилям: сравниваем с листом «Итоги»
ws = wb["Итоги"]
for prof, xl_sum in ws.iter_rows(min_row=2, max_col=2, values_only=True):
    if not prof:
        continue
    py_sum = totals.get(norm(prof), 0)
    mark = "ok" if isinstance(xl_sum, (int, float)) and abs(py_sum - xl_sum) <= TOL else "РАСХОЖДЕНИЕ"
    print(f"{prof:<10} Python {py_sum:9.2f} кг   Excel {xl_sum if xl_sum is not None else '-'}   {mark}")

print(f"Всего по ведомости (Python): {sum(totals.values()):.2f} кг")
print("Замечания:" if problems else "Замечаний нет.")
for p in problems:
    print("  " + p)

Шаг 3. Как запустить.

  1. Соберите книгу: листы «Сортамент», «Ведомость», «Итоги», вставьте формулы из шага 2. Работайте на копии своей ведомости, не на рабочем файле.
  2. Сохраните книгу в Excel (Ctrl+S). Это обязательно: openpyxl не умеет считать формулы и читает значения, которые Excel записал при сохранении.
  3. Установите библиотеку один раз: в командной строке python -m pip install openpyxl.
  4. Сохраните скрипт как proverka_vedomosti.py в ту же папку и запустите: python proverka_vedomosti.py "ведомость.xlsx".
  5. Что должно получиться на нашем тестовом файле:
Труба      Python    240.18 кг   Excel 240.18   ok
Уголок     Python    269.21 кг   Excel 269.2092   ok
Швеллер    Python    832.22 кг   Excel 832.2184   ok
Всего по ведомости (Python): 1341.61 кг
Замечания:
  поз. 9: Труба 89x5 нет в справочнике
  поз. 10: длина 13500 мм вне диапазона 1..12000

Для проверки самого скрипта мы подменили итог по уголку на результат СУММЕСЛИМН (202,25 кг) и одну массу позиции на круглое число. Скрипт показал «РАСХОЖДЕНИЕ» по уголку и строку «поз. 3: Python 101.02 кг, Excel 100.00 кг». Проверка, которая ни разу не находила ошибку, ничего не доказывает, поэтому такой тест «на подлог» полезно сделать один раз и вам.

Шаг 4. Типичные ошибки и что сказать ИИ.

Формула не вставляется, Excel пишет «обнаружена ошибка в формуле»:
  ИИ дал английские имена или запятые. Скажите: «переведи на русские имена функций,
  разделитель точка с запятой».

#ИМЯ? в ячейке:
  в вашей версии нет функции (ПРОСМОТРX, LET, ТЕКСТДО). Скажите: «у меня Excel 2019,
  перепиши без ПРОСМОТРX и LET, через ИНДЕКС и ПОИСКПОЗ».

#ПЕРЕНОС! (#SPILL!):
  результат ФИЛЬТР или УНИК упирается в заполненные ячейки. Освободите место ниже и правее.

Везде «нет в справочнике», хотя профиль есть:
  разные «х» или пробелы, либо в справочнике «16 П» с пробелом. Покажите ИИ одну
  строку ведомости и одну строку справочника как текст и спросите, почему не совпадает.

Скрипт: KeyError: 'Сортамент' или KeyError: 'D':
  листы или столбцы названы иначе. Пришлите ИИ текст ошибки и строку заголовка своего листа.

Скрипт: везде «в Excel нет числа» и None:
  книгу создали или правили не в Excel и не сохранили. Откройте в Excel и сохраните.

Попробуйте сами

  1. Возьмите свою последнюю ведомость металлопроката и перенесите справочник масс на отдельный лист-таблицу, сверив каждое значение с ГОСТ. Критерий: в формулах ведомости не осталось ни одного числа массы, только ссылки на справочник, а итог совпадает со старым расчётом или вы нашли, почему не совпадает.
  2. Попросите ИИ добавить в ведомость столбец «Марка стали» и итоги по сочетанию «профиль и марка стали». Критерий: формулы работают со строками, где марка написана с лишним пробелом, а скрипт проверки (доработанный тем же ИИ) даёт те же суммы.
  3. Добавьте в итоги расчёт количества хлыстов по 12 м для каждого типоразмера без учёта раскроя (суммарная длина, делённая на 12 и округлённая вверх) и отдельной строкой запас 5 % по массе. Критерий: вы можете объяснить каждую формулу своими словами. Настоящий раскрой с остатками разбирается в уроке 9.

Проверьте себя

1. ИИ прислал формулу =SUMIFS(H:H,B:B,"Уголок"), а русский Excel её не принимает. Что сказать модели?

  1. Попросить сделать формулу короче
  2. Попросить русские имена функций и точку с запятой между аргументами
  3. Попросить заменить SUMIFS на ВПР
  4. Переустановить Excel на английском языке
Показать ответ

Ответ: B. Русский интерфейс ждёт СУММЕСЛИМН и разделитель «;». Язык интерфейса и разделители надо указывать в промпте сразу.

2. Итог по уголку через СУММЕСЛИМН получился на 67 кг меньше, ошибок Excel не показывает. Какая причина наиболее вероятна?

  1. СУММЕСЛИМН не работает с дробными числами
  2. В справочнике неверная масса уголка
  3. В одной из строк слово «Уголок» записано с лишним пробелом, и СУММЕСЛИМН её не учёл
  4. Лист «Итоги» не пересчитался
Показать ответ

Ответ: C. СУММЕСЛИМН сравнивает текст буквально. В уроке это поймали на проверке и перешли на СУММПРОИЗВ с СЖПРОБЕЛЫ внутри.

3. Как правильно заполнить справочник масс сортамента для ведомости?

  1. Попросить ИИ выдать таблицу масс по ГОСТ целиком
  2. Переписать значения из текста ГОСТ или справочника предприятия, а ИИ поручить формулы и проверку
  3. Взять массы из интернет-магазина металлопроката
  4. Считать массу каждого профиля по площади, которую назовёт ИИ
Показать ответ

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

Итоги

  • ИИ пишет формулы хорошо, если описать лист: версия программы, язык интерфейса, столбцы, пример строк и известные ловушки.
  • Справочник сортамента живёт на отдельном листе-таблице, значения переписываются из ГОСТ, масса трубы считается по формуле ГОСТ 8732-78.
  • ПРОСМОТРX с двумя условиями, LET и очистка текста (СЖПРОБЕЛЫ, замена «х») убирают большую часть ошибок ведомости.
  • СУММЕСЛИМН сравнивает текст буквально: лишний пробел незаметно выкидывает строку из итога.
  • Условное форматирование, проверка данных и счётчик ошибок делают ведомость самопроверяющейся, а Python-скрипт даёт независимый пересчёт.
  • Перед переходом на Р7-Офис, МойОфис или LibreOffice проверьте каждую нужную функцию на тестовом файле: совместимость неполная.

Документация

Полезные гиды