Меню

Libreoffice ошибка времени выполнения basic объектная переменная не установлена

Konstantin_F

0 / 0 / 0

Регистрация: 16.05.2015

Сообщений: 29

1

20.03.2018, 11:37. Показов 9363. Ответов 12

Метки basic, cells, openoffice (Все метки)


Здравствуйте! Написал простейший макрос в OpenOffice 4.1.5

Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub Main
s=17
For i=1 To 6
    For J=1 To 24
        Cells(s. 1) = Cells(i. 1)
        Cells(s. 1) = Cells(j. 2)
        s=s+1    
    Next J
Next i
End Sub

Получил сообщение:
Ошибка времени выполнения BASIC
Переменная типа Object не установлена

При этом помечает эту строку: Cells(s. 1) = Cells(i. 1)

Что я не сделал?
Что сделать, чтобы макрос заработал?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



6507 / 4642 / 1928

Регистрация: 02.02.2014

Сообщений: 12,458

20.03.2018, 11:57

2

индексы ячеек разделяются запятыми
обратите внимание, внутри цикла в одну и ту же ячейку записываются разные данные



1



0 / 0 / 0

Регистрация: 16.05.2015

Сообщений: 29

20.03.2018, 13:45

 [ТС]

3

Исправил запятые
Теперь пишет в том же месте: Подпрограмма или функция не определена



0



Krasme

6507 / 4642 / 1928

Регистрация: 02.02.2014

Сообщений: 12,458

20.03.2018, 14:47

4

проверяйте
у меня libreoffice, не думаю, что openoffice иначе работает

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
EM  *****  BASIC  *****
 
Sub Main
Dim oSheet As Object
oSheet=thisComponent.sheets.getByName("Лист1")
 
rem нумерация идет с 0
s=0
For i=0 To 6
 For j=0 To 24
   rem вариант числа
    oSheet.getCellByPosition(3,s).Value=oSheet.getCellByPosition(0,i).Value
    rem вариант строки
    oSheet.getCellByPosition(4,s).setstring(oSheet.getCellByPosition(0,j).getstring)
  s=s+1 
 Next j
Next i
 
End Sub



1



0 / 0 / 0

Регистрация: 16.05.2015

Сообщений: 29

20.03.2018, 16:23

 [ТС]

5

Пишет: Пишет синтаксическая ошибка Basic. Ожидается Sub



0



6507 / 4642 / 1928

Регистрация: 02.02.2014

Сообщений: 12,458

20.03.2018, 16:32

6

вы полностью скопировали код?
тогда в первой строке поправьте «em» на «rem»
когда копировала кода, первую букву не зацепила



1



0 / 0 / 0

Регистрация: 16.05.2015

Сообщений: 29

21.03.2018, 11:03

 [ТС]

7

Да. Я исправил. Всё работает.
Немного не так как хотелось бы.

Получается столбец нулей и в следующем столбце значения первого столбца с пустыми ячейками.

Нужно брать в первом столбце первое значение и ставить ему в соответствие все значения из второго столбца.
Далее берем второе значение из первого столбца и т.д.

Что надо подправить в формуле?



0



6507 / 4642 / 1928

Регистрация: 02.02.2014

Сообщений: 12,458

21.03.2018, 11:12

8

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

вышеприведенный код — лишь образец того, как работать с ячейками в libreoffice. исходных данных-то у меня нет.



1



0 / 0 / 0

Регистрация: 16.05.2015

Сообщений: 29

21.03.2018, 12:07

 [ТС]

9

В файле пример.
В столбцах А и В исходные данные
В столбце D результат



0



Krasme

6507 / 4642 / 1928

Регистрация: 02.02.2014

Сообщений: 12,458

21.03.2018, 12:17

10

Лучший ответ Сообщение было отмечено Konstantin_F как решение

Решение

конкретно под ваше задание

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
REM  *****  BASIC  *****
 
Sub Main
Dim oSheet As Object
oSheet=thisComponent.sheets.getByName("Лист1")
 
rem нумерация идет с 0
s=0
For i=0 To 5
 For j=0 To 23
    rem вариант строки
    oSheet.getCellByPosition(3,s).setstring(oSheet.getCellByPosition(0,i).getstring + " " +oSheet.getCellByPosition(1,j).getstring)
  s=s+1 
 Next j
Next i
 
End Sub



1



0 / 0 / 0

Регистрация: 16.05.2015

Сообщений: 29

21.03.2018, 12:50

 [ТС]

11

Спасибо!

Всё отлично!

Подскажите где или что можно почитать, чтобы лучше разбираться в BASIC ?



0



6507 / 4642 / 1928

Регистрация: 02.02.2014

Сообщений: 12,458

21.03.2018, 13:01

12



1



0 / 0 / 0

Регистрация: 16.05.2015

Сообщений: 29

21.03.2018, 17:34

 [ТС]

13

Спасибо!

Вы мне помогли!



0



Установка текущей даты в поле диалога не работает

Автор smagluk, 20 июня 2020, 09:52

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

Здравствуйте

У меня в макросе  для ООО все прекрасно работало  

REM Процедура при запуске диалога
DialogLibraries.LoadLibrary("Standard")

REM Создаем диалог
Dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)

REM Установим начальную дату в СЕГОДНЯ
Dlg.getModel().getByName("DateField1").Date = CdateToIso(Date())

Теперь установили Libreoffice  и Dlg.getModel().getByName(«DateField1»).Date = CdateToIso(Date())    пишет Ошибка времени выполнения Basic. Объектная переменная не установлена.
Не могу понять , что ей надо.


В строке кода Dlg.getModel().getByName(«DateField1»).Date = CdateToIso(Date()) замените Date на Text так: Dlg.getModel().getByName(«DateField1»).Text = CdateToIso(Date())


Не работает.
Точнее не ругается на переменную, но поле DateField1 в диалоге не заполняет. Отображается дата по умолчанию.

Может файл поможет.


У меня пример отрабатывает без использования CdateToIso, т.е. =Date()


Придется дальнейшую логику менять.   :'(


smagluk и sokol92, какие у вас офисы (версии)?

Цитата: sokol92 от 20 июня 2020, 12:21У меня пример отрабатывает без использования CdateToIso, т.е. =Date()

У меня в LibreOffice  6.4.3.2 не работает, не тот формат даты, но если изменить формат даты, то нормально.

smagluk, измените в вашем коде:
1. Dim DateField1          As    New com.sun.star.util.Date вместо As Date (у вас эта переменная не использовалась, но если нужна, создайте новую)

2. вместо строки кода: Dlg.getModel().getByName(«DateField1»).Date = CdateToIso(Date())

DateField1.Day = DatePart("d", Date())
DateField1.Month = DatePart("m", Date())
DateField1.Year = DatePart("yyyy", Date())
Dlg.getModel().getByName("DateField1").Date = DateField1


Rami, а так нельзя написать в #1:

Dlg.getModel().getByName("DateField1").Date = CDateToUnoDate(Date())

Не очепятка?


Как то сложно.
работать через текстовое поле  я еще могу понять, но чтобы в офисе отсутствовал механизм работы с датами, такого не может быть.
Ведь и то и то работает
MsgBox Date()                          -20.06.2020
MsgBox CdateToIso(Date())         -20200620
Значит в  поле диалога что-то поменяли и значения только текстовые теперь?


Цитата: sokol92 от 20 июня 2020, 13:26Не очепятка?

Можно. Это новая (относительно) функция. Наверно, с тех пор, как поменяли формат даты.

smagluk, CdateToIso, нужно заменить на CDateToUnoDate, а CDateFromIso, нужно заменить на CDateFromUnoDate


Цитата: sokol92 от 20 июня 2020, 13:26
Rami, а так нельзя написать в #1:Dlg.getModel().getByName("DateField1").Date = CDateToUnoDate(Date())

Не очепятка?

Вот это то что нужно, спасибо.
работа пошла.


Цитата: rami от 20 июня 2020, 13:10smagluk и sokol92, какие у вас офисы (версии)?

Проверил на 6.4.3.2 Ubuntu en-US и на 6.4.4.2 (x64) Win10 ru-RU

Для тех версий Basic, где нет «Date-Uno» функций (например, VBA :)) их можно написать:

Function CdateToUnoDate(ByVal d) As Object
   Dim ud As Object
   Set ud = CreateUnoStruct("com.sun.star.util.Date")
   With ud
     .Year = Year(d)
     .Month = Month(d)
     .Day = Day(d)
   End With
   Set CdateToUnoDate = ud
End Function

Function CdateFromUnoDate(ByVal ud) As Date
   With ud
     CdateFromUnoDate = DateSerial(.Year, .Month, .Day)
   End With
End Function


Это работает:
Dlg.getModel().getByName(«DateField1»).Text = Date()


Всем спасибо, вроде разобрался. В опен дата была одной строкой. А сейчас как я понял, немного по другому. Поле дата является «массивом» из 3ех значений Дата, месяц и год. Верно?



  • Форум поддержки пользователей LibreOffice, Apache OpenOffice

  • Главная категория

  • Basic

  • Установка текущей даты в поле диалога не работает

Вы пишите макрос в LibreOffice используя синтаксис VBA Excel. Синтаксис немного разный.

Для Excel VBA:

Sub RemoveRow()
    Dim iLastRow As Long
    Dim s1, s2, s3 As String

    s1 = "Вход"
    s2 = "Выход"
    s3 = "Отказ"

    iLastRow = Cells(Rows.Count, 1).End(xlUp).Row

    Do While (iLastRow >= 4)
        If (Cells(iLastRow, 5) <> s1) And (Cells(iLastRow, 5) <> s2) And (Cells(iLastRow, 5) <> s3) Then
            Rows(iLastRow).Delete
        End If
        iLastRow = iLastRow - 1
    Loop
End Sub

Для LibreOffice Basic:

Sub RemoveRow
    Dim iLastRow As Long
    Dim s1, s2, s3 As String
    Dim s As String
    Dim oDoc As Object

    s1 = "Вход"
    s2 = "Выход"
    s3 = "Отказ"

    oDoc = ThisComponent

    Curs = oDoc.Sheets(0).createCursor
    Curs.gotoEndOfUsedArea(True)

    iLastRow = Curs.Rows.Count

    Do While (iLastRow >= 3)
        s = oDoc.Sheets(0).getCellByPosition(4, iLastRow).getString()
        If ((s <> s1) And (s <> s2) And (s <> s3)) Then
            oDoc.Sheets(0).Rows.removeByIndex(iLastRow, 1)
        End If
        iLastRow = iLastRow - 1
    Loop
End Sub

Код конечно примитивный, но работает. И еще, индексы в Excel начинаются с 1, а в LibreOffice c 0.

Пытаюсь написать свой первый макрос, но при выполнении выдаёт ошибку:

Ошибка времени выполнения BASIC. Переменная типа Object не установлена.

Суть макроса: удаление всех строк таблицы за исключением тех, в которых присутствуют ячейки со строковым значением s1, s2 или s3.

sub RemoveRow
dim iLastRow as Long
dim i as Integer
dim s1, s2, s3 as String
s1 = "Вход"
s2 = "Выход"
s3 = "Отказ"
iLastRow = Cells(Rows.Count, 1).End(xlUp).Row 'ищет последнюю заполненную строку
For i = 4 To lLastRow
    If Cells(i,5).Value = Not s1 Or Cells(i,5).Value = Not s2 Or Cells(i,5).Value = Not s3 Then Rows(i).Delete
Next    
end sub

Kromster's user avatar

Kromster

13.2k12 золотых знаков41 серебряный знак70 бронзовых знаков

задан 22 июн 2016 в 13:16

wacrug's user avatar

Вы пишите макрос в LibreOffice используя синтаксис VBA Excel. Синтаксис немного разный.

Для Excel VBA:

Sub RemoveRow()
    Dim iLastRow As Long
    Dim s1, s2, s3 As String

    s1 = "Вход"
    s2 = "Выход"
    s3 = "Отказ"

    iLastRow = Cells(Rows.Count, 1).End(xlUp).Row

    Do While (iLastRow >= 4)
        If (Cells(iLastRow, 5) <> s1) And (Cells(iLastRow, 5) <> s2) And (Cells(iLastRow, 5) <> s3) Then
            Rows(iLastRow).Delete
        End If
        iLastRow = iLastRow - 1
    Loop
End Sub

Для LibreOffice Basic:

Sub RemoveRow
    Dim iLastRow As Long
    Dim s1, s2, s3 As String
    Dim s As String
    Dim oDoc As Object

    s1 = "Вход"
    s2 = "Выход"
    s3 = "Отказ"

    oDoc = ThisComponent

    Curs = oDoc.Sheets(0).createCursor
    Curs.gotoEndOfUsedArea(True)

    iLastRow = Curs.Rows.Count

    Do While (iLastRow >= 3)
        s = oDoc.Sheets(0).getCellByPosition(4, iLastRow).getString()
        If ((s <> s1) And (s <> s2) And (s <> s3)) Then
            oDoc.Sheets(0).Rows.removeByIndex(iLastRow, 1)
        End If
        iLastRow = iLastRow - 1
    Loop
End Sub

Код конечно примитивный, но работает. И еще, индексы в Excel начинаются с 1, а в LibreOffice c 0.

ответ дан 24 июн 2016 в 8:24

slippyk's user avatar

slippykslippyk

6,0363 золотых знака17 серебряных знаков37 бронзовых знаков

2

Со всеми сложностями прохода сверху вниз столкнулся, и пришел к такому коду:

Sub RemoveRow()
s1 = "Вход"
s2 = "Выход"
s3 = "Отказ"
i = 4
Do While Cells(i, "E").Value <> ""
        If Cells(i, "E").Value <> s1 And Cells(i, "E").Value <> s2 And Cells(i, "E").Value <> s3 Then
                Rows(i).Delete
                i = i - 1
        End If
        i = i + 1
Loop
End sub

Раз 5 проверял этот макрос на различных таблицах, результат полностью устраивал. Может быть тут есть какие-то подводные камни?
А с макросами в Libre я понял, что пока лучше не связываться, а изучить хотя бы VBA.

ответ дан 28 июн 2016 в 8:29

wacrug's user avatar

wacrugwacrug

646 бронзовых знаков

1

  • Печать

Страницы: [1]   Вниз

Тема: Правила BASIC не работают в макросах LibreOffice, или почему не едут лыжи?  (Прочитано 8919 раз)

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

Оффлайн
MAMOHT

Дорогому All-у доброго времени суток и года!
«Всё было хорошо пока не занялся программированием…»
                                        «МАМОНТ. Copyright 11:21 29.06.2012 г.»
Как древний виндузятник порочащий весь и вся Человечную ОС по воле судьбы был приговорён к освоению софта под Линукс. И вот, при попытке написания макросов под LibreOffice, столкнулся с такими вот траблами:

При создании книжного макроса:

Sub MyCursor
  Dim Doc As Object
  Dim Cursor As Object
  Dim sPath As String

  Doc = StarDesktop.CurrentComponent
  Cursor = Doc.Text.createTextCursor()

Вот здесь выскакивает окно сообщения с надписью: «Свойство или метод не найдены: Text»

…..........
…........
  sPath = CurDir$
  MsgBox sPath
А здесь в сообщении чётко указана моя домашняя директория, но НЕ ТА директория в которой СЕЙЧАС открыт документ.

…......
End Sub

Проблема:
Из чьей кожи надо сделать бубен и какие изучить PAS, чтобы при составлении макроса на BASIC в LibreOffice 3.5.4.2 ID сборки: 350m1(Build:2) системы Ubuntu 10.04.4 всё-таки РАБОТАЛО правило Cursor = Doc.Text.createTextCursor() и как мне получить ТУ ТЕКУЩУЮ директорию в которой сейчас открыт АКТИВНЫЙ документ?

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

« Последнее редактирование: 29 Июня 2012, 15:56:47 от Чистый »


Оффлайн
Señor_Gaga

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

Если мне изменяет память — бейсик идет только для msWord.
Для ОО и LO есть свой скриптовый язык.


Оффлайн
MAMOHT

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

Если мне изменяет память — бейсик идет только для msWord.
Для ОО и LO есть свой скриптовый язык.

Вторую часть КАК-БЫ проблемы КАК-БЫ решил. Правда использованием не кратчайшего пути: это КАК-БЫ проехать в Париж через Владивосток. Нашёл описание на 114 странице книги Эндрю Питоньяк (Andrew Pitonyak)OpenOffice.org pro. Автоматизация работы.

Теперь к Señor_Gaga. Здесь точно КТО-ТО ошибается!!!

Переписываю дословно окно сообщения:
«Ошибка времени выполнения BASIC.
Свойство или метод не найдены: TEXT»


Оффлайн
brij

Не могу сейчас точно ответить на Ваш вопрос, но просто вспомнил, что у Питоньяка есть много чего по макросам ЛО. Наверняка, Вам уже это известно, но все же на всякий пожарный  ;) Если дружите с английским, то здесь http://www.pitonyak.org/oo.php/ можно найти очень много полезного, особенно мне когда-то сильно помог его «Macro document» http://www.pitonyak.org/oo.php/AndrewMacro.pdf. Там кстати, есть и его еще незаконченный список параллелей с VBA. Может пригодится.


Оффлайн
Dixi257


  • Печать

Страницы: [1]   Вверх

Установка: LibreOffice 7.0.0.3, Win10 2004 19041.450

Когда я запускаю этот код, я получаю сообщение об ошибке «Не установлена ​​переменная объекта». В отладчике LibreOffice я правильно вижу двумерный массив со значениями. Я не могу получить доступ к отдельным значениям внутри массива. Что я делаю не так?

Function Test()
    Dim objPlay As Object
    Dim arrTable(1, 1) As String, strValue As String

    objPlay = ThisComponent.Sheets.getByName("Play")
    arrTable = objPlay.getCellRangeByPosition(0, 0, 1, 1).getDataArray()
    strValue = arrTable(0, 0)
End Function

1 ответ

Лучший ответ

Нет, в отладчике вы видите не двумерный массив, а массив массивов — массив, каждый из элементов которого представляет собой массив значений для одной строки диапазона.

В описании getDataArray метод, он называется sequence< sequence< any > >

Просто повторите синтаксис для доступа к желаемому элементу из окна отладчика: введите описание изображения здесь

Function Test
Dim objPlay As Object
Dim arrTable As Variant
Dim strValue As String
    objPlay = ThisComponent.getSheets().getByName("Play")
    arrTable = objPlay.getCellRangeByPosition(0, 0, 1, 1).getDataArray()
    strValue = arrTable(0)(0)
Rem And don't forget to return the function result
    Test = strValue
End Function


2

JohnSUN
6 Сен 2020 в 18:09

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Libreoffice не подчеркивает ошибки
  • Libreoffice код ошибки 177