нужна помощь для перевода простого VBA-макроса в формат OOCalc

Автор Cloud9, 4 августа 2012, 10:13

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

Cloud9

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

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

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

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

P.S. код загрузил в это сообщение

Yakov

#1
Нужен пример кода.
Общие рекомендации:
В начале кода модуля задаём:

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()

Cloud9

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

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

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

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

Cloud9

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

Yakov

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

Yakov

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

Cloud9

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


Cloud9

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

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

Работает такой код:

oDlg = CreateUnoDialog(DialogLibraries.Standard.UserForm1)
oDlg.Execute()

Cloud9

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



Да и не запускается при открытии документа, как должен был бы. Приходится alt+F11 -> макросы документа -> module1 -> выполнить
UPD! попробовал еще один финт ушами. Никогда бы не подумал, что все так сложно.

Yakov

Я тоже столкнулся с этим. Причина - при старте библиотеки ещё не все подгрузились.
Вот правильный код

DialogLibraries.LoadLibrary( "Standard" )
oDlg = CreateUnoDialog(DialogLibraries.Standard.UserForm1)
oDlg.Execute()

Cloud9

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


JohnSUN

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

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

[вложение удалено Администратором]
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Hasim

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

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

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

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

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

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

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

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