Вы пишите макрос в 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
13.5k12 золотых знаков43 серебряных знака72 бронзовых знака
задан 22 июн 2016 в 13:16
Вы пишите макрос в 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
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
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
Получил сообщение: При этом помечает эту строку: 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 |
|||
проверяйте
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 |
вы полностью скопировали код?
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 |
В файле пример.
0 |
Krasme 6647 / 4746 / 1980 Регистрация: 02.02.2014 Сообщений: 12,715 |
||||
21.03.2018, 12:17 |
10 |
|||
Сообщение было отмечено Konstantin_F как решение Решениеконкретно под ваше задание
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 |