Переделать макрос MS Excel

Автор Mike_B, 24 февраля 2022, 20:29

0 Пользователи и 1 гость просматривают эту тему.

Mike_B

Уважаемые участники!
Не могли бы вы помочь переписать небольшой макрос на LO версии 7.3.0.03 x64 ?
Я достаточно хорошо знаю VBA, но в LO - только-только. Питоньяк дело непростое...

Суть задачи: нужно обработать прайс и увеличить цены в нем на заданный процент. Кусочек входного файла приложил - product.csv

Почему был написан макрос VBA - такой файл криво читается MS Excel, а вот LO его берет легко. Сейчас файл сохраняется в LO в формат xlsx и обрабатывается макросом в Excel 2007, который создает выходной csv-файл, корректно импортируемый на сайт.

Хотелось бы избежать ручных операций по сохранению CSV (LO) -> XLSX и сразу в LO обрабатывать.

Входной пример для экселя - файл source.xlsx, который после обработки макросом в PriceUp.xlsm создает файл source.csv с разделителем "запятая" в формате UTF-8.

Задача - макрос для LO, который брал бы product.csv и "на месте", без перегонки в MS Excel, его обрабатывал тем же образом.

Макрос постарался максимально прокомментировать. Основная сложность - текст в ячейке, где надо найти цену и увеличить ее. Ну и обрамление - диалог открытия файла, а также сохранение в UTF-8 (но это, мне кажется, LO  в отличие от MS умеет).

Буду рад, если кто-то сможет помочь с этим делом. Моих познаний макросов LO пока не хватает.

economist

Тут опцией совместимости Option VBASupport 1 не обойтись, но задачу она облегчит. Ее автопоявления при открытии можно добиться, проставив все флажки  в окне Alt+F12 - Сервис - Загрузка - Свойства VBA
Замените строки вида With ThisWorkbook.Sheets(...) на With ThisWorkbook.Sheets("Macros") - т.е. на конкретное имя листа
Придется в коде заменить вызов mso-диалогов. Лучше всего просто захардкодить пути к папкам.
ADODB.Stream тоже скорее всего придется переписать.
С другой стороны - раз задача актуальна и хорошо известна, то это хороший повод изучить StarBasic.

Первый раз вижу столь сложную реализацию простой задачи проиндексировать цену прайса и его HTML-вывода.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Mike_B

Уважаемый economist, спасибо за ответ.
Попробовал. Все галки по пути "Alt-F12 - Загрузка/Сохранение - Свойства VBA" стоят. Добавил в код первой строкой Option VBASupport 1
Но и без диалогов ругается при проходе строки FN1 = .Cells(2, "B") - "ошибка времени исполнения Basic. '12' Переменная не определена. Дополнительно: ThisWorkbook"
Предполагаю, надо для начала менять обращение к ячейкам - вместо .Cells(2, "B"), несмотря на VBASupport, писать LO-ный синтаксис.

ADODB, возможно, не понадобится, LO ведь может в UTF-8 сохранять.

А в чем сложность реализации и как бы Вы решали задачу? Умножить ячейки на коэффициент не проблема, а усложнилось у меня потому, что надо еще в описаниях (свободный текст) найти цены в тегах и домножить, вернуть обратно. Вполне допускаю, что есть другие способы, но не знаю их - а известное правило гласит: "Подумать можно только о том, что знаешь".

Mike_B

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

economist

Ссылки  .Cells(2, "B") могут заработать при Alt+F12 - LO Calc - Формула - Синтаксис - Excel A1, но можно и переписать на .Cells(2, 2)

Если все можно загрузить и построчно обработать - то это выглядит наиболее простым решением. ADODB можно заставить работать и в LO.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

#5
Для того, чтобы макрос VBA заработал в Calc, необходимо, чтобы он работал в Excel. Проект PriceUp при попытке компиляции в Excel выдает ошибку (Menu Debug / Compile VBAProject).

Цитата: Mike_B от 24 февраля 2022, 20:29такой файл криво читается MS Excel

Проблема в том, что некоторые поля записей файла содержат знак перевода строки (U+000A). В Excel есть несколько способов открыть csv файл. Попробуйте так (VBA):
Workbooks.Open "C:\Temp\source.csv", Local:=False
Владимир.

Mike_B

Цитата: sokol92 от 25 февраля 2022, 16:15попытке компиляции в Excel выдает ошибку
Да, когда готовил для постинга сюда, забыл подправить, надо было With ThisWorkbook.Sheets(1) написать вместо With ThisWorkbook.Sheets(shMacr). Так там все работает.

Цитата: sokol92 от 25 февраля 2022, 16:15Workbooks.Open "C:\Temp\source.csv", Local:=False
Владимир, Вы сэкономили кучу времени на ручные операции! Это действительно помогло. Вот же, буду знать теперь, что для чтения умолчание CSV - Local:=True (и надо явно отключать). Потому как при записи как раз Local:=False (пишет с запятыми) вместо обвчно нужного Local:=True (точка с запятой). Все-то у MS с ног на голову!

sokol92

Владимир.

Mike_B

Не исключено, учитывая. что индийцы макрософту много чего писали...