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

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

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

serhiy.k

Здравствуйте,
Работаю с большими текстами, и макрос работает над документом долго. Может кто знает, возможно ли сделать так, чтобы макрос работал с одним документом, а я в это время с другим?

На данный момент, когда я во время работы макроса переключаюсь в другой документ, макрос вылетает с ошибкой.

Макрос работает с ThisComponent. Может есть возможность указать что-то другое, чтобы макрос не переключался на новое окно, когда я перелючаюсь на другой документ?

Нашел пока выход такой, что запускаю OpenOffice Portable и работаю в нем. Или это единственный выход?

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

smaharbA

виндов в переменную. Либо запускать второй процесс, как зависит от ОС.
а по сути работа объектов в ооо отвратительна, мсо пережил это еще в ексель 4 (уже не было), оно напоминает тупых программеров с вечным актив и селект...
Я конечно далек от мысли... (с)

Yakov

StarDesktop.CurrentComponent:
http://wiki.services.openoffice.org/wiki/Currently_active_document

Но как я понял если его вызывать из отладчика - то будет указывать на отладчик!

Рыбка Рио

Макрос который вставит слово "Привет!" во все открытые документы Writer:

REM  *****  BASIC  *****

Sub Main
N=StarDesktop.Frames.Count-1
p=chr(13)
Dim Doc(N) As Object, TK(N) As Object
For i=0 to StarDesktop.Frames.Count-1
   If not isNull(StarDesktop.Frames(i).Controller) then
      If StarDesktop.Frames(i).Controller.Model.supportsService("com.sun.star.text.TextDocument") then
         Doc(i)=StarDesktop.Frames(i).Controller.Model
         TK(i)=Doc(i).Text.createTextCursor()
         TK(i).gotoEnd(FALSE)
         TK(i).String=p+p+"Привет!"
      Endif
   Endif
Next
End Sub
ubuntu 12.04 + LibO3.6.0

smaharbA

Я конечно далек от мысли... (с)

Рыбка Рио

#5
Цитата: serhiy.k от 12 августа 2010, 20:15Макрос работает с ThisComponent. Может есть возможность указать что-то другое, чтобы макрос не переключался на новое окно, когда я перелючаюсь на другой документ?
Вместо ThisComponent можно использовать StarDesktop.Frames(i).Controller.Model, при запуске макроса показывать диалог со всеми документами  StarDesktop.Frames(i).Controller.Title, выбираете их по имени, и макрос будет с ним работать. См, к примеру, Table of Contents | OpenOffice.org repository for Extensions ( там макрос запускается из меню, а не из диалога).


[вложение удалено Администратором]
ubuntu 12.04 + LibO3.6.0

dr.Faust

А с чего это документ в переменной должен изменится? Или вы постоянно дёргаете ThisComponent?

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

smaharbA

#7
dr.Faust - макрос может не один запускаться и не зависимо от действий пользователя или опосредованно

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

но вернее по всей видимости будет автору макрос в доке держать
Я конечно далек от мысли... (с)

dr.Faust

Цитата: smaharbA от 13 августа 2010, 05:11dr.Faust - макрос может не один запускаться и не зависимо от действий пользователя или опосредованно
И что?
Запускается же он в активном документе. Заберите доку в переменную и всё. Какие проблемы? Что не так?
Свобода информации - свобода личности!

smaharbA

макрос может не один запускаться и не зависимо от действий пользователя или опосредованно

если не в доке процедура - будет болт при активном рыскании усера по докам
Я конечно далек от мысли... (с)

dr.Faust

Цитата: smaharbA от 13 августа 2010, 10:24макрос может не один запускаться и не зависимо от действий пользователя или опосредованно
Ну и что?

Хорошо, если так непонятно попробую развернуть доказательство того, что это не имеет никакого отношения к вопросу:
1 Если макрос запускается из активного документа, он получит "правильный" ThisComponent, который можно забрать в переменную, после чего не важно рыскает ил юзер по активным докам.
2 Если макрос запускается не из активного документа, обращение к ThisComponent бессмысленно в принципе и соответственно так же всё-равно рыскает ли юзер по докам или нет. Вообще в этом случае вопрос превращается в нечто похожена "Почему не работает этот цикл - If a=0 Then a=1 ?" Ну как минимум, потому. что это не цикл:
- Алло, я туда попал?
- Не знаю. А куда вы целились?
3 Если макрос запускается с целью отличной от ThisComponent, то вообще не имеет никакой разницы чем занимается юзер.

В итоге имеем Марковскую цепочку, где "Вашпе никакой  разницы что делает юзер!" - наше настоящие...
Свобода информации - свобода личности!

smaharbA

#11
пункт 2 обычный подход, о чем в сабже и речь на все сотни процентов !
Я конечно далек от мысли... (с)

convas

#12
У меня этот макрос работает в одном документе (imacros.ods), и я могу открывать другой и работать в нем, причем в первом макрос продолжает работать.
Или я что-то не понял?

Sub SVP
  Dim oDoc As Object, oSheet As Object, oCell As Object

  oDoc=ThisComponent

  oSheet=oDoc.Sheets.getByName("Лист1")

  oCell=oSheet.getCellByposition(2,5)

For i=0 To 500
For k=0 To 500

  oCell.setValue(i)
 
Next k
Next i

End Sub



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

dr.Faust

Цитата: convas от 13 августа 2010, 12:00У меня этот макрос работает в одном документе (imacros.ods), и я могу открывать другой и работать в нем, причем в первом макрос продолжает работать.
А чего бы ему не работать?

Цитата: smaharbA от 13 августа 2010, 11:10пункт 2 обычный подход, о чем в сабже и речь на все сотни процентов !
Возможно, возможно...
Свобода информации - свобода личности!

convas

Цитата: dr.Faust от 13 августа 2010, 12:15А чего бы ему не работать?

А тогда из-за чего всё это обсуждение? В чём проблема?