Последовательность выполнения макросов

Автор Konstanta, 18 октября 2019, 08:47

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

Konstanta

Форумчане, приветствую Вас!
В Excel несколько записанных отдельных макросов (собранных в копилке) спокойно дополняют друг друга в одном модуле путём копирования и вставки.
В LO есть записанный рекордером макрос, который водит в заданную ячейку формулу.
Работает нормально.

Есть другой макрос, который (писался отдельно) копирует ячейку и вставляет как значение.
Работает нормально.

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

Пытаюсь понять две вещи:
1. Почему тоже самое в Excel работает нормально а в LO нет?
2. Как всё-таки решать такую проблему LO ?
Мы ведь часто дополняем самые разные макросы другими кодами (из копилки)...
Всем Спасибо!

rami

Механическая смесь кода может работать только случайно. Покажите исходные макросы и результат их объединения.

mikekaganski

В сформулированном виде вопрос не имеет смысла.

Написание макроса - это программирование. Если какие-то две программы на одном языке программирования случайно можно состыковать без изменений в одну работающую программу, а другие две на другом языке нельзя, это ничего не говорит ни о языках, ни о программах. Каждый отдельный случай создания более сложного макроса из более простых, независимо от среды, должен решаться индивидуально. Я могу составить макросы на VBA, которые нельзя будет состыковать без изменений, и макросы на StarBasic, стыкующиеся без проблем.

Приведите пример кода, и можно будет дать конкретный совет.
С уважением,
Михаил Каганский

Konstanta

прошу простить моё невежество... Я знаю ( по правилам форума) что в пост вставлять код неверно, но не нахожу здесь кнопки вызова поля с прокруткой

bigor

Цитата: Konstanta от 18 октября 2019, 10:16не нахожу здесь кнопки вызова поля с прокруткой


Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

economist

Если оба макроса в Calc работают нормально - можно вызывать один макрос из другого вот так:

Sub macro1
...
Call macro2
...
End sub

----------------------------------------------

Sub macro2
...
End sub


Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Konstanta

Ай Спасибо!!!
Работает!
В Excel это выглядит как aplication run...
В LO не догадаешься так сразу.

Konstanta

#7
Цитата: mikekaganski от 18 октября 2019, 09:21Приведите пример кода, и можно будет дать конкретный совет.

sub formula
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$C$6"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "StringName"
args2(0).Value = "=3+5*18"

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args2())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0, Array())


end sub


sub vstavit
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$C$6"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args3(5) as new com.sun.star.beans.PropertyValue
args3(0).Name = "Flags"
args3(0).Value = "SVD"
args3(1).Name = "FormulaCommand"
args3(1).Value = 0
args3(2).Name = "SkipEmptyCells"
args3(2).Value = false
args3(3).Name = "Transpose"
args3(3).Value = false
args3(4).Name = "AsLink"
args3(4).Value = false
args3(5).Name = "MoveMode"
args3(5).Value = 4

dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args3())


end sub

Обычно, когда прописываю последовательно другие действия, создаю всегда следующий макрос, а потом в первый вставляю  до "end sub"
В данном примере тупо есть произвольно введённая формула, которую я копирую вторым макросом и вставляю как значения.
Но как только помещаю в один макрос он ругается...

rami

Макрорекордер пишет макросы по шаблону, поэтому в каждом из макросов есть одинаковые строки кода. Если вы хотите объединить код нескольких макросов, нужно избавляться от дубликатов кода, это можно сделать если удалить, или переписать проблемные места.В приведённом выше коде достаточно удалить следующие строки кода (они идут подряд):

'...
end sub


sub vstavit
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
'...

Konstanta

Цитата: rami от 18 октября 2019, 11:43можно сделать если удалить, или переписать проблемные места.
В Либре при прогоне исполнения макроса F5 он последовательно переходит к следующей проблеме.
Я верно понимаю, что достаточно будет "зарэмить" данные строки и в итоге я получу рабочий код?
Или это будет не всегда работать?

bigor

Цитата: Konstanta от 18 октября 2019, 12:02Я верно понимаю, что достаточно будет "зарэмить" данные строки и в итоге я получу рабочий код?
Да, достаточно "зарэмить"
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Konstanta


Konstanta

Вопрос к старожилам: здесь принято закрывать тему?
в моём окне не вижу такой опции

bigor

#13
Отредактировать название темы, добавить [Решено]
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Konstanta