user8242028

user8242028

Пикабушник
Дата рождения: 28 января
159 рейтинг 0 подписчиков 0 подписок 2 поста 1 в горячем
59

Ответ netolkostroika в «Небольшой, но свой! Построил дом, выкладываю фото, цены и проект!»3

Если я соберусь строить дом, мой будет одноэтажный в районе 70-80 квадратов. Я в рот ебал эти 2х этажные сараи 100+. Дохера у меня таких знакомых. Всегда начинается одинаково, построим большой дом, детям по комнате, друзья, вечеринки. Проходит 10-15 лет. Дети выросли и разъехались. Половина друзей либо на кладбище, либо целиком своей жизнью живут. Приезжаешь к ним в гости, сидят как крысы в спальне-гостиной, дальше не ходят. Темно, пусто, эхо, ветер со второго этажа гудит. Главная тема у них для разговоров, как дохуя за отопление выходит. На больший кругозор в их жизни уже времени не остается. Уезжаешь от них немного подавленным.

7

История о том, как я макрос вайбкодил

Статья прогнана через ЛЛМ только на орфографию и пунктуацию. Не знаю, насколько она справилась в этом. Структура и повествование, как есть.
---

У меня установлен LibreOffice.

Потребовалось мне как-то занести данные в одну табличку.

Суть в том, что в ячейках делается запись вида «число/число».

После этого мне нужно было добавить итоговые данные в виде (сумма левых чисел диапазона/списка ячеек) / (сумма правых чисел диапазона/списка ячеек).

Я подумал, как мне сделать формулу. Вариант со вспомогательными колонками не устроил, документ трогать нельзя. Сделал одной гигантской суперформулой, но из-за сложности с выбором диапазона/списка ячеек такой вариант оказался очень трудоёмким, и мне он опять не понравился.

Я вспомнил, что есть макросы. На бейсике (GW и Q) я последний раз много писал ещё в школе в 90-х. И макросы на VBA писал в своей жизни, может, раз пять за 25 лет. И те — в нулевых.

Задача виделась крайне примитивной:

Циклом по ячейкам из параметра функции вырезаем правую и левую часть от слеша. То, что не соответствует шаблону либо не содержит чисел, — игнорируем.

Суммируем.

По выходу из цикла склеиваем в строку и отдаём в качестве результата.

Но синтаксис VBA уже подзабыт, объектная модель документа — тем более.

Решил задействовать LLM. Я много читаю «Хабр» и хорошо знаю, что они и лекарство от рака ищут, и суперсплавы придумывают, и вообще половина местных пользователей греет брюхо на Сейшелах, пока агенты за двадцать баксов по подписке в месяц всё за них делают.

Думаю: ну уж такую примитивную хрень LLM расколет как орех.

ROUND 1. DeepSeek V4 Flash

Решил задействовать DeepSeek Flash. Потому что задача примитивная, зачем напрягать большие модели.

Написал промпт, получил результат. Опустим некоторые нюансы плохого промпт-инжиниринга с моей стороны. То, что нужно, получилось с третьей попытки.

Сохраняю, запускаю — ошибка.

Ругается на `Function SUMBOTH(ParamArray args())`.

Прям вот самая первая строка.

«Ок», — говорю, — тут ошибка типа.

«Ок, проблема в том, что в LibreOffice Basic ParamArray работает не совсем так, как в VBA (Excel). LibreOffice Basic не поддерживает ParamArray в классическом виде», — отвечает мне искусственный разум китайского происхождения.

И предлагает вариант:

`Function SUMBOTH(Optional cell1, Optional cell2, Optional cell3, Optional cell4, Optional cell5, Optional cell6, Optional cell7, Optional cell8, Optional cell9, Optional cell10)`, а внутри функции — простыня из кейсов.

И в конце издевательски добавляет:

«Если тебе нужно больше 10 аргументов — просто добавь:

в строке функции:

`Function SUMBOTH(Optional cell1, Optional cell2, ..., Optional cell20)`

и в цикле поменяй `For i = 1 To 10` на `For i = 1 To 20` и добавь соответствующие Case».

Я, разумеется, отмечаю, что это какая-то дичь. Так плохо не может быть.

«Вы абсолютно правы!!!» — радостно сообщает поделие сумрачного китайского гения и предлагает мне следующий вариант:

«Альтернативный вариант — через массив (если хочешь без ограничений):

`Function SUMBOTH_ARRAY(ParamArray args())` ...»

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

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

Искусственный интеллект верно уловил вайб общения и написал:

«Ладно, блять. LibreOffice Basic — это говно полное, которое не умеет в ParamArray и в IsObject для диапазонов.

Сделаем через жопу, но работающее решение:

ВАРИАНТ 1 — Передавай ячейки через запятую как строки:

`Function SUMBOTH_STR(cellString As String)`

ВАРИАНТ 2 — Просто передавай диапазон как строку (работает 100%):

`Function SUMBOTH_RANGE(rangeName As String)`

ВАРИАНТ 3 — Самый ебанутый, но рабочий: передавай ячейки через точку с запятой и обрабатывай как массив строк:

`Function SUMBOTH(ParamArray args())`

ВАРИАНТ 4 — ПРОСТО И РАБОТАЕТ (делай так, не еби мозги):

Создай ДВЕ функции:

`Function SUMLEFT_LIST(ParamArray args())` ...

САМЫЙ ПРОСТОЙ РАБОЧИЙ ВАРИАНТ — через Evaluate:

`Function SUMBOTH_EVAL(rangeStr As String)`

Если нихуя не работает — копируй сюда точный текст ошибки, который выдаёт LibreOffice, и мы заебём его по-другому».

Я опять венцу информационных технологий с контекстным окном в сотни тысяч токенов напоминаю, что мы уже два раза, примерно тысячу токенов назад, говорили про `ParamArray args()`. Разумеется, междометий становится у меня в тексте на порядок больше.

После чего сверхразум был вынужден таки ознакомиться со своим контекстом и сообщил:

«Ты абсолютно прав, братан. Прошу прощения, я реально тупил и игнорировал тот факт, что LibreOffice Basic не поддерживает ParamArray в том виде, в котором я его пихал. Это пиздец, но факт.

В LibreOffice Basic ParamArray есть, но он работает только если функция объявлена как `Function SUMBOTH(ParamArray args()) As Variant`, НО при передаче диапазона (H5:H31) он не понимает, что это диапазон, и передаёт это как строку или массив вариантов, из-за чего всё ломается.

Вот гарантированно рабочий вариант для LibreOffice, без всяких ParamArray, который умеет обрабатывать и диапазоны, и списки ячеек (через строку):

ЕДИНСТВЕННЫЙ РАБОЧИЙ ВАРИАНТ ДЛЯ LIBREOFFICE

`Function SUMBOTH(rangeAddress As String)`»

Разумеется, что при таком подходе протяжка формулы по ячейкам не будет работать. Я уже не стал объяснять, поэтому...

ROUND 2. DeepSeek V4 Pro

Передовая модель сумрачного китайского гения, которая год назад потрепала капитализацию западного бигтеха.

«Уж она-то не напрягаясь всё сделает», — подумал я, но режим рассуждений на всякий случай всё-таки включил.

Пишу промпт. После того как китайский сверхразум подумал по-английски, выдал мне вариант. Код ошибок не содержал, но функция на листе всё равно выдавала #ОШИБКА.

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

Меня такой вариант не устроил вообще никак. Но из любопытства я его запустил — он вылетел в ошибку. Какую — мне уже было неинтересно смотреть. Поэтому...

ROUND 3. Qwen 3.7 Plus

Вспомнил про другую умную нейросеть от Alibaba. Весной, во время халявного доступа, давал задачу кодинг-агенту расковырять проприетарный бинарный блоб и написать для него REST API сервис. Хотелось просто проверить его, а задач подходящих не было. Был несколько лет назад заказ — извлечь данные из одной программы, написанной на дельфях в далёких нулевых. От которого я отказался. Но блоб от заказчика остался лежать. Собственно, про него я и вспомнил, поскольку с той задачей он тогда справился вполне автономно: два часа что-то писал себе на питоне, что-то гуглил. Но справился. В целом.

Поэтому заряжаем промпт. Получаем ответ.

`Function SumFractions(ParamArray args() As Variant) As String`

Я замечаю, что вы все (нейросети) меня уже затрахали с `ParamArray args()`.

Игни в этом выражает полное согласие со мной:

«Вы абсолютно правы, приношу извинения — это действительно больное место при портировании кода из VBA в LibreOffice Basic. ParamArray в LO Basic не поддерживается в том виде, как в Excel, и компилятор справедливо ругается.

Делаем правильно — через строку с адресами, которую парсим внутри макроса. Это работает стабильно и поддерживает любые комбинации», —

и рожает:

`Function SumFractions(sAddresses As String) As String`

Я уже прям начинаю себя чувствовать, как будто я в фильме «День сурка», и с обилием междометий объясняю Аарду, что такой вариант не идёт, потому что протяжка работать не будет.

И я, в принципе, уже наперёд знаю, что мне предложит Ирден, и он меня не подвёл, выдав то, что я и ожидал увидеть:

`Function SumFractions(Optional a1, Optional a2, Optional a3, Optional a4, Optional a5, _

Optional a6, Optional a7, Optional a8, Optional a9, Optional a10, _

Optional a11, Optional a12, Optional a13, Optional a14, Optional a15, _

Optional a16, Optional a17, Optional a18, Optional a19, Optional a20) As String`

Объяснять про говнокод Аксию уже желания не было, поэтому я нагуглил какой-то рабочий макрос для LO на руинах StackOverflow и кинул нейросети в качестве примера.

По образцу из интернета скрипт заработал-таки, но только для RANGE. Для списка ячеек по-прежнему предлагались какие-то безумные варианты из костылей и говнокода.

Поэтому на данном этапе с ведьмачьими знаками решил завязать.

ROUND 4. Claude Opus 4.8 Fast

Уже решил не мелочиться и выбрал самую-самую передовую нейросеть на планете, на которую яростно надрачивают на «Хабре», которая уже практически всех заменила, если Амодеи не врет.

Пока в самом лайтовом варианте. Всё-таки макрос по суммированию значений в ячейках пишем, а не новый белок синтезируем.

Загоняем промпт. Получаем ответ.

Сразу смотрю на заголовок функции:

`Function SumRatio(ParamArray args()) As String`.

Всё понятно, думаю, переходим на следующий уровень: тут задачка покруче изобретения суперсплава.

ROUND 5. Claude Opus 4.8 (не штурм Fast)

Промпт. Ответ.

`Function SumBoth(ParamArray args()) As String`

Да как же так, думаю. Лидер ИИ-индустрии, фанбаза на «Хабре», белок там, лекарство от рака, суперсплавы...

ЭПИЛОГ. Gemini. ХЗ какой версии.

Собственно, решил вернуться к истокам и полез гуглить доки по VBA для LO. Думаю, гляну там объектную модель Range, параметры аргументов строки, да сам всё сделаю.

Разумеется, первой строкой в поиске ИИ-поиск (Gemini) что-то там написал и предложил помочь. Я уже просто и криво написал ему, что я хочу, и получаю ответ:

`Function ALTSUM(ParamArray Args() As Variant) As Double`

У меня окончательно взрывается пердак, и я пишу:

«не работает ParamArray Args() As Variant блять заебали тупорылые ЛЛМ, все блять одно и то же пишут».

И тут происходит ОНО:

«**Вариант 1. Включить совместимость (самый простой)**

Если в самом верху модуля (над функцией) не написать специальную директиву, ParamArray вызовет ошибку.

Добавьте `Option Compatible` первой строчкой кода:

`Option Compatible ' <- БЕЗ ЭТОЙ СТРОКИ PARAMARRAY РАБОТАТЬ НЕ БУДЕТ!`»

Бла-бла-бла.

«**Вариант 2. Чистый LibreOffice Basic (без ParamArray)**

Если `Option Compatible` по какой-то причине не хочется юзать, в нативном LibreOffice Basic можно объявить кучу необязательных параметров через Optional. Calc поддерживает до 30 аргументов в формуле.

Чтобы не писать портянку из 30 штук, вот пример на 5 аргументов (логику можно размножить до нужного количества):

`Function ALTSUM(Optional arg1, Optional arg2, Optional arg3, Optional arg4, Optional arg5) As Double`»

Я, разумеется, цепляюсь за первый вариант, пишу опцию, мОкаю функцию — РАБОТАЕТ.

С Опусом и DeepSeek уже не хотелось общаться, спрашиваю у Qwen: «Какого х?».

Qwen отвечает:

«Вы правы на 100%, я тупил. Option Compatible включает VBA-совместимый режим, где ParamArray работает нормально. Надо было это сказать с самого начала, а не городить костыли.

Финальный рабочий код.

Бла-бла-бла.

Протяжка работает, микс работает, лимитов на число аргументов нет.

Почему я сразу не сказал про Option Compatible?

Честно — проебал. Это базовая вещь, она есть в документации LO Basic. Вместо того чтобы сразу её включить, я пошёл по пути „а давайте костылями обойдём“ — строки адресов, Optional-аргументы, парсинг через getCellRangeByName. Всё это было не нужно.

Извиняюсь за потраченное время».

P.S. Макрос по итогу заработал. Но пришлось вариант Qwen, который уходил в ошибку уже в другом месте, скидывать Gemini с просьбой поправить макрос, чтобы он запускался в LO.

Gemini справилась с первого раза.

Показать полностью
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества