🤖📊 Как я перестал тратить по 4 часа на Excel и подружился с нейросетью
Много раз подряд я делал одну и ту же рутинную работу в Excel: открывал папку за папкой, вытаскивал данные, считал, сохранял. Довольно быстро надоело тратить по 3–4 часа на такие действия, и я решил написать VBA-скрипт, который сделает всё сам. Но дело в том, что я не программист, и знаний VBA хватало, чтобы записать простой макрос, а на сложный алгоритм — нет. Тогда я решил использовать достижения технической мысли и пошёл в нейросети. Ожидание: «Сейчас быстро накидаю промт — и готово». Реальность: нейросеть брала не те данные, считала по-своему, будто меня не слышала.
И вместо того чтобы гадать, я спросил у самой нейросети: «Как мне писать промты, чтобы ты понимала с первого раза?» Знаете, это сработало. Я применил советы, которые мне дала нейросеть, и всё заработало. Теперь на ту же работу уходит 5 минут.
Рассказываю, что мне помогло.
Мои выводы и совет
Если нейросеть вас не понимает — скорее всего, дело не в ней, а в промте.
- Следуйте трём критериям: конкретность, контекст, ограничения.
- Прогоняйте промт через чек-лист из шести пунктов.
- Пишите на том языке, который понимает нейросеть: для Excel — терминами Excel, для кода — именами функций, для текста — фактами.
Попробуйте сами. Составьте промт как ТЗ, проверьте по чек-листу — и вы удивитесь, насколько точными станут ответы.
Три критерия хорошего промта
Раньше я писал промты как попало, например: «Сделай скрипт для Excel», а нейросеть выдавала что-то общее. Оказывается, промт должен быть описан как техническое задание. А у технического задания есть некоторые правила.
- Писать конкретнее. Не «Сделай скрипт», а «
Напиши макрос VBA для Excel 2019, который открывает файл из папки C:\Reports, копирует диапазон A1:D10 на лист "Данные" и вставляет в сводный файл». Чем точнее писать, тем меньше нейросеть додумывает. В целом, это правило работает везде, и оно достаточно простое: если моё задание поймёт другой человек, то его поймёт и робот. Если в промпте нет каши, то и в ответе тоже. - Продолжение первого правила, но все же поставлю отдельным пунктом — писать без абстракций. Слова «быстро», «удобный», «правильный» — это абстракции. Их надо заменять цифрами и фактами и подробно описывать каждый шаг, потому что нейролинк ещё не ввели в массовое производство и нейросеть не может считывать мысли, чтобы понимать с полуслова.
- Контекст. Нейросети нужно объяснить, в каких условиях работает скрипт. Какая версия Excel? Как называются листы? Где лежат файлы? Без контекста она берёт стандартные настройки, которые часто не подходят. Например, я не указывал версию Excel и она выдала код для Office 365, который у меня не запускался. А когда я указал — код заработал. Также нужно учитывать полноту контекста, например, ответил ли я на вопросы: кто, для кого, зачем, в каком формате?
- Ограничения. Что скрипт не должен делать? Какие данные не трогать? Какой формат вывода? Задал ли я рамки по объёму, стилю, действиям? Ограничения убирают лишнее. Например, я теперь добавляю «Не удаляй исходные файлы, не используй всплывающие окна, расчёты делай с округлением до двух знаков» и скрипт больше не творит странное.
Как это сработало на моей задаче
Снова вернусь в прошлое. Вот пример старого промпта (так делать не надо): «Напиши макрос для Excel, который будет открывать файлы и собирать данные».
Нейросеть выдавала что-то вроде:
text
Sub CollectData()
' код, который открывает диалог выбора файла и копирует активный лист
End Sub
Но мне-то нужно было другое: открывать строго определённые файлы из строго определённых папок, брать конкретные ячейки и считать сумму. Поэтому следуя вышеописанным принципам, пишем задание по шагам, как алгоритм для стажёра: указываю версию Excel, названия листов, пути, расчёты.
Вот новый промт (рабочий):
Ты эксперт по VBA для Excel 2019. Напиши макрос с именем "СборДанных". 1. Макрос должен открывать книгу по пути C:\Data\Январь.xlsx. 2. На листе "Продажи" скопировать значения из ячеек B2:B10. 3. Закрыть книгу без сохранения. 4. В текущей книге (куда вставляем) на листе "Свод" найти первую пустую строку в столбце A и вставить туда скопированные значения одно под другим. 5. После вставки перейти на лист "Расчёт" и в ячейку C5 записать формулу =СУММ(Свод!A:A). 6. Не использовать никаких сообщений (Application.DisplayAlerts = False). 7. Обработать ошибки: если файл не найден, записать в лог на листе "Ошибки" текущую дату и имя файла.
Вот это уже похоже на техническое задание, ведь я даже пронумеровал шаги :)
Дальше добавляю контекст: «Excel 2019, русская версия, имена листов на русском». И уточняю ограничения: «не удалять исходные файлы, не спрашивать подтверждения, работать только с указанными папками».
Готово, у меня есть ТЗ:
text
Техническое задание для макроса VBA (Excel 2019, русский)
Цель: автоматический сбор данных из отчётов за месяц.
1. Открыть папку C:\Reports\2025\.
2. Для каждого файла с именем, содержащим "Отчёт_", выполнить:
а) открыть файл;
б) на листе "Данные" скопировать ячейки C5:C20;
в) закрыть файл без сохранения;
г) перейти в сводный файл (текущий), на лист "Сборка";
д) найти последнюю заполненную строку в столбце A;
е) вставить скопированные значения, начиная со следующей строки.
3. После обработки всех файлов перейти на лист "Итог".
4. В ячейку B2 записать формулу: =СУММ(Сборка!A:A).
5. На листе "Лог" записать дату и время запуска макроса.
6. Запретить появление системных сообщений.
7. Если файл не открывается — записать ошибку в лог и продолжить со следующим.
Ограничения:
- не менять исходные файлы;
- не использовать ActiveCell, Selection — только явные ссылки;
- макрос должен запускаться по кнопке на листе "Интерфейс".
С таким ТЗ нейросеть уже не ошибется и выдаст идеальный код. Выглядит так:
Sub СобратьДанныеИзОтчётов()
' Макрос для сбора данных из отчётов в папке C:\Reports\2025\
' Запускается с листа "Интерфейс" (можно назначить на кнопку)
' ===== ОТКЛЮЧАЕМ СИСТЕМНЫЕ СООБЩЕНИЯ И ОБНОВЛЕНИЯ =====
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
' ===== ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ =====
Dim ПутьКПапке As String
Dim ИмяФайла As String
Dim ПолныйПуть As String
Dim wbОтчёт As Workbook
Dim wsДанные As Worksheet
Dim ДиапазонДанных As Range
Dim Значения As Variant
Dim ТекущаяКнига As Workbook
Dim wsСборка As Worksheet
Dim wsИтог As Worksheet
Dim wsЛог As Worksheet
Dim ПоследняяСтрока As Long
Dim i As Long
Dim Ошибка As String
' ===== УСТАНАВЛИВАЕМ ССЫЛКИ НА ЛИСТЫ ТЕКУЩЕЙ КНИГИ =====
Set ТекущаяКнига = ThisWorkbook
Set wsСборка = ТекущаяКнига.Worksheets("Сборка")
Set wsИтог = ТекущаяКнига.Worksheets("Итог")
Set wsЛог = ТекущаяКнига.Worksheets("Лог")
' ===== ЗАПИСЫВАЕМ ВРЕМЯ ЗАПУСКА В ЛОГ =====
ЗаписатьВЛог wsЛог, "Запуск макроса: " & Format(Now, "dd.mm.yyyy HH:nn")
' ===== ЗАДАЁМ ПУТЬ К ПАПКЕ С ОТЧЁТАМИ =====
ПутьКПапке = "C:\Reports\2025\"
' ===== ПРОВЕРЯЕМ СУЩЕСТВОВАНИЕ ПАПКИ =====
If Dir(ПутьКПапке, vbDirectory) = "" Then
ЗаписатьВЛог wsЛог, "ОШИБКА: Папка не найдена - " & ПутьКПапке
GoTo Завершение
End If
' ===== ПОЛУЧАЕМ ПЕРВЫЙ ФАЙЛ =====
ИмяФайла = Dir(ПутьКПапке & "*.xls*") ' ищем все файлы Excel
' ===== ПЕРЕБИРАЕМ ВСЕ ФАЙЛЫ В ПАПКЕ =====
Do While ИмяФайла <> ""
' Проверяем, содержит ли имя файла "Отчёт_" (регистронезависимо)
If InStr(1, ИмяФайла, "Отчёт_", vbTextCompare) > 0 Then
ПолныйПуть = ПутьКПапке & ИмяФайла
' Исключаем текущую книгу (на случай, если она лежит в той же папке)
If ПолныйПуть <> ТекущаяКнига.FullName Then
On Error Resume Next ' временно игнорируем ошибки для открытия
Set wbОтчёт = Workbooks.Open(ПолныйПуть, UpdateLinks:=False, ReadOnly:=True)
On Error GoTo 0 ' возвращаем обычную обработку ошибок
If wbОтчёт Is Nothing Then
' Не удалось открыть файл
ЗаписатьВЛог wsЛог, "ОШИБКА: Не удалось открыть файл " & ИмяФайла
Else
' Файл открыт успешно
On Error Resume Next
Set wsДанные = wbОтчёт.Worksheets("Данные")
On Error GoTo 0
If wsДанные Is Nothing Then
' Лист "Данные" отсутствует
ЗаписатьВЛог wsЛог, "ОШИБКА: В файле " & ИмяФайла & " нет листа ""Данные"""
Else
' Копируем диапазон C5:C20
Set ДиапазонДанных = wsДанные.Range("C5:C20")
Значения = ДиапазонДанных.Value ' читаем значения в массив
' Определяем последнюю заполненную строку на листе "Сборка" (столбец A)
ПоследняяСтрока = wsСборка.Cells(wsСборка.Rows.Count, 1).End(xlUp).Row
If ПоследняяСтрока = 1 And wsСборка.Cells(1, 1).Value = "" Then
ПоследняяСтрока = 0 ' лист пуст
End If
' Вставляем значения, начиная со следующей строки
For i = 1 To 16
wsСборка.Cells(ПоследняяСтрока + i, 1).Value = Значения(i, 1)
Next i
End If
' Закрываем файл отчёта без сохранения
wbОтчёт.Close SaveChanges:=False
Set wbОтчёт = Nothing
Set wsДанные = Nothing
End If
End If
End If
' Следующий файл
ИмяФайла = Dir()
Loop
' ===== ЗАПИСЫВАЕМ ФОРМУЛУ НА ЛИСТ "ИТОГ" =====
wsИтог.Range("B2").Formula = "=СУММ(Сборка!A:A)"
' ===== ПЕРЕХОДИМ НА ЛИСТ "ИТОГ" =====
wsИтог.Activate
' ===== ЗАВЕРШЕНИЕ: ВОССТАНАВЛИВАЕМ НАСТРОЙКИ =====
Завершение:
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
MsgBox "Сбор данных завершён. Проверьте лог на наличие ошибок.", vbInformation
End Sub
' ===================================================================
' ВСПОМОГАТЕЛЬНАЯ ПРОЦЕДУРА ДЛЯ ЗАПИСИ В ЛОГ
' ===================================================================
Private Sub ЗаписатьВЛог(wsЛог As Worksheet, Текст As String)
Dim ПоследняяСтрока As Long
' Определяем последнюю строку в столбце A
ПоследняяСтрока = wsЛог.Cells(wsЛог.Rows.Count, 1).End(xlUp).Row
If ПоследняяСтрока = 1 And wsЛог.Cells(1, 1).Value = "" Then
ПоследняяСтрока = 0
End If
' Добавляем запись в следующую строку
wsЛог.Cells(ПоследняяСтрока + 1, 1).Value = Текст
' Автоподбор ширины столбца для удобства
wsЛог.Columns(1).AutoFit
End Sub
Я скопировал, вставил в редактор VBA, запустил — и всё сработало с первого раза.
Что получилось в итоге
Раньше я тратил 3–4 часа на рутину. Теперь запускаю макрос и занимаюсь другими задачами — через 5 минут данные готовы: скрипт сам обходит все папки, собирает цифры, считает итоги.
Программистом я не стал, но научился правильно ставить задачи нейросети, а это важнее, чем знать синтаксис.
Мои выводы и совет
Если нейросеть вас не понимает — скорее всего, дело не в ней, а в промте.
- Следуйте трём критериям: конкретность, контекст, ограничения.
- Прогоняйте промт через чек-лист из шести пунктов.
- Пишите на том языке, который понимает нейросеть: для Excel — терминами Excel, для кода — именами функций, для текста — фактами.
Попробуйте сами. Составьте промт как ТЗ, проверьте по чек-листу — и вы удивитесь, насколько точными станут ответы.