Узнать через макрос версию офиса (MSOffice, Libreoffice и пр.)

Автор izsede, 24 ноября 2022, 22:27

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

izsede

Доброго времени суток, уважаемые форумчане!

В наше немаленькой организации начался переход с Windows на Linux, соответственно с MSOffice на Libreoffice. Переход затягивается примерно на полтора года. А работать нужно сейчас. Теперь у нас у разных работников стоят разные офисы.

Макросы работают по разному в MSOffice и Libreoffice. А мне нужно чтобы один файл корректно работал и там и там.

Выход вижу в создании и выполнении различных макросов для MSOffice и Libreoffice.

Собственно, вопрос: как узнать через макрос каким офисом открыт файл?

Например команда INFO("release") даёт результат:
В MSOffice    - 14.0, или 16.0 и так далее
В Libreoffice - 382eef1f22670f7f4118c8c2dd222ec7ad009daf и подобное

В принципе можно сделать выполнение различных макросов в зависимости от результата этой команды (по длине текста), но это очень уж коряво. К тому же было бы неплохо если б в Openoffice или Р7Офис макросы не выполнялись и выходило предупреждающее сообщение.

Что посоветуете?

bigor

Добрый вечер.
Цитата: izsede от 24 ноября 2022, 22:27Выход вижу в создании и выполнении различных макросов для MSOffice и Libreoffice
и где вы их будете хранить? od* файлы могут хранить как макросы starbasic, так и vba. Но не знаю как их MSO будет открывать и не поломает ли при сохранении. А в файлы MSO форматов starbasic не сохраняется.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

izsede

Файлы xlsx. Макросы не настолько сложные чтобы этот формат не подошел. Во всяком случае я так думаю.

kompilainenn

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

А проверять МСО там стоит или ЛО смысла нет
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

mikekaganski

Цитата: izsede от 24 ноября 2022, 22:27Например команда INFO("release") даёт результат

Так вопрос о Basic или о табличных формулах?
С уважением,
Михаил Каганский

izsede

Цитата: mikekaganski от 25 ноября 2022, 09:29
Цитата: izsede от 24 ноября 2022, 22:27Например команда INFO("release") даёт результат

Так вопрос о Basic или о табличных формулах?

Хотелось бы решить через Basic. Табличная формула это костыль.

bigor

Цитата: izsede от 25 ноября 2022, 09:53Табличная формула это костыль
спорный вопрос, касаемо электронных таблиц
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

#7
Цитата: izsede от 25 ноября 2022, 09:53Хотелось бы решить через Basic

Цитата: izsede от 24 ноября 2022, 23:01Файлы xlsx. Макросы не настолько сложные чтобы этот формат не подошел. Во всяком случае я так думаю.

Вы думаете неверно. Формат XLSX не может хранить макросы, Вам нужен XLSM.

В качестве варианта Вы можете проверять свойство IID у объекта Application. Это свойство есть в Calc, но нет в Excel (и аналогично для пары Writer/Word). Этого свойства также точно нет в OOo/AOO (а также в LO до версии 6.2). Я не знаю насчёт "Р7Офис". В общем, чтобы узнать, что работает ЛО 6.2 и выше:

Function IsLOAtLeast62() As Boolean
  On Error Resume Next
  IsLOAtLeast62 = Application.IID <> ""
End Function

Учитывая, что tdf#36737 был исправлен в LO 7.0, а также что он так и не исправлен в AOO, можно использовать вот это для проверки на OOo/AOO/старые версии LO:

Function IsOOoLOBelow70_Impl(Optional x As Boolean) As Boolean
  IsOOoLOBelow70_Impl = IsMissing(x)
End Function
Function IsOOoLOBelow70() As Boolean
  IsOOoLOBelow70 = IsOOoLOBelow70_Impl
End Function

Всё это, естественно, в модулях VBA в документе.
Но совет @kompilainenn #3, кмк, самый правильный
С уважением,
Михаил Каганский

izsede

Цитата: kompilainenn от 25 ноября 2022, 07:00Тогда вам просто нужно проверять каждый макрос VBA на работоспособность в ЛибреОфис, тогда ваша задумка об одном рабочем файле будет работать.

А проверять МСО там стоит или ЛО смысла нет
Проверял. К сожалению работает по разному. Что можно я перевел в формулы. Там все гораздо совместимее.

izsede

Цитата: mikekaganski от 25 ноября 2022, 10:25
Цитата: izsede от 25 ноября 2022, 09:53Хотелось бы решить через Basic

Цитата: izsede от 24 ноября 2022, 23:01Файлы xlsx. Макросы не настолько сложные чтобы этот формат не подошел. Во всяком случае я так думаю.

Вы думаете неверно. Формат XLSX не может хранить макросы, Вам нужен XLSM.

В качестве варианта Вы можете проверять свойство IID у объекта Application. Это свойство есть в Calc, но нет в Excel (и аналогично для пары Writer/Word). Этого свойства также точно нет в OOo/AOO (а также в LO до версии 6.2). Я не знаю насчёт "Р7Офис". В общем, чтобы узнать, что работает ЛО 6.2 и выше:

Function IsLOAtLeast62() As Boolean
  On Error Resume Next
  IsLOAtLeast62 = Application.IID <> ""
End Function

Учитывая, что tdf#36737 был исправлен в LO 7.0, а также что он так и не исправлен в AOO, можно использовать вот это для проверки на OOo/AOO/старые версии LO:

Function IsOOoLOBelow70_Impl(Optional x As Boolean) As Boolean
  IsOOoLOBelow70_Impl = IsMissing(x)
End Function
Function IsOOoLOBelow70() As Boolean
  IsOOoLOBelow70 = IsOOoLOBelow70_Impl
End Function

Всё это, естественно, в модулях VBA в документе.
Но совет @kompilainenn #3, кмк, самый правильный
Разумеется XLSM. Глупая описка. Спасибо за советы. Попробую разобраться дальше сам.

mikekaganski

Цитата: izsede от 25 ноября 2022, 11:00Проверял. К сожалению работает по разному

... и Вы, я полагаю, описали эти проблемы в соответствующих багрепортах? ;)
С уважением,
Михаил Каганский

izsede

Цитата: mikekaganski от 25 ноября 2022, 11:09
Цитата: izsede от 25 ноября 2022, 11:00Проверял. К сожалению работает по разному

... и Вы, я полагаю, описали эти проблемы в соответствующих багрепортах? ;)
Я еще слишком новичек для этого.  ;)
Похоже разница в работе макросов слишком сильная. Не получается объединить.
Например для переименования листа использую одну из команд:
Private Sub Worksheet_Deactivate()
Лист1.Name = "Реестр"
Worksheets(1).Name = "Реестр"
В МО лист переименовывается после того как я перехожу с этого листа на другой.
А в ЛО команда выполяется один раз, А потом сбой. Захожу в окно «Properties» в редакторе VBA, а там Лист1 без макроса, а создался новый лист Лист 3 и он не подвязан к моему листу никак. Надеюсь понятно написал. И что делать?

sokol92

Цитата: izsede от 25 ноября 2022, 12:23создался новый лист Лист 3 и он не подвязан к моему листу никак
@izsede, при ответах в форуме Вы можете выделить фрагмент текста и нажать кнопку "Цитировать выделенное".

Да, при сохранении в LibreOffice книг формата .xlsm, которые содержат макросы в модулях листа, есть проблемы. Я в ближайшие выходные напишу баг на эту тему. Спасибо за информацию.
Владимир.

izsede

Цитата: sokol92 от 25 ноября 2022, 15:44
Цитата: izsede от 25 ноября 2022, 12:23создался новый лист Лист 3 и он не подвязан к моему листу никак
@izsede, при ответах в форуме Вы можете выделить фрагмент текста и нажать кнопку "Цитировать выделенное".

Не разобрался как это делать со смартфона. Ну да ладно, можно и вручную лишнее удалить.
Спасибо за обратную связь. Не ожидал что здесь отзывчивое комьюнити. Пожалуй в будущем буду посещать ваш форум.  :)

economist

VBA-опыт ценен огромным числом удачных кейсов, на нем написаны сотни тысяч приложений. Если смириться с тем что ODS-формат в приложении LibreOffice теперь является самым свободным и перспективным - внезапно откроются новые грани его совместимости и интероперабельности:
- он хранит и выполняет форматы макросов на трех языках StarBasic, VBA, Python
- он на всех 3-х языках умеет хранить/читать/запускать модули (и файлы) на другом языке
- он на всех 3-х языках умеет читать StdOut, работает с UNO/COM, а значит позволяет сделать то, чего умеют только другие технологии.

Технически модули с VBA в ODS несложно незначительно переписать даже после Excel-макрорекордера, для того чтобы код заработал в LibreOffice с первой строкой Option VBAsupport 1
Так можно использовать опыт старых наработок, силу StarBasic и универсальность/скорость Python. Синергия обеспечена всем, идущим по этому пути.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...