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

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

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

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

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



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

проверяйте
у меня 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



6688 / 4779 / 1999

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

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

20.03.2018, 16:32

6

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



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

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



0



Krasme

6688 / 4779 / 1999

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

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

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



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's user avatar

Kromster

13.6k12 золотых знаков43 серебряных знака73 бронзовых знака

задан 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,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

wacrug's user avatar

wacrugwacrug

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

1

Понравилась статья? Поделить с друзьями:
  • Ошибка времени выполнения basic аргумент является обязательным
  • Ошибка времени выполнения basic openoffice
  • Ошибка входа неверная сессия
  • Ошибка входа на сервер imap yandex com thunderbird
  • Ошибка входа мос ру