|
Konstantin_F 0 / 0 / 0 Регистрация: 16.05.2015 Сообщений: 29 |
||||
|
1 |
||||
|
20.03.2018, 11:37. Показов 9363. Ответов 12 Метки basic, cells, openoffice (Все метки)
Здравствуйте! Написал простейший макрос в OpenOffice 4.1.5
Получил сообщение: При этом помечает эту строку: 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 |
|||
|
проверяйте
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 |
|
вы полностью скопировали код?
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 |
|
В файле пример.
0 |
|
Krasme 6507 / 4642 / 1928 Регистрация: 02.02.2014 Сообщений: 12,458 |
||||
|
21.03.2018, 12:17 |
10 |
|||
|
Решениеконкретно под ваше задание
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
13.2k12 золотых знаков41 серебряный знак70 бронзовых знаков
задан 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,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
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

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