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

Тема в разделе "Макросы Word, Excel (VBA)", создана пользователем лис.хвост, 3 авг 2015.

  1. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    Добрый день. Подскажите, пожалуйста, как создать новый документ Calc скриптом vbs. Пробовала такой вариант:
    Код (vb.net):
    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'"
     
    Последнее редактирование модератором: 3 авг 2015
  2. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    Рабочий вариант:

    Код (vb.net):
    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)
     
    Последнее редактирование модератором: 3 авг 2015
    Dragokas нравится это.
  3. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    Код (vb.net):
    Объединение ячеек:
    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)
     
    Последнее редактирование: 3 авг 2015
  4. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.208
    Симпатии:
    4.977
    tisha, это рабочий вариант?
     
  5. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    Работает, но код некрасивый, завтра посмотрю
     
  6. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Да уж. Open Offic-овскую объектную модель гораздо тяжелее понять, чем MS Office. Или это на первый взгляд так кажется...
     
  7. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    Код (vb.net):
    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
    --- Объединённое сообщение, 4 авг 2015, Дата первоначального сообщения: 4 авг 2015 ---
    Все намного проще, выделяем сразу диапазон:
    Код (vb.net):
    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
     
    Dragokas и Kиpилл нравится это.
  8. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    У меня для упрощения работы получилась вот такая плюшка
     

    Вложения:

    • OpenOffice.txt
      Размер файла:
      6,9 КБ
      Просмотров:
      5
  9. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Пора открывать раздел по Open Offic-у :)
    Добавлю это чуть позже в полезные примеры в VBA. Спасибо.
     

Поделиться этой страницей