Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

27 Февраль 2021, 21:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 »   Вниз
  Печать  
Автор Тема: нужна помощь для перевода простого VBA-макроса в формат OOCalc  (Прочитано 13936 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Cloud9
Участник
**
Offline Offline

Сообщений: 7


« Стартовое сообщение: 4 Август 2012, 09:13 »

доброго времени суток, глубокоуважаемые коллеги!
Столкнулся с проблемой - не запустить скрипт, написанный под VBA в приложении OpenOffice Calc. Как я понимаю, проблема эта достаточно популярная, однако мне, не имеющему никаких познаний в программировании (по образованию - врач) от этого не легче. Даже более того скажу, когда писался скрипт под VBA - я и то спрашивал помощи у спеца по программированию на этом языке и, хоть с его слов задача выеденного яйца не стоила - для меня это все равно было как чудо.
Собственно к делу: перед тем как писать сообщение сюда, за вчерашний день я постарался вникнуть хотя бы в основы пунктуации кода на OO Basic, но, конечно, перевести код самостоятельно не смог. Всякие онлайн-переводчики не спасли, поэтому обращаюсь за помощью к вам.

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

Очень прошу помочь в переписи кода, даже на самом базовом уровне - с вашими подсказками постараюсь выполнить сам. Саму форму также оставлю здесь - вдруг еще кому-то понадобится.

С уважением,
Константин.

P.S. код загрузил в это сообщение
« Последнее редактирование: 4 Август 2012, 10:38 от Cloud9 » Записан
Yakov
Администратор
**
Offline Offline

Сообщений: 2 567


WWW
« Ответ #1: 4 Август 2012, 09:33 »

Нужен пример кода.
Общие рекомендации:
В начале кода модуля задаём:
Код:
Option VBAsupport 1
Режим совместимости с  VBA
И ещё, в VBA и StarBasic ячейки в листе пронумерованы иначе
Координаты_Excel(x,y) ----> Координаты_StarBasic(y-1,x-1)

Обратиться к ячейке можно так
Код:
Dim r As Object
   Set r = ThisComponent.Sheets().getByName("Имя_листа")
   r.getCellByPosition(y-1, x-1).SetString("Текст в ячейке")
Для получения информации о содержимом ячейки  SetString("Текст в ячейке") заменяем на GetString()
« Последнее редактирование: 4 Август 2012, 09:35 от Yakov » Записан
Cloud9
Участник
**
Offline Offline

Сообщений: 7


« Ответ #2: 4 Август 2012, 09:57 »

Ага, да, это я уже понял. Но, тем не менее, для начала загружу исходник. А потом, с Вашей помощью, начну править.
Заранее огромное спасибо за поддержку Улыбка Будете в Петербурге - приходите на рентген  Смеющийся

ЗАГРУЗИЛ основной код. В ОО открывается, но не работает (естественно).

Первый файл - основной код формы
Второй файл - код экспорта данных в связанный документ word
Третий файл - код команды на автозагрузку формы
Четвертый файл - собственно сам файл-таблица *.xlc

[вложение удалено Администратором]
« Последнее редактирование: 4 Август 2012, 10:35 от Cloud9 » Записан
Cloud9
Участник
**
Offline Offline

Сообщений: 7


« Ответ #3: 4 Август 2012, 12:10 »

Есть у кого-нибудь идеи: при попытке выполнения, первую ошибку выдает на стринге For Each TxtBox In Me.Controls -- "Переменная типа Object не установлена"
Записан
Yakov
Администратор
**
Offline Offline

Сообщений: 2 567


WWW
« Ответ #4: 4 Август 2012, 13:03 »

Как я понял, код.txt,  код2.txt  код3.txt содержатся в Книга1.0.xls
Записан
Yakov
Администратор
**
Offline Offline

Сообщений: 2 567


WWW
« Ответ #5: 4 Август 2012, 13:08 »

Что делает код2.txt ?
Создаёт текстовый документ с нуля и выводит в него данные из таблицы?
Или заполняет уже имеющийся документ  (шаблон документа) данными из таблицы?
Записан
Cloud9
Участник
**
Offline Offline

Сообщений: 7


« Ответ #6: 4 Август 2012, 13:29 »

Если честно, то идея была именно заполнять данными из таблицы связанный шаблон текстового документа - далеко не все мои коллеги могут грамотно экспортировать текст из Экселя\ Калька в Ворд\ Райтер, а это бывает нужно достаточно часто - для отчетов, презентаций, диссертаций и тд.
А так - выделил диапазон с листа1, скопировал на лист2 - нажал кнопку - вуаля! Документ готов.
Сам код я надергал кусками из чужих, выложенных freeware в сети и толком еще не тестил. Основная проблема - это, собственно, первый скрипт.

« Последнее редактирование: 4 Август 2012, 13:31 от Cloud9 » Записан
Cloud9
Участник
**
Offline Offline

Сообщений: 7


« Ответ #7: 4 Август 2012, 13:48 »

Как я понимаю, для автозапуска макроса надо будет использовать что-то вида:

Dim oDlg As Object

Function StartDialog()
    oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
    oDlg.execute()
End Function

Но ругается на oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1) -- "ошибка времени выполнения BASIC/ свойство или метод не найдены Dialog1
Я, конечно, догадываюсь, что проблема с названиями макросов, что UserForm1 = Dialog1, но как поправить пока не понял.
Записан
Yakov
Администратор
**
Offline Offline

Сообщений: 2 567


WWW
« Ответ #8: 4 Август 2012, 15:14 »

Работает такой код:
Код:
oDlg = CreateUnoDialog(DialogLibraries.Standard.UserForm1)
oDlg.Execute()
Записан
Cloud9
Участник
**
Offline Offline

Сообщений: 7


« Ответ #9: 4 Август 2012, 16:02 »

Неа, это, по-логике, сразу пробовал - выдает ошибку:



Да и не запускается при открытии документа, как должен был бы. Приходится alt+F11 -> макросы документа -> module1 -> выполнить
UPD! попробовал еще один финт ушами. Никогда бы не подумал, что все так сложно.
« Последнее редактирование: 4 Август 2012, 16:10 от Cloud9 » Записан
Yakov
Администратор
**
Offline Offline

Сообщений: 2 567


WWW
« Ответ #10: 4 Август 2012, 23:11 »

Я тоже столкнулся с этим. Причина - при старте библиотеки ещё не все подгрузились.
Вот правильный код
Код:
DialogLibraries.LoadLibrary( "Standard" )
oDlg = CreateUnoDialog(DialogLibraries.Standard.UserForm1)
oDlg.Execute()
Записан
Cloud9
Участник
**
Offline Offline

Сообщений: 7


« Ответ #11: 5 Август 2012, 11:02 »

И все же - неужели ни у кого нет мыслей по поводу основного кода макроса? Скачали приложения уйма народа, но кроме твоих советов, Yakov, никто к диалогу не подключается. А ведь если бы я мог сам решить проблему я никогда бы не написал здесь о помощи. Я не заставляю все делать за меня, но хотя бы частично подскажите?
Записан
Yakov
Администратор
**
Offline Offline

Сообщений: 2 567


WWW
« Ответ #12: 17 Август 2012, 11:09 »

http://www.openoffice.org/documentation/HOW_TO/various_topics/VbaStarBasicXref.pdf

Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #13: 18 Август 2012, 12:38 »

И все же - неужели ни у кого нет мыслей по поводу основного кода макроса?
Есть, как не есть быть. Но, поскольку заранее знаю, что они не понравятся, то и не излагаю...
Я не заставляю все делать за меня, но хотя бы частично подскажите?
Да можно было бы и сделать, а не только подсказать... Но тут ведь какая штука - проект развился как раз до состояния "чемодана без ручки" - и тащить тяжело, и бросить жалко. И прекрасно понимаю, что даже если я сейчас буду страшно красноречив и убедителен - все равно пройдет еще какое-то время, пока мои доводы будут восприняты.
В порядке подсказки: давай забудем о неработающем макросе (в смысле, уже работающем, но все еще не так как надо), просто проговорим задачи проекта обычными человеческими словами.
Нужно через простую и удобную для оператора форму ввести набор каких-то данных, сохранить их... По имеющимся данным выдать подборку по определенным параметрам (диапазон дат, название исследования, фамилия пациента...) и выгрузить её в какой-то "не Калковский" формат. Изредка - раз в месяц, в квартал, год - по тем же данным нужно подготовить статистическую сводку...
Пока всё верно?
С вводимым данными по мере ввода ничего особенного делать не надо - ни подсчитывать стоимость каждого исследования, ни вычислять даты предыдущих/следующих визитов, ни пересчитывать дату зачатия в недели беременности... В общем, ни одна из тех особенностей Калка, за который он назван "табличным калькулятором процессором" для проекта не понадобятся. Так? Выбран он - Калк - только за то, что умеет хранить таблицу с внесенными данными (ну, и еще за то, что изначально проект был сделан в Экселе). В первых МС Офисах Аксесс - база данных - шла в общей коробке и была доступна любому пользователю офиса. Потом алчность маркетинговые соображения вынудили корпорацию продавать его отдельно. И сегодняшние пользователи МС Офиса вынуждены делать БАЗЫ ДАННЫХ в ТАБЛИЧНЫХ ПРОЦЕССОРАХ. Просто потому, что нужного инструмента под рукой у них нет.
А вот у пользователей ООо (ЛО) он есть. Называется Base. И умеет этот компонент офиса именно то, о чем мы только что говорили - хранить данные, быстро их возвращать, разрешать искать-исправлять-удалять. И, само собой, вносить. В удобном виде. Практически без макросов.

Понимаю, "многабукав". Но я очень хотел быть убедительным.
Do you speak English? Я тоже нет. И читаю тексты на этом языке через пень-колоду Гугль-переводчик.
Mariano Casanova (знакомая фамилия... Где я мог её слышать?) написал книжку с забавным названием "BASE TUTORIAL: From Newbie to Advocate in a one, two... three!". Текст еще более забавный и полностью соответствует названию. К сожалению, насколько я знаю, никто не перевел ее на русский. К еще большему сожалению ссылка, по которой я брал этот файл, сегодня почему-то не работает... Придется нагрузить местный сервер очень большим файлом...

[вложение удалено Администратором]
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754

Woe from wit


« Ответ #14: 18 Август 2012, 14:08 »

... однако мне, не имеющему никаких познаний в программировании (по образованию - врач) от этого не легче. Даже более того скажу, когда писался скрипт под VBA - я и то спрашивал помощи у спеца по программированию на этом языке и, хоть с его слов задача выеденного яйца не стоила - для меня это все равно было как чудо.
Собственно к делу: перед тем как писать сообщение сюда, за вчерашний день я постарался вникнуть хотя бы в основы пунктуации кода на OO Basic, но, конечно, перевести код самостоятельно не смог...

JohnSUN! И ты предлагаешь ему бросить почти готовую программу и лезть в дремучие дебри Base.

Да попытка написать что-то внятное на Base у него займет в 10 раз больше времени, чем замена неработающих функций VBA на аналогичные из OOBasic, а именно это и нужно для того, чтобы заработал его макрос.

Честно говоря, вот эта необходимость замены неработающих функций VBA на аналогичные из OOBasic, а это тоже очень немалая работа, и отвращает от всяких попыток повозиться тех, кто это мог бы сделать.

Цитата:
Очень прошу помочь в переписи кода, даже на самом базовом уровне - с вашими подсказками постараюсь выполнить сам.

Увы, подсказки должны будут касаться именно самой трудной части работы - подбор и вставка нужных функций из OOBasica вместо функций VBA и проверка их работоспособности, т.е фактически отладка всей программы с новыми функциями.

Но и с Base будет тоже самое, даже намного хуже - функции придется использовать совсем другие, совсем не похожие на уже имеющиеся.

Мораль всего того, что я сказал:
1) трудоёмкость этой задачи по переводу VBA и OOBasic отпугивает потенциальных "гуру",
2) писать программы для Base должен программист БД, а не врач (когда он закончит писать программу, все его пациенты уже закончат свой жизненный путь).

Записан
Страниц: 1 2 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!