Макрос работает в одном документе, я в другом. Возможно ли?

Автор serhiy.k, 12 августа 2010, 21:15

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

dr.Faust

Свобода информации - свобода личности!

serhiy.k

Всем большое спасибо. Не имел времени ответить раньше. Отпишусь тут, когда выберу какой-то из предложеных вами тут и в соседних темах способ.

serhiy.k

#17
Здравствуйте еще раз.
Попробовал несколько вариантов, чтобы дальше в макросе уже использовать oDocument:

oDocument = ThisComponent.getURL()

oDocument = ThisComponent.Title

oDocument = ThisComponent.CurrentController.Frame.Title

И во всех случаях получаю сообщение на этой строчке "Объект недоступен. Неверное использование объекта". Макрос запускаю из меню Сервис—Макросы—Управление макросами—OpenOffice.org Basic.
До этого использовал просто:
oDocument = ThisComponent

Возможно, я делаю что-то не так? Сам я не программист, макросы делаю из тех кусков кода и примеров других макросов, что нахожу в интернете.

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

С уважением, Сергей

convas

#18
Ваш файл с неработающим макросом покажите.

PS.Правильно только:
oDocument = ThisComponent

serhiy.k

Вот, например, макрос. Это другой, так как тот - слишком большой (Типографика для ООо), но в этом вылетает такая же ошибка, если я добавляю что-нибудь после ThisComponent

Sub RemoveEmptyParagraphs 'поиск и удаление одиночных пустых абзацев
 
  Dim oDocument As Object
  Dim oReplace As Object

  oDocument = ThisComponent
  oReplace = oDocument.createReplaceDescriptor

  oReplace.SearchString = "^$"           'регулярное выражение, пустой абзац
  oReplace.ReplaceString = ""    'заменяем ничем, то есть, удаляем
  oReplace.SearchRegularExpression=True  'использовать регулярное выражение
  oReplace.searchAll=True                'обработать весь документ

  REM Выполнить макрос!
  oDocument.replaceAll(oReplace)
End Sub


ЦитироватьPS.Правильно только:
Код:
oDocument = ThisComponent

Это значит, что невозможно работать с другим документом, пока макрос работает над первым?

convas

#20
У меня никакой ошибки не вылетело с Вашим макросом на документе в 1169 страниц, 8820 абзацев, при переключении на работу с другим документом.
Пришлось, правда переключаться очень быстро, т.к. макрос тоже очень быстро отработал.

Хотелось бы увидеть Ваш документ полностью.

Вы пробовали с моим тестовым макросом из Ответа#12 на Calc? У Вас работает или нет?

PS. Может, конечно, работать на Calc'е и не работать на Writer'е. Поэтому нужен аналогичный тестовый макрос для Writer.

convas

#21
Тестовый макрос для Writer:


Sub prnt()
 Dim oText
 Dim vTextCursor
 Dim i As Integer
 Dim Chaine$

 oDocument = ThisComponent

 oText = oDocument.Text
 vTextCursor = oText.createTextCursor()
 For i = 1 To 20000
     Chaine=CStr(i) & " "
     oText.insertString(vTextCursor, Chaine, TRUE)
 Next i
 MsgBox "Finished"
End Sub


Этот макрос работает в одном документе, Вы работаете в другом - никаких проблем.

Рыбка Рио

Цитата: serhiy.k от 23 сентября 2010, 09:02Это значит, что невозможно работать с другим документом, пока макрос работает над первым?
oDocument = ThisComponent - это тот документ, из которого запускается макрос - запускаете макрос в нужном документе, а затем переключаетесь на другой и там делаете что хотите. В макросе oDocument будет указывать на тот документ, из которого вы его запустили, независимо от того, какой документ сейчас является активным.
ubuntu 12.04 + LibO3.6.0

smaharbA

Клио - а если макрос не документа ? или макрос из другого документа ?
не было и нет объектной модели в ООо
Я конечно далек от мысли... (с)

convas

Господа, давайте подкреплять свои мнения (или сомнения) конкретными примерами.

Рыбка Рио

Цитата: smaharbA от 23 сентября 2010, 13:09Клио - а если макрос не документа ? или макрос из другого документа ?
Макрос может хранится в документе а может в профиле OOo. В любом случае, когда вы его запускаете, ThisComponent указывает на активный документ. Запустить макрос, который хранится в другом документе, по-моему, нельзя, т.к. его не видно среди макросов из меню Сервис/Макросы/Выполнить макрос... Там только макросы активного документа и макросы который хранятся независимо от документов. (в предыдущем сообщении имелось ввиду что макрос запускается из документа, т.е. через меню Сервис/Макросы/Выполнить макрос... активного документа)
ubuntu 12.04 + LibO3.6.0

convas

#26
В тестовом макросе для Writer можно строчку
Chaine=CStr(i) & " "
заменить на
Chaine=CStr(i) & Chr(10) & ThisComponent.getURL() & Chr(10) & ThisComponent.Title & Chr(10) & ThisComponent.CurrentController.Frame.Title & Chr(10) & " "
чтобы посмотреть, на какой документ ссылается ThisComponent в макросе.

PS. Особенно интересно во время выполнения макроса сохранить документ под другим именем (Файл - Сохранить как ...).

dr.Faust

Цитата: smaharbA от 23 сентября 2010, 13:09Клио - а если макрос не документа ? или макрос из другого документа ?
И что? oDocument от этого не изменится. Какой бы документ не был бы в него передан из ThisComponent.
Цитата: smaharbA от 23 сентября 2010, 13:09не было и нет объектной модели в ООо
Это как?
Да и не относится ThisComponent к объектной модели - это функция Бэйсик де-факто.
Цитата: Клио от 23 сентября 2010, 13:33В любом случае, когда вы его запускаете, ThisComponent указывает на активный документ.
?
Если макрос в документе, то ThisComponent указывает на тот документ в котором макрос, даже если он не активный.
Свобода информации - свобода личности!

smaharbA

мможно узнать понятие активного документа точнее ?
Я конечно далек от мысли... (с)

smaharbA

всегда ругал и буду за использование Active... и Selection... в МСО
в ООо все гораздо хуже...
Доказывать ничего никогда не стану - идите на обработку сотен документов (хотя бы) там осознаете
Я конечно далек от мысли... (с)