Здравствуйте
У меня в макросе для ООО все прекрасно работало
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ех значений Дата, месяц и год. Верно?
Konstantin_F 0 / 0 / 0 Регистрация: 16.05.2015 Сообщений: 29 |
||||
1 |
||||
20.03.2018, 11:37. Показов 10490. Ответов 12 Метки basic, cells, openoffice (Все метки)
Здравствуйте! Написал простейший макрос в OpenOffice 4.1.5
Получил сообщение: При этом помечает эту строку: Cells(s. 1) = Cells(i. 1) Что я не сделал?
0 |
6688 / 4779 / 1999 Регистрация: 02.02.2014 Сообщений: 12,800 |
|
20.03.2018, 11:57 |
2 |
индексы ячеек разделяются запятыми
1 |
0 / 0 / 0 Регистрация: 16.05.2015 Сообщений: 29 |
|
20.03.2018, 13:45 [ТС] |
3 |
Исправил запятые
0 |
Krasme 6688 / 4779 / 1999 Регистрация: 02.02.2014 Сообщений: 12,800 |
||||
20.03.2018, 14:47 |
4 |
|||
проверяйте
1 |
0 / 0 / 0 Регистрация: 16.05.2015 Сообщений: 29 |
|
20.03.2018, 16:23 [ТС] |
5 |
Пишет: Пишет синтаксическая ошибка Basic. Ожидается Sub
0 |
6688 / 4779 / 1999 Регистрация: 02.02.2014 Сообщений: 12,800 |
|
20.03.2018, 16:32 |
6 |
вы полностью скопировали код?
1 |
0 / 0 / 0 Регистрация: 16.05.2015 Сообщений: 29 |
|
21.03.2018, 11:03 [ТС] |
7 |
Да. Я исправил. Всё работает. Получается столбец нулей и в следующем столбце значения первого столбца с пустыми ячейками. Нужно брать в первом столбце первое значение и ставить ему в соответствие все значения из второго столбца. Что надо подправить в формуле?
0 |
6688 / 4779 / 1999 Регистрация: 02.02.2014 Сообщений: 12,800 |
|
21.03.2018, 11:12 |
8 |
будет лучше, если все-таки приложите файл с введенными значениями и образцом того, что вы хотите получить вышеприведенный код — лишь образец того, как работать с ячейками в libreoffice. исходных данных-то у меня нет.
1 |
0 / 0 / 0 Регистрация: 16.05.2015 Сообщений: 29 |
|
21.03.2018, 12:07 [ТС] |
9 |
В файле пример.
0 |
Krasme 6688 / 4779 / 1999 Регистрация: 02.02.2014 Сообщений: 12,800 |
||||
21.03.2018, 12:17 |
10 |
|||
Сообщение было отмечено Konstantin_F как решение Решениеконкретно под ваше задание
1 |
0 / 0 / 0 Регистрация: 16.05.2015 Сообщений: 29 |
|
21.03.2018, 12:50 [ТС] |
11 |
Спасибо! Всё отлично! Подскажите где или что можно почитать, чтобы лучше разбираться в BASIC ?
0 |
6688 / 4779 / 1999 Регистрация: 02.02.2014 Сообщений: 12,800 |
|
21.03.2018, 13:01 |
12 |
1 |
0 / 0 / 0 Регистрация: 16.05.2015 Сообщений: 29 |
|
21.03.2018, 17:34 [ТС] |
13 |
Спасибо! Вы мне помогли!
0 |
In VB object variables require the Set
keyword to be assigned. Object properties that are objects also need to be Set
. Runtime error 91 «object variable not set» is raised when the assignment doesn’t use that keyword.
This is inherited from legacy Let
keyword to assign values, and Set
keyword to assign references; the Let
eventually was deprecated (although still needed for defining properties) and the Set
remained, leaving the VB6/VBA value assignment syntax like [Let] variable = value
, where «Let» is optional.
In the declaration and assignment:
Dim SourceWindow As Window, QACheckWindow As Window
'this is like saying "Let SourceWindow = ActiveWindow":
SourceWindow = ActiveWindow
SourceWindow
is an object, assigned as if it were a value — this causes VBA to attempt let-coercion through a default member call. If the object wasn’t initialized, the member call fails with error 91. If the object was initialized but doesn’t have a default member, error 438 is raised.
So in this case error 91 is being raised because of an implicit member call; the .net equivalent would be a NullReferenceException
:
Dim SourceWindow As Window, Dim WindowTitle As String
'"SourceWindow" reference isn't set, the object can't be accessed yet:
WindowTitle = SourceWindow.Caption
I’m going to go a bit overboard here, but the legacy Let
statement should not be confused with the Let
clause (in VB.net) which, in the LINQ query syntax (in VB.net), computes a value and assigns it to a new, query-scoped variable (example taken from MSDN):
From p In products
Let Discount = p.UnitPrice*0.1 '"Discount" is only available within the query!
Where Discount >= 50
Select p.ProductName, p.UnitPrice, Discount
VB.net assigns both values and references, without the need to specify a Let
or a Set
, because in .net this distinction is a much thinner line, given how everything ultimately derives from System.Object
… including System.ValueType
. That’s why the Set
keyword was also deprecated in VB.net, and also why the VB.net syntax for defining properties has dropped the Let
in favor of Set
— because parameterless default members are illegal in VB.NET, so this ambiguous let-coercion doesn’t happen.
Установка текущей даты в поле диалога не работает
Автор 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 -
►
Установка текущей даты в поле диалога не работает
Пытаюсь написать свой первый макрос, но при выполнении выдаёт ошибку:
Ошибка времени выполнения 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.6k12 золотых знаков43 серебряных знака73 бронзовых знака
задан 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,1013 золотых знака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