Comments 31
Спасибо! Надо заняться изучением VBA
А также очень похожим на него StarBasic из свободного офисного пакета LibreOffice. И Python до кучи, потому то он тоже есть в LibreOffice. Списки из статьи в LibreOffice можно универсально организовать в любом приложении - тексте, таблице, рисунке, презентации по нажатию Ctrl+Shift+F4, используя для фильтрации данных удобную прослойку из SQL-запросов. Все это работает десятилетиями и достаточно надёжно. PowerQuery - кандидат на удалённую блокировку #1, поскольку ассоциирован с пользователями. Хотя я не алармист, но тревожно...
Разве что, только для себя. В корп секторе лицензий на Excel уже не будет, Microsoft блокирует целый ряд приложений и сервисов.
@AlmazVafin, в соседней ветке VBA уже хоронят! Можете не успеть)
Для более лучшей читабельности можно чтобы функция, которая извлекает числа из текста разделяла символом "_", а не "х". Лучше ведь "128_8", чем "128х8". Хотя, этот не так важно
Для автоматизации рутины совсем неплохо
Статью можно было разбить на две разные, читалась бы легче
1 Есть ли что-то простое, чтобы формы Excel формировались в html, т.е., обработка таблиц на VBA, но экранные формы не во внутреннем формате, а публикуются как html (включая ввод данных в форму для изменения значений ячеек таблица).
js-библиотеки есть, но хотелось бы что-то готовое, что позволяло бы представить обычную форму excel (vba) в виде html-странички, примерно, как это в гугл-таблицах.
2 Есть что-то готовое, типа (задача): есть три (много) справочника (таблички именованных объектов). Каждый объект одного справочника связан с объектом другого один ко многим. Хотелось бы выбрав один объект, увидеть с какими объектами каждого другого справочника он связан. При этом связь достаточно задать один раз: задали в справочнике 1 связь: А (объект справочника 1) - связан с Б (объект справочника 2) и при анализе связей из справочника 2, мы определим, что Б связано с А. Видимо связи между объектами разных справочников нужно задавать не в отдельном (каждом) справочнике, а где то отдельно?
Пример: есть список (справочник) процессов, список типовых форм и список НД (нормативный документ). В каждом списке кроме имени объекта - еще поля его свойств. Выбрали справочник процессов, выбрали в нем нужный процесс и рядом в окне с именем "типовая форма" увидели все названия типовых форм (с их свойствами), привязанных к этому процессу. В соседнем окне аналогично выводятся все названия НД (с параметрами НД), которые привязаны к выбранному процессу. Может быть есть готовое красивое решение?
Связи получаются парные, поэтому руками дублировать их не хотелось бы в каждом справочнике, т.е. связь: А-Б в справочнике 1, должна автоматом дублироваться в справочник 2: Б-А. Или какой-то иной подход. Т.к. связь один ко многим, то для указании связи придется делать какие-то ухищрения, типа строка с id через запятую - со всеми связями к этому объекту.
1.Зачем? HTML априори медленнее внутренней реализации. Я сейчас борюсь с таблицами в Р7, но даже там, при том что всё почти построено на JS+HTML на ядре Chromium,сама таблица рисуется бинарным кодом где то глубоко внутри и только выводится в канву. Поверьте, тот способ общения с таблицами что есть в Excel+VBA почти идеальный вариант любой работы с ними
2.Вы что то пытаетесь разные задачи в одну запихать. Иерархические справочники (и объекты в целом) чаще всего крайне не удобны для табличных представлений, и наоборот. Не даром, умные люди очень давно разделили это всё, и в одну кучу не пихают (если что, я про визуальную составляющую GUI, а не про форматы хранения такого рода представлений). То что вы описывате для примера, можно реализовать даже на VBA, но это будет крайне глючное, и медленное решение, так как для подобного рода задач вам нужен инструмент типа Access, но никак не Excel.
чтобы формы Excel формировались в html, т.е., обработка таблиц на VBA, но экранные формы не во внутреннем формате, а публикуются как html (включая ввод данных в форму для изменения значений ячеек таблица).
js-библиотеки есть, но хотелось бы что-то готовое, что позволяло бы представить обычную форму excel (vba) в виде html-странички, примерно, как это в гугл-таблицах.
Однажды несколько лет назад посмотрел как сохраняются рабочии книги Excel в облаке mail.ru! Реально в html, границы таблиц черточками прорисованы!!! Совсем не как в гуглотаблицах… Лютая жесть!
Это можно сделать на Python во фреймворке Streamlit на 20 строк кода, который все хранит в SQLite или в том что ещё быстрее. Только тут для VBA и Excel работы уже не будет - экосистема Python c Pandas умеет всё, включая генерацию Excel-файлов.
Web нужен по существу, для доступа с любых устр-в по всему миру? Если нет - обратите внимание на LibreOffice: в нем Формы ввода формата odt можно просто разослать пользователям по LAN и все данные будут автоматически одновременно попадать в базу данных любого проф. формата. И да, это без Макросов вообще. Добавив макросы можно сделать всё остальное. Код на vba в LibreOffice на 80% работает без переделки.
Хотелось бы все же на Excel. Там целая экосистема, включая, например, связку с Visio (и автономная задача для Visio \ Word \ Outlook \ Project и др.). Плюс, все хорошо знают таблички Excel. Не хватает только к нему научиться web прикручивать, точнее штатные формы публиковать в html или как вариант рисовать аналогичные экранные формы, но в другом конструкторе, который уже дружит с web и понимает объектную модель Excel.
Штатный web-функционал Excel и ШП позавчера умерли. Продолжаете делать ставку на дохлую лошадь?
Вы можете нарисовать формы на том что я написал и заменить одну строку:
df.to_excel('*.ods')
на
df.to_excel('*.xlsx')
И дальше пилите на VBA. Но помните что вы плодите сущности и отстаете от трендов, и что таблички Excel и Calc - давно одно и то же, с одинаковыми русскоязычными формулами, и VBA код в Calc работает на 80%, а остальное можно переписать за несколько дней, и оно будет работать вечно.
Что же касается web-форм, их можно делать не только в Streamlit, но я вам показал кратчайший путь, чтобы сделать свой Google Sheets.
Может быть есть варианты (например, сторонние плагины), которые позволят в LibreOffice связывать Calc и Draw, т.е. некое подобие штатной связки Visio - Excel или как то иначе экспортировать и импортировать (типа как в visio «Данные фигуры») данные в Calc \ Draw? Т.е. векторные рисунки Draw должны быть связаны с внешним источником (таблицами, БД), откуда подсвечиваются (берутся) атрибуты графического объекта (примечание к объекту "Документ", родительский объект, тип объекта и т.п).
Если есть такое, то где почитать? Может что-то аналогичное есть для Drawio (связь с таблицами Calc, Excel или БД)?
Программирование на StarBasic/LOBasic поддерживают все приложения OpenOffice|LibreOffice: Writer, Calc, Impress, Draw, Base: https://wiki.documentfoundation.org/Documentation/Publications/ru (и в 3Х больше на английском на офсайте https://documentation.libreoffice.org/en/english-documentation/)
Но не обойтись также без глубокого перепрочтения 3-х книжек Питоньяка, 3-х Форумов и сильного желания полюбить этот большой и сложный офисный пакет.
Хоть какая то интеграция Calc с Draw есть? Штатная или через сторонние примочки?
Ctrl+Shift+F4, Calc-файл подключить как базу данных в Base. Это Calc->Draw. С обратно - сложнее:
Параметры объектов в Draw можно считать макросом и сохранить в Base. Формат базы нужно выбрать не сердцем, а умом (SQLite, MySQL итд).
Вопрос обобщил тут а конкретный пример привел тут
Хотелось бы ссылку на конкретный пример (за ссылки на guide тоже спасибо) связки Calc->Draw и Draw -> Calc, а в идеале двухсторонней связи, типа Visio BackSync
Формат базы нужно выбрать не сердцем, а умом (SQLite, MySQL итд).
Не понятно, если речь про связку по данным Calc и Draw, то зачем нужен выбор, тем более "сердечный".
Связка Drawio и Calc - не встречалась?
импортировать (типа как в visio «Данные фигуры») данные в Calc \ Draw?
LibreOffice 7.5.1.2 в приложении Draw не нашел аналога Shape Data (Custom Properties).
не обойтись также без глубокого перепрочтения 3-х книжек Питоньяка, 3-х Форумов и сильного желания полюбить этот большой и сложный офисный пакет.
Каюсь, это всё я не успел почитать!
Наиболее выносящим мозг отличием StarBasic от VBA является более сложная объектная модель, разделенная на MVC - Model, View, Controller. То что было Shape на VBA может быть чем-то из M, V, C. И при этом нет способа обратиться к объекту по имени, можно лишь перебрать их все, считать имена и после этого продолжить с ним работу. В "батарейках", в либе Tools есть три функции getControlModel, getControlShape итд. Изучите их. От многих событий мыши легко получить контекст (на чем кликнули) через св-во Event.
Хорошо бы найти (составить) сопоставление обоих объектных моделей.
Такого документа не существует ввиду разнонаправленного движения данных программ и значительных их различий (крупное я описал выше). Но есть несколько старых рекомендаций на офсайте по переходу с VBA на Basic.
Отличия не только в API и объектной модели. Разнятся даже подходы к изучению.
Лучший способ изучать VBA в Excel - макрорекордер, особенно выведенный на второй монитор (realtime code render)
Лучший способ изучать LO Basic - книги Питоньяка. Макрорекордер в OpenOffice|LibreOffice есть, но он записывает команды прослойки - т.н. Диспетчера, и примерно половину команд не ловит, и на второй монитор ничего до конца записи не выводит.
Поделюсь своим опытом на VBA: если вкратце, то полноценную разработку на нем нужно вести просто минимально, если разве что другие коллеги просто жить без экселя не могут. Потому как:
Макросы уже основательно заблокированы по умолчанию, придется показывать каждому, как их разрешить, особенно если документы лежат в сетевых директориях.
Приготовьте хороший автобэкап, т.к. крашатся макросы во время разработки на раз-два, нередко приводя не неоткрываемым файлам.
Excel + git - это боль. Бинарный формат, этим все сказано. Read-only дифы с помощью самописных/3rd-party тулов возможны, мержи скриптов - тоже (потратил порядка недели для написания питоновских скриптов для 3-way merge), полноценные мержи страниц и контролов - если знаете, то расскажите как. Работать параллельно над одним и тем же файлом используя git из-за этого практически невозможно.
Одна из основных концептуальных проблем с экселем - слитые воедино логика (формулы и макросы) и данные (содержимое ячеек). Из-за этого невозможно просто починить макрос в одном файле и распространить эти изменения на все файлы, которые содержат копию этого макроса. Лично я решил эту проблему "проксированием" содержимого ячеек в JSON: при сохранении эксельника сохраняется не сам файл, а его содержимое перенаправляется в JSON. При открытии такого эксельника JSON автоматически загружается в ячейки. С таким подходом можно использовать один и тот же эксель файл для нескольких файлов проектов. Метод естественно имеет довольно много ограничений.
Да, в том то и дело что коллеги жить не могут без экселя, т.к. вся основная их работа - в цифровизации документации. А я, а я просто увлекаюсь программированием, вот так и столкнулся с VBA, когда потребовалось автоматизировать рутину.
С автобэкапом согласен на все 100. Был случай, когда при открытии файла макросы просто куда-то пропадали... Причем файл никак не был поврежден. Excel и git не пытался связать (Шаблон с макросами весит не особо много, поэтому все версии изменений храню на локальном и часть - на облачном), поэтому и подсказать тут не смогу.
За JSON отдельное спасибо, не рассматривал даже его для таких целей.
Взгляд НСИ на VBA в Excel и не только