Libreoffice ошибка времени выполнения 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.

  • Печать

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

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

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]   Вверх

Нужна помощь с диалогом

Автор andreya81, 11 сентября 2013, 08:25

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

Сделал таблицу к ней прикрепил диалог для ввода данных при ее работе выскакивает ошибка:Ошибка времени выполнения BASIC. Вызвано исключение  Type: com.sun.star.uno.RuntimeException Message: .
Помогите разобраться, что не так. Заранее благодарен за помощь :-
И еще как сделать чтобы первая пустая ячейка искалась на определенном листе, спрашиваю об этом потому, что создал такой же для другой таблицы, а он гад (другого слова не подберешь) ищет ячейку все равно в первой таблице и ставит данные в нее :-

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


Ну, с ошибкой разберешься и сам, это не сложно. Просто при открытом окне Бэйсика нажми кнопку «Компилировать» на панели инструментов и ошибка выскочит на строке «= n — 1», какой-то символ там неправильный, хоть и выглядит пристойно. Просто сотри хвост строки, начиная со знака равенства и перепиши его еще раз.

А с номером листа — ничего не поделаешь, гад он и есть гад. И все-равно он будет лезть на первый лист… Потому что именно так ты ему и сказал делать. Все эти твои многократно повторенные .Sheets(0). для него, гада тупого, и означают «первый лист». Если тебя такое поведение скрипта не устраивает — попробуй изменить именно эти куски… или продолжай ругаться…


А посмотрите такой пример. Назначил я ему имена листов но все равно на первый переходит :- Как ему указать чтобы он искал первую пустую ячейку именно на этом листе. Я думаю надо что-то дописать перед k=1? но не знаю что :-

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


Цитата: JohnSUN от 11 сентября 2013, 11:18Ну, с ошибкой разберешься и сам, это не сложно.

Не всё там так просто.
Замените

ThisComponent.Sheets(0).getCellRangeByName("A" & CStr(n)).Value = n - 1
на


n1=n-1
ThisComponent.Sheets(0).getCellRangeByName("A" & CStr(n)).Value = n1

Ошибка пропадет.
А теперь закройте файл с сохранением, опять откройте и нажмите на кнопку.
Что вышло?


Цитата: Hasim от 11 сентября 2013, 12:42

Цитата: JohnSUN от 11 сентября 2013, 11:18Ну, с ошибкой разберешься и сам, это не сложно.

Не всё там так просто.
Замените
ThisComponent.Sheets(0).getCellRangeByName("A" & CStr(n)).Value = n - 1
Спасибо за ответ но с этим я уже справился. Меня сейчас добивает почему он не заполняет лист Material
на
n1=n-1
ThisComponent.Sheets(0).getCellRangeByName("A" & CStr(n)).Value = n1

Ошибка пропадет.
А теперь закройте файл с сохранением, опять откройте и нажмите на кнопку.
Что вышло?

Спасибо за ответ, но с этим я уже справился меня сейчас волнует почему диалог NewMaterial заполняет таблицу MKR, а не Material


Я про другую ошибку, которая выплывает на вашем файле (уже как бы исправленном).

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


Вы правы ошибка выскакивает но после выполнения в окне Бэйсик исчезает. Черт знает что ей надо.


Что означает эта ошибка:Ошибка времени выполнения BASIC.
Вызвано исключение
Type: com.sun.star.uno.RuntimeException
Message: .

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


Нужно читать то, что после


Message:
!!!!!
!!!!!

Та ошибка, что у меня на картинке, это
…LibraryNotLoaded…
т.е.
…БиблиотекаНеЗагружена…


У меня после Message ничего не видно. Ну ладно. И все-таки подскажите новичку в программировании StarBasic как это исправить :-


Может, как-то так?

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


Спасибо огромное. Очередной раз Вы меня выручаете. Премного Вам благодарен. :)


Цитата: JohnSUN от 11 сентября 2013, 15:42Может, как-то так?

JohnSUN, ну ты то пишешь объяснения на целую страницу, а то вообще ничего не объясняешь.
А там, кстати, есть загадка для новичков: зачем нужно специально загружать библиотеку, и можно ли обойтись без ее загрузки?


Ты понимаешь, просто уже надоело повторяться: об этой Tools и её загрузке и Питоньяк писал, и я почти перед каждым .LoadLibrary комментарий пишу…
Например, помнишь

loadSomeLibs

?
Спросят напрямую — отвечу.  А так, когда просто к слову пришлось, не хочется отвлекаться на дополнительные описания.

У тебя свободных пару дней не найдется? Просто пробежаться по всей библиотеке и набросать краткое описание самых ходовых функций-процедур из неё. Ну, имя-параметры-что делает… И в отдельной теме [MEMO] эту таблицу пристроить. Будут новички интересоваться — будем ссылку на эту тему давать…

PS. И когда они уже тип GetLastUsedRow изменят?!!


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

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

  • Calc

  • Нужна помощь с диалогом

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

Ошибка времени выполнения 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.5k12 золотых знаков43 серебряных знака72 бронзовых знака

задан 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,0913 золотых знака19 серебряных знаков38 бронзовых знаков

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

Konstantin_F

0 / 0 / 0

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

Сообщений: 29

1

20.03.2018, 11:37. Показов 10170. Ответов 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



6647 / 4746 / 1980

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

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

20.03.2018, 11:57

2

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



1



0 / 0 / 0

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

Сообщений: 29

20.03.2018, 13:45

 [ТС]

3

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



0



Krasme

6647 / 4746 / 1980

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

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

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



6647 / 4746 / 1980

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

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

20.03.2018, 16:32

6

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



1



0 / 0 / 0

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

Сообщений: 29

21.03.2018, 11:03

 [ТС]

7

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

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

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

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



0



6647 / 4746 / 1980

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

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

21.03.2018, 11:12

8

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

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



1



0 / 0 / 0

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

Сообщений: 29

21.03.2018, 12:07

 [ТС]

9

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



0



Krasme

6647 / 4746 / 1980

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

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

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



6647 / 4746 / 1980

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

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

21.03.2018, 13:01

12



1



0 / 0 / 0

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

Сообщений: 29

21.03.2018, 17:34

 [ТС]

13

Спасибо!

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



0



Понравилась статья? Поделить с друзьями:
  • Libreoffice ошибка soffice bin
  • Libreoffice ошибка 512
  • Libreoffice ошибка 509 как исправить
  • Libreoffice ошибка 502 впр
  • Libreoffice ошибка 1714