• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

VBS: как создать новый документ OpenOffice

лис.хвост

VIP
Разработчик
Сообщения
635
Симпатии
1,027
#1
Добрый день. Подскажите, пожалуйста, как создать новый документ Calc скриптом vbs. Пробовала такой вариант:
Код:
Dim objServiceManager, Stardesktop, oDocToStore
Dim args()
Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
Set Stardesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
Set oDocToStore = Stardesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, args())
работает в vba, vbs выдает ошибку "Индекс выходит за пределы допустимого диапазона: 'args'"
 
Последнее редактирование модератором:

лис.хвост

VIP
Разработчик
Сообщения
635
Симпатии
1,027
#2
Рабочий вариант:

Код:
Set ServiceManager = CreateObject("com.sun.star.ServiceManager")
Set Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop")
arr = Array()
Set Document = Desktop.LoadComponentFromURL("private:factory/scalc", "_blank", 0, arr)
Set Sheets = Document.getSheets()
Set Sheet = Sheets.getByIndex(0)
 
Последнее редактирование модератором:

лис.хвост

VIP
Разработчик
Сообщения
635
Симпатии
1,027
#3
Код:
Объединение ячеек:
Dim dispatcher 'as object
Set dispatcher = ServiceManager.createInstance("com.sun.star.frame.DispatchHelper")
    ReDim args1(0)
Set args1(0) = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
args1(0).Name = "ToPoint"
args1(0).Value = "$B$3"
Call dispatcher.executeDispatch(Document.getCurrentController.getFrame, ".uno:GoToCell", "", 0, args1)
    ReDim args2(1)
Set args2(0) = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
args2(0).Name = "By"
args2(0).Value = 1
Set args2(1) = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
args2(1).Name = "Sel"
args2(1).Value = True
Call dispatcher.executeDispatch(Document.getCurrentController.getFrame, ".uno:GoRight", "", 0, args2)
    ReDim args3(1)
Set args3(0)= ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
args3(0).Name = "By"
args3(0).Value = 1
Set args3(1)= ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
args3(1).Name = "Sel"
args3(1).Value = True
Call dispatcher.executeDispatch(Document.getCurrentController.getFrame, ".uno:GoRight", "", 0, args3)
oArgs = Array()
Call dispatcher.executeDispatch(Document.getCurrentController.getFrame, ".uno:MergeCells", "", 0,oArgs)
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,027
Симпатии
5,639
#4
tisha, это рабочий вариант?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,413
Симпатии
5,278
#6
Да уж. Open Offic-овскую объектную модель гораздо тяжелее понять, чем MS Office. Или это на первый взгляд так кажется...
 

лис.хвост

VIP
Разработчик
Сообщения
635
Симпатии
1,027
#7
Работает, но код некрасивый, завтра посмотрю
Код:
Function test_1(column, line, NumberOfCells)
    Dim dispatcher
    Set dispatcher = ServiceManager.createInstance("com.sun.star.frame.DispatchHelper")

    ReDim args1(0)
    Set args1(0) = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    args1(0).Name = "ToPoint"
    args1(0).Value = "$"& column &"$"& line

    Call dispatcher.executeDispatch(Document.getCurrentController.getFrame, ".uno:GoToCell", "", 0, args1)

    For i = 1 To NumberOfCells - 1
        ReDim args2(1)
        Set args2(0) = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
        args2(0).Name = "By"
        args2(0).Value = 1
        Set args2(1) = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
        args2(1).Name = "Sel"
        args2(1).Value = True

        Call dispatcher.executeDispatch(Document.getCurrentController.getFrame, ".uno:GoRight", "", 0, args2)
    Next
    oArgs = Array()
    Call dispatcher.executeDispatch(Document.getCurrentController.getFrame, ".uno:MergeCells", "", 0,oArgs)
End Function
Все намного проще, выделяем сразу диапазон:
Код:
Function CellMerging(d)
    Dim dispatcher
    Set dispatcher = ServiceManager.createInstance("com.sun.star.frame.DispatchHelper")
    ReDim args1(0)
    Set args1(0) = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    args1(0).Name = "ToPoint"
    args1(0).Value = d
    Call dispatcher.executeDispatch(Document.getCurrentController.getFrame, ".uno:GoToCell", "", 0, args1)
    oArgs = Array()
    Call dispatcher.executeDispatch(Document.getCurrentController.getFrame, ".uno:MergeCells", "", 0, oArgs)
End Function
 

лис.хвост

VIP
Разработчик
Сообщения
635
Симпатии
1,027
#8
У меня для упрощения работы получилась вот такая плюшка
 

Вложения

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,413
Симпатии
5,278
#9
Пора открывать раздел по Open Offic-у :)
Добавлю это чуть позже в полезные примеры в VBA. Спасибо.