Помогите написать макрос

Автор fujica, 24 февраля 2019, 23:29

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

fujica

Добрый вечер, Уважаемые знатоки.
Есть довольно крупная проблема.
Есть таблица с примерно 2000 строк, в два столбца то есть 3500-4000 ячеек и её нужно обработать.
Иного способа как написать макрос я не вижу и для меня это не подъёмная задача в плане изучения языка.
Прошу помочь в написании макроса.

Ёмко о ТЗ.
Макрос должен обрабатывать текущую выделенную ячейку парсить её и вставлять значения в другие ячейки.
Формат данных в ячейке:
Данные разделены на блоки, большими буквами, в начале каждого блока.
Всё пишется русским алфавитом;
аа,а; бб,б; хх,х; уу,у -- это числа;
текст1 -- обязателен, текст2-4 -- опционально;
Всегда закрывающая "точка с запятой";

Пример заполненной ячейки:

Абв
аа,а-текст1\текст2\(текст3)(текст4);
бб,б-текст1\текст2\(текст3)(текст4);
....
Эюя
хх,х-текст1\текст2\(текст3)(текст4);
уу,у-текст1\текст2\(текст3)(текст4);
....

Пример обработки:
Исходные данные в ячейке C1, выбираем ячейку, запускаем макрос,
в ячейку A1 вставляются значения из блока Абв, так что значения аа,а; бб,б; .... суммируются
в ячейку B1 вставляются значения из блока Эюя, так что значения хх,х; уу,у; .... суммируются

Соответственно если это ячейка С2, то данные вставляются B2 и А2.
Но было бы хорошо, если макрос сам определял ячейку и вставлял значения со смещением влево на одну и две ячейки, соответственно.

Пишу на форуме впервые, как благодарить не знаю.

JohnSUN

Доброе утро! И добро пожаловать на форум!
Должен огорчить, ёмкости ТЗ немного не хватило - нужно ещё немного "ширше и глубжее"  ;D

Абв и Эюя (и все, кто между ними) - в одной ячейке? Как их туда занесло? В смысле - откуда данные в таком виде попали в таблицу? Calc программа умная, должен был нарезать всё это на отдельные строки, если ему явно это не запретить...
Тексты вообще игнорируются, да? Просто подсчитать сумму каждого из блоков данных?
О количестве блоков. Всегда только два? Или может быть один? И что тогда писать в B2? Ноль? Или "Нет данных"?

В общем, ответ такой "Макрос написать не очень сложно - сложно понять задачу без образца данных"
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

fujica

ДА, это всё в одной ячейке.
В общем вы всё правильно поняли. Если нет блока, то писать ноль, текст игнорировать.
Желательно вставлять в ячейку обработаны данные, как текст. чтобы не сломать таблицу
если из неё удалить макрос или скопировать из неё данные.
если есть только один блок то поместить данные только в ту ячейку к которому она относится,
если есть блок с другим названием, то его не трогать.

Если желаете узнать, что это за таблица такая могу поделится, это не секрет.  :beer:

bigor

Цитата: fujica от 25 февраля 2019, 19:04Если желаете узнать, что это за таблица такая могу поделится, это не секрет.
я думаю, что приложенная таблица сбережет немного времени и ускорит процесс написания макроса
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

fujica

Если честно мне стыдно такое выкладывать.  :roll:
Сейчас подчищу уродство и выложу образец.

JohnSUN

Цитата: fujica от 25 февраля 2019, 19:04
Если желаете узнать, что это за таблица такая могу поделится
Желаю, о том и писал. Потому что с описанием получилось как в той байке:
- Необходимо изготовить отверстие 150 мм...
- Ага, значит, сделать дырку где-то с ладонь величиной...
аа,а и бб,б при всём желании просуммировать не могу - что там за числа будут могу только догадываться. Поэтому и просил хоть небольшой образец, чтобы было на чем отладку проводить... Ну, раз не дал, значит не дал.

В приложенном файле два варианта формул.
В A2 и B2 - =SUM_OF_BLOCK(<текст>;<номер блока>)
В G2:J2 - формула массива {=GETSUMS(<текст>)}
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

fujica

#6
Срез за одну неделю постарался найти где есть все ситуации.
Сильно не ругайте, да есть специальные базы данных и все такое, но как показала практика, таблицы выживают лучше.
Да и делал я это личного удовольствия без особых знаний, поэтому так много версий.
Последние 7 месяцев я был без компьютера поэтому сейчас нужно занести очень много чеков и я хочу сверстать всё в одну таблицу т,к. сейчас их порядка 10 и разного формата...

Пароль, мой ник.

fujica

JohnSUN
Спасибо.
Я могу вас попросить доработать?
Макрос ломается когда в ячейке только один блок :(
И как применять макрос на другие ячейки?

bigor

Цитата: fujica от 25 февраля 2019, 20:19Макрос ломается когда в ячейке только один блок Грустный
С одним блоком проблем не вижу. В вашей табличке все отработало красиво, кроме 10 строки, но там вы сами виноваты, не соответсвует формату.
ЦитироватьИ как применять макрос на другие ячейки?
в вашей табллиице сделал так. В e5 вставил формулу =SUM_OF_BLOCK(G5;2), в d5 =SUM_OF_BLOCK(G5;1) "протянул" до конца таблицы. Все
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

JohnSUN

Всё верно: хорошие данные - хороший результат
Только я не "протянул", а скопировал и вставил через Ctrl+Shift+V "только формулы", чтобы раскраску не поломать
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

bigor

у него раскраска через УФ, можно тянуть :)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

fujica

#11
Работает!
Как использовать макрос разобрался.
Всё оказалось просто. Вот за это спасибо.
За неправильный формат простите.  :o Человеческий фактор, так сказать.

Посмотрел листинг макроса, на мой взгляд, чёрт ногу сломит.
И не мудрено из знаний только 120 академических часов Питона..

Благодарю.  ;D


fujica

#12
Вчера за вечер занёс 150 чеков и ни разу не притронулся к калькулятору. ;D
Если не посчитаете за наглость можно попросить написать ещё один макрос?
Примерно такого же характера..

Ячейка всё та же. Хотелось бы добавить туда ещё "группу".
Всё тот же пример, только А и Б это группы выраженные числом,
Абв
аа,а№А-текст1\текст2\(текст3)(текст4);
бб,б№Б-текст1\текст2\(текст3)(текст4);
....
Эюя
хх,х№А-текст1\текст2\(текст3)(текст4);
уу,у№Б-текст1\текст2\(текст3)(текст4);
....

Группа идет после  символа № и заканчивается тире.
Формула должна суммировать всё принадлежащей одной группе.
API: SUM_OF_GROUP(<текст>;<номер_группы>)

И если есть возможность, сделать так чтобы можно было давать одному наименованию несколько групп примерно так:
Абв
аа,а№А№Б-текст1\текст2\(текст3)(текст4);
бб,б№Б-текст1\текст2\(текст3)(текст4);


Пример:
12,53№1-яблоки;
36.2№2-ручки;
45,6№3-проезд;
100№1№3-ресторан;

SUM_OF_GROUP(А1;1)=112,53
SUM_OF_GROUP(А1;2)=36.2
SUM_OF_GROUP(А1;3)=145,6

И можно вынести разделитель № в отдельную константу, чтобы если что можно было её поменять?..

bigor

Позанудствую:
Цитата: fujica от 26 февраля 2019, 19:10
Формула должна суммировать всё принадлежащей одной группе.
API: SUM_OF_GROUP(<текст>;<номер_группы>)
все внутри ячейки? Или все,  что относится к Абв, и отдельно для Эюя ?
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

fujica