Синтаксическая ошибка basic ожидается

Перейти к контенту

vladimirr_B

0 / 0 / 0

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

Сообщений: 3

1

OpenOffice/LibreOffice

20.01.2021, 08:10. Показов 1164. Ответов 5

Метки нет (Все метки)


Добрый день! Возникла необходимость разработки макроса по LibbreOffice.
При попытке описания пользовательского типа при запуске возникает ошибка «Синтаксическая ошибка BASIC. Ожидается символ.»

Код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Type tPerson
  Name As String
  Age As Integer
  Weight As Double
End Type
 
Sub Main
dim asd as string
dim a As tPerson
asd = "adasdad"
a= len (asd)
End Sub

Порывшись в интернете нигде не нашел что пользовательские типы не поддерживаются. В чем может быть проблема?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

badakhshan

Заблокирован

20.01.2021, 09:44

2

vladimirr_B, дело в том, что переменной a (As tPerson) нельзя присвоить число, имхо…

Попробуйте так:

Visual Basic
1
a.Weight = Len(asd)

0

vladimirr_B

0 / 0 / 0

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

Сообщений: 3

26.01.2021, 07:28

 [ТС]

3

Откорректировал. Но та же ошибка.

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
Type tPerson
  Name As String
  Age As Integer
  Weight As Double
End Type
 
Sub Main
dim asd as string
dim a As tPerson
asd = "adasdad"
a.Weight = len (asd)
End Sub

0

Alex77755

11464 / 3757 / 675

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

Сообщений: 11,097

26.01.2021, 09:46

4

Скорей всего зарезервированное имя name

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Type tPerson
  aName As String
  Age As Integer
  Weight As Double
End Type
 
Sub Main
dim asd as string
dim a As  tPerson
asd = "adasdad"
a.aName=asd
a.Age= len(asd)
a.weight=len(asd)/2
msgbox a.aname & chr(10) & a.age & chr(13) & a.weight
 
End Sub

Миниатюры

Проблема с пользовательским типом VBA
 

0

11464 / 3757 / 675

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

Сообщений: 11,097

26.01.2021, 09:50

5

И бейсик показывает разной подсветкой

0

11464 / 3757 / 675

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

Сообщений: 11,097

26.01.2021, 09:52

6

вот

Изображения

 

0

IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

26.01.2021, 09:52

Помогаю со студенческими работами здесь

Чтение запись текстовых файлов с пользовательским типом данных
помогите пожалуйста записать и считать пользовательский тип данных. Вот мои наброски, он вроде…

Написать программу, работающую с пользовательским типом, состоящим из 6 полей
Написать программу, работающую с пользовательским типом, состоящим из 6 полей:
— имя (15 символов)…

Работа с файлами прямого доступа с определенным пользовательским типом данных
Доброго времени суток. Недавно начал изучать C# до этого изучал Delphi. В Delphi при работе с…

Как вывести данные на консоль из вектора, параметризованного пользовательским типом, с помощью std::cout?
Добрый день, друзья!
Имеется структура
struct OMNOMNOM
{
Vector X;
double F;
}
которая…

Проблема с типом string
Выдаёт ошибку, как исправить

Проблема с типом string
Здравствуйте, мне нужно посимвольно пройтись по string commandCdWay, и пока цикл не дойдет до…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

6

Автор ForumOOo (бот), 25 июня 2019, 18:37

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

Компонент: Writer
Версия продукта: 4.x
Сборка: Apache OpenOffice 4.1.3
ОС: windows 7

В ООoFBTools при экспорте Word в формат FB2 происходит синтаксическая ошибка Basic. Ожидается символ. Как  это исправить

Тестовый файл: http://forumooo.ru/attachments/upload/oshibka.jpg (273.93 КБ)


Подпись: Татьяна
Эл. почта: dollar6392@yandex.ru


Возможно, хотя и маловероятно, что это зависит от того, откуда Вы устанавливали расширение (на официальном сайте доступна версия 2.55, тогда как на сайте расширения AOO — только 2.40, и можно себе представить, что это ошибка какой-то из версий) — но больше похоже на повреждённый макрос: на скриншоте видно, что в строке 35 вместо

Sub SaveDocIsModified( oDoc As Object )
(как, например, в версии 2.55, которую я только что поставил для проверки), у Вас нечто некорректное:

Sub  As Object )
как будто SaveDocIsModified( oDoc случайно удалили, что, естественно, приводит к ошибке (и я на самом деле не верю, что такая ошибка могла незамеченной попасть в релиз — скорее, это Вы сами случайно что-то такое сделали)…

В общем, я советую удалить и установить расширение заново.


Я переустановила ООoFBTools по вашей ссылке и теперь выдает другую ошибку. С чем это может быть связано?


Цитата: Татьяна1 от 26 июня 2019, 15:16…теперь выдает другую ошибку. С чем это может быть связано?

Не находит указанный макрос, в прошлый раз пропал кусок от макроса, а сейчас наверно пропал весь макрос.

Я проверил две версии 2.55 и 2.40, обе работают. Вы должны написать подробней откуда и какую версию ставите, каким образом (ваши действия), какая у вас ось. Как запускаете расширение, было бы хорошо, если бы вы выложили небольшой тестовый документ, который у вас не работает с подробным описанием ваших действий приводящих к сбою.


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

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

  • Writer

  • В ООoFBTools при экспорте Word в формат FB2 происходит синтакс…

Howdy, I’m not having much luck in attempting to get this a Sub Module in an embedded macro to work in this document. This document (attached) was given to me by a professor for an Options & Futures MBA class, to try to visualize option pricing, look at the ‘Greeks’, etc.. I realize this was intended to be run on a Windows machine, but the code doesn’t look too far off from VBA to try to get it working in OO. I’m currently running version 3.1, on Mac 0S 10.5.8.

The first problem, is that I opened the document as .xls, and resaved as .ods. since I hear that might help resolve the #NAME? errors that appear in the document. When I go to Tools->Macros->Organize Macros->OO Basic, and then click the Module 2 macro under OptionTradingWoorkbook2->Standard->Module2 (Edit) I get the following error when I go to try to compile the code:

BASIC Syntax Error
Expected: Sub

I attempted to verify the VBA code as OO Basic first by using an on-line converter, and there was no difference (verified by the unix diff command). I’ve never used VBA or macros in Excel, so I’m not sure what the problem here is..

Any pointers, suggestions, etc., on how to make this work would be very helpful, I have a quiz due Tuesday that depends on getting this working. If I can’t get it to work here, the next option will be to try to get Parallels working on my mac, but I’d like to see if it’s possible to get this working on OO first.

  • Печать

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

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

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

Поговорим о новичке! Я не могу скомпилировать свою первую строку. Основная синтаксическая ошибка: ожидается символ

REM  *****  BASIC  *****
Type xyz
    Dim sheet as object
    Dim cell as object
    dim range as object
End Type


Sub Main

End Sub

Версия: 6.0.2.1 (x64) Идентификатор сборки: f7f06a8f319e4b62f9bc5095aa112a65d2f3ac89

Инструменты-> макросы-> редактировать макросы>

Компиляции

1 ответ

Лучший ответ

Dim объявляет локальные переменные внутри подпрограмм. В операторах типа он не используется.

Причина, по которой эту ошибку было сложно диагностировать, заключается в том, что похоже, что проблема в Type xyz, но с этой частью все в порядке. IDE выделяет все, что находится перед первым оператором Dim, что может быть незначительной проблемой синтаксического анализатора. Следующий код показывает, что даже комментарий может быть выделен!

Type xyz
    'This comment will be highlighted because of the Dim error.
    Dim sheet as object
End Type

Эта неточность обычна для любого компилятора. Сообщения об ошибках часто указывают на проблемы, а не говорят точно, в чем и где проблема.


0

Jim K
26 Май 2020 в 20:54

vladimirr_B

0 / 0 / 0

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

Сообщений: 3

1

OpenOffice/LibreOffice

20.01.2021, 08:10. Показов 1496. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день! Возникла необходимость разработки макроса по LibbreOffice.
При попытке описания пользовательского типа при запуске возникает ошибка «Синтаксическая ошибка BASIC. Ожидается символ.»

Код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Type tPerson
  Name As String
  Age As Integer
  Weight As Double
End Type
 
Sub Main
dim asd as string
dim a As tPerson
asd = "adasdad"
a= len (asd)
End Sub

Порывшись в интернете нигде не нашел что пользовательские типы не поддерживаются. В чем может быть проблема?

0

badakhshan

Заблокирован

20.01.2021, 09:44

2

vladimirr_B, дело в том, что переменной a (As tPerson) нельзя присвоить число, имхо…

Попробуйте так:

Visual Basic
1
a.Weight = Len(asd)

0

vladimirr_B

0 / 0 / 0

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

Сообщений: 3

26.01.2021, 07:28

 [ТС]

3

Откорректировал. Но та же ошибка.

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
Type tPerson
  Name As String
  Age As Integer
  Weight As Double
End Type
 
Sub Main
dim asd as string
dim a As tPerson
asd = "adasdad"
a.Weight = len (asd)
End Sub

0

Alex77755

11480 / 3771 / 677

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

Сообщений: 11,142

26.01.2021, 09:46

4

Скорей всего зарезервированное имя name

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Type tPerson
  aName As String
  Age As Integer
  Weight As Double
End Type
 
Sub Main
dim asd as string
dim a As  tPerson
asd = "adasdad"
a.aName=asd
a.Age= len(asd)
a.weight=len(asd)/2
msgbox a.aname & chr(10) & a.age & chr(13) & a.weight
 
End Sub

Миниатюры

Проблема с пользовательским типом VBA
 

0

11480 / 3771 / 677

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

Сообщений: 11,142

26.01.2021, 09:50

5

И бейсик показывает разной подсветкой

0

11480 / 3771 / 677

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

Сообщений: 11,142

26.01.2021, 09:52

6

вот

Изображения

 

0

IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

26.01.2021, 09:52

Помогаю со студенческими работами здесь

Чтение запись текстовых файлов с пользовательским типом данных
помогите пожалуйста записать и считать пользовательский тип данных. Вот мои наброски, он вроде…

Написать программу, работающую с пользовательским типом, состоящим из 6 полей
Написать программу, работающую с пользовательским типом, состоящим из 6 полей:
— имя (15 символов)…

Работа с файлами прямого доступа с определенным пользовательским типом данных
Доброго времени суток. Недавно начал изучать C# до этого изучал Delphi. В Delphi при работе с…

Как вывести данные на консоль из вектора, параметризованного пользовательским типом, с помощью std::cout?
Добрый день, друзья!
Имеется структура
struct OMNOMNOM
{
Vector X;
double F;
}
которая…

Проблема с типом string
Выдаёт ошибку, как исправить

Проблема с типом string
Здравствуйте, мне нужно посимвольно пройтись по string commandCdWay, и пока цикл не дойдет до…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

6

Я пишу макрос для LibreOffice Calc в Basic в режиме совместимости с VBA. Жалуется, когда я использую эту строку:

Const BASE = 3

ОСНОВНАЯ синтаксическая ошибка.
Символ ожидается.

и раскраска синтаксиса, кажется, указывает, что «BASE» является ключевым словом или зарезервированным словом. Другие const в макросе принимаются без проблем. Также эта строка принята в VBA в Excel.

Я изменю имя, чтобы избежать этой проблемы, однако я не могу найти какую-либо документацию, которая ссылается на это как на любое зарезервированное слово. Я предполагаю, что это связано либо с базами чисел, либо с именем базы данных LO. Однако такие слова, как «WRITER» и «CALC», не действуют одинаково — они, кажется, принимаются как имена для констант. Обратите внимание, что мое использование этого слова в любом случае не связано с базой данных.

Кроме того, к сожалению, в LO Basic, похоже, нет немедленного режима (REPL), поэтому я не могу легко поиграть с этим словом, чтобы определить, для чего оно используется.

Можете ли вы указать мне на некоторые документы по ключевому слову BASE?

Любимая мозоль

Автор Серж, 5 июня 2013, 09:55

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

Друзья! Кто-нибудь встречался с ошибкой «Синтаксическая ошибка BASIC. Неожиданный символ: CRLF»?

Раньше мне приходилось часто ее видеть. Возникает после копирования кода из pdf или doc. Устраняется перенабором части кода и то не всегда.
Как я понимаю, связана с присутствием в коде какого-то непечатного символа.

Недавно опять встретил. Может кто сможет объяснить суть оного в более аргументированном виде.


Это одна строка разбита на две строки


+1
Это случается, когда длинные строки кода в угоду форматированию переносится со строки на строку. В редактор они так и вставляются — разными строками.
Нужно или символ подчеркивания добавить в конце первой строки, в качестве указания, что оператор еще не закончился, или просто разрыв строк удалить.
Кстати, это не единственная ошибка в этой серии. Если разрыв прошел по параметрам метода, можно нарваться и на сообщение вида «Синтаксическая ошибка BASIC. Неожиданный символ: ,.»


Да, действительно, возникает именно в местах, где текстовый редактор разделил одну строчку кода на две строки текста. Спасибо.


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

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

  • Basic

  • Любимая мозоль

Поговорим о новичке! Я не могу скомпилировать свою первую строку. Основная синтаксическая ошибка: ожидается символ

REM  *****  BASIC  *****
Type xyz
    Dim sheet as object
    Dim cell as object
    dim range as object
End Type


Sub Main

End Sub

Версия: 6.0.2.1 (x64) Идентификатор сборки: f7f06a8f319e4b62f9bc5095aa112a65d2f3ac89

Инструменты-> макросы-> редактировать макросы>

Компиляции

1 ответ

Лучший ответ

Dim объявляет локальные переменные внутри подпрограмм. В операторах типа он не используется.

Причина, по которой эту ошибку было сложно диагностировать, заключается в том, что похоже, что проблема в Type xyz, но с этой частью все в порядке. IDE выделяет все, что находится перед первым оператором Dim, что может быть незначительной проблемой синтаксического анализатора. Следующий код показывает, что даже комментарий может быть выделен!

Type xyz
    'This comment will be highlighted because of the Dim error.
    Dim sheet as object
End Type

Эта неточность обычна для любого компилятора. Сообщения об ошибках часто указывают на проблемы, а не говорят точно, в чем и где проблема.


0

Jim K
26 Май 2020 в 20:54

Howdy, I’m not having much luck in attempting to get this a Sub Module in an embedded macro to work in this document. This document (attached) was given to me by a professor for an Options & Futures MBA class, to try to visualize option pricing, look at the ‘Greeks’, etc.. I realize this was intended to be run on a Windows machine, but the code doesn’t look too far off from VBA to try to get it working in OO. I’m currently running version 3.1, on Mac 0S 10.5.8.

The first problem, is that I opened the document as .xls, and resaved as .ods. since I hear that might help resolve the #NAME? errors that appear in the document. When I go to Tools->Macros->Organize Macros->OO Basic, and then click the Module 2 macro under OptionTradingWoorkbook2->Standard->Module2 (Edit) I get the following error when I go to try to compile the code:

BASIC Syntax Error
Expected: Sub

I attempted to verify the VBA code as OO Basic first by using an on-line converter, and there was no difference (verified by the unix diff command). I’ve never used VBA or macros in Excel, so I’m not sure what the problem here is..

Any pointers, suggestions, etc., on how to make this work would be very helpful, I have a quiz due Tuesday that depends on getting this working. If I can’t get it to work here, the next option will be to try to get Parallels working on my mac, but I’d like to see if it’s possible to get this working on OO first.

vladimirr_B

0 / 0 / 0

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

Сообщений: 3

1

OpenOffice/LibreOffice

20.01.2021, 08:10. Показов 1879. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день! Возникла необходимость разработки макроса по LibbreOffice.
При попытке описания пользовательского типа при запуске возникает ошибка «Синтаксическая ошибка BASIC. Ожидается символ.»

Код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Type tPerson
  Name As String
  Age As Integer
  Weight As Double
End Type
 
Sub Main
dim asd as string
dim a As tPerson
asd = "adasdad"
a= len (asd)
End Sub

Порывшись в интернете нигде не нашел что пользовательские типы не поддерживаются. В чем может быть проблема?



0



badakhshan

Заблокирован

20.01.2021, 09:44

2

vladimirr_B, дело в том, что переменной a (As tPerson) нельзя присвоить число, имхо…

Попробуйте так:

Visual Basic
1
a.Weight = Len(asd)



0



vladimirr_B

0 / 0 / 0

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

Сообщений: 3

26.01.2021, 07:28

 [ТС]

3

Откорректировал. Но та же ошибка.

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
Type tPerson
  Name As String
  Age As Integer
  Weight As Double
End Type
 
Sub Main
dim asd as string
dim a As tPerson
asd = "adasdad"
a.Weight = len (asd)
End Sub



0



Alex77755

11489 / 3776 / 678

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

Сообщений: 11,163

26.01.2021, 09:46

4

Скорей всего зарезервированное имя name

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Type tPerson
  aName As String
  Age As Integer
  Weight As Double
End Type
 
Sub Main
dim asd as string
dim a As  tPerson
asd = "adasdad"
a.aName=asd
a.Age= len(asd)
a.weight=len(asd)/2
msgbox a.aname & chr(10) & a.age & chr(13) & a.weight
 
End Sub

Миниатюры

Проблема с пользовательским типом VBA
 



0



11489 / 3776 / 678

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

Сообщений: 11,163

26.01.2021, 09:50

5

И бейсик показывает разной подсветкой



0



11489 / 3776 / 678

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

Сообщений: 11,163

26.01.2021, 09:52

6

вот

Изображения

 



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

26.01.2021, 09:52

Помогаю со студенческими работами здесь

Чтение запись текстовых файлов с пользовательским типом данных
помогите пожалуйста записать и считать пользовательский тип данных. Вот мои наброски, он вроде…

Написать программу, работающую с пользовательским типом, состоящим из 6 полей
Написать программу, работающую с пользовательским типом, состоящим из 6 полей:
— имя (15 символов)…

Работа с файлами прямого доступа с определенным пользовательским типом данных
Доброго времени суток. Недавно начал изучать C# до этого изучал Delphi. В Delphi при работе с…

Как вывести данные на консоль из вектора, параметризованного пользовательским типом, с помощью std::cout?
Добрый день, друзья!
Имеется структура
struct OMNOMNOM
{
Vector X;
double F;
}
которая…

Проблема с типом string
Выдаёт ошибку, как исправить

Проблема с типом string
Здравствуйте, мне нужно посимвольно пройтись по string commandCdWay, и пока цикл не дойдет до…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

6

Я уже очень давно обещал начать писать о скриптовом языке программирования Basic в LibreOffice и создании при помощи этого языка макросов. Эта статья посвящена типам данных используемых в Basic и, в большей мере, правилам описания и возможности использования переменных. Как всегда я постараюсь выложить максимум информации, и по этому надеюсь что эта простая тема будет полезна не только начинающим пользователям. Отдельно хотелось бы поблагодарить всех, кто прокомментировал статью, дал свои рекомендации, и помог разобраться со сложными моментами.

Соглашения об именовании переменных

Имена переменных не могут включать более 255 символов. Любое имя переменной должно начинаться с заглавной или строчной буквы латинского алфавита или знака подчеркивания («_»). В именах переменных разрешается использовать цифры и знак подчеркивания. Некоторые другие знаки препинания и буквы не латинского алфавита приведут к появлению сообщения «Синтаксическая ошибка» или «Ошибка выполнения BASIC», если их не заключить в квадратные скобки.

Примеры правильного наименования переменных.

MyNumber=5
MyNumber5=15
MyNumber_5=20
[My Number]=20.5
[5MyNumber]=12
[Number,Mine]=12
[DéjàVu]="кажется я это видел!"
[Моя переменная]="первый пошёл!"
[Мой % от сделки]=0.0001

Обратите внимание на квадратные скобки. Если их убрать, то макрос начнет выдавать ошибку. Как вы можете догадаться, этот способ позволяет нам задавать переменные с кириллическими именами. Но для того, чтобы писать также как в 1С только русскими командами, вам придется сделать довольно толстый слой абстракции. Помните, что все служебные слова, встроенные объекты, их методы и свойства в языке LibreOffice Basic в настоящее время пишутся латинским алфавитом. Удобно ли пользоваться квадратными скобками, решать вам. Возможность задавать экзотические
имена переменным существует, но на практике в нашем сообществе этот функционал используется исключительно редко.

Объявление переменных

Строго говоря в Basic объявлять переменные не обязательно, за исключением массивов. Если вы пишите макрос из пары строчек, и этот макрос будет работать с небольшими документами, то объявлением переменных можно пренебречь. В этом случае переменная будет автоматически объявляться как тип Variant. Во всех случаях когда макрос больше пары строчек или документ большой, настоятельно рекомендуется объявлять переменные. Во-первых, это увеличивает читаемость текста. Во-вторых, это позволяет контролировать переменные, что может значительно облегчить поиск ошибок. В-третьих, тип данных Variant очень ресурсозатратный, и необходимо значительное время для скрытого преобразования. Кроме того, Variant выбирает не оптимальный тип переменной для данных, что также увеличивает загруженность ресурсов компьютера.

Basic предоставляет возможность автоматического присвоения типа переменной по её префиксу (первой буквы в имени) для упрощения работы, если вы предпочитаете использовать венгерскую нотацию. Для этого используется ключевое слово DefXXX и после него буква, с которой начинаются переменные этого типа. XXX в данном случае буквенное обозначение типа. Ключевое слово с буквой будет работать в пределах модуля, и должно указываться до появления подпрограмм и функций. Всего существует 11 таких типов.

DefBool — для логический переменных;
DefInt — для целочисленных переменных типа Integer;
DefLng — для целочисленных переменных типа Long;
DefSng — для переменных с плавающей точкой одинарной точности типа Single;
DefDbl — для переменных с плавающей точкой двойной точности типа Double;
DefCur — для переменных с фиксированной точкой типа Currency;
DefStr — для строковых переменных;
DefDate — для переменных даты и времени;
DefVar — для переменных типа Variant;
DefObj — для объектных переменных;
DefErr — для объектных переменных содержащих информацию об ошибках.

Если вы уже имеете представление о типах переменных в LibreOffice Basic, то наверное заметили, что в этом списке нет типа Byte, но есть для странного зверя с типом Error. К сожалению, это нужно просто запомнить. Вменяемого ответа на этот вопрос я пока не нашёл. Этот способ удобен, так как тип присваивается переменным автоматически. Но он не позволяет находить ошибки, связанные с опечатками в переменных. Кроме того, не удастся задать буквы не латинского алфавита, то есть, все имена переменных в квадратных скобках, которые необходимо объявлять, нужно объявлять явно.

Для избежания случайных опечаток при использовании объявленных явно переменных можно воспользоваться инструкцией OPTION EXPLICIT. Эта инструкция должна быть первой строкой кода в модуле. Все остальные команды, кроме комментариев, должны располагаться после неё. Эта инструкция указывает интерпретатору, что все переменные должны быть объявлены явно, иначе он выдает ошибку. Естественно, эта инструкция делает бессмысленным использование инструкции Def в коде.

Объявить переменную можно с помощью оператора Dim. Можно объявлять несколько переменных одновременно даже разного типа, если разделять их имена запятыми. Для определения типа переменной при явном объявлении можно использовать либо соответствующее ключевое слово, либо знак типа после имени. Если после переменной не используется ключевое слово или знак типа переменной, то ей автоматически присваивается тип Variant. Например:

Dim iMyVar 'объявлена переменная типа Variant'
Dim iMyVar1 As Integer, iMyVar2 As Integer 'в обоих случаях тип целое'
Dim iMyVar3, iMyVar4 As Integer 'в этом случае первая переменная'
                                'Variant, а вторая целое'

Типы переменных

В LibreOffice Basic предусмотрена поддержка семи классов переменных.

  • Логические переменные содержат одно из значений: TRUE или FALSE.
  • Числовые переменные содержат числовые значения. Они могут быть целочисленные, целочисленные положительные, с плавающей точкой и с фиксированной точкой.
  • Строковые переменные содержат строки символов.
  • Переменные даты могут содержать дату и/или время во внутреннем формате.
  • Объектные переменные могут содержать объекты различных типов.
  • Специальные типы, такие как структуры, массивы.
  • Абстрактный тип Variant.

Логические переменные — тип Boolean

Переменные типа Boolean могут содержать только одно из двух значений: TRUE или FALSE. При этом нужно понимать, что в числовом эквиваленте значению FALSE соответствует число 0, а значению TRUE соответствует -1 (минус единица). Но любое значение отличное от нуля переданное в переменную типа Boolean будет конвертировано в TRUE, то есть преобразовано в минус единицу. Явно объявить переменную можно следующим способом.

Dim MyBoolVar As Boolean

Специального символа для неё я не нашёл. Для неявного объявления можно воспользоваться инструкцией DefBool. Например:

DefBool b 'переменные начинающиеся с b по умолчанию имеют тип Boolean

Начальное значение переменной устанавливается в FALSE. Для переменной типа Boolean требуется один байт памяти.

Целочисленные переменные

К целочисленным переменным относится 3 типа Byte, Integer и Long Integer. Эти переменные могут содержать только целые числа. При передаче чисел с дробной частью в такие переменные, происходит округление по правилам классической арифметики (а не в большую сторону, как написано в справке). Начальным значением для этих переменных является 0 (ноль).

Типа Byte

Переменные типа Byte могут содержать только целочисленные положительные значения в диапазоне от 0 до 255. Не путайте этот тип с физическим размером информации в байт. Слово Byte лишь указывает на размерность числа. Объявить переменную этого типа можно следующим образом:

Dim MyByteVar As Byte

Специального символа для объявления этого типа нет. Инструкции Def для этого типа тоже нет. Из-за маленькой размерности этот тип будет удобнее всего в счетчиках, значения которых не выходят за диапазон. Для переменной типа Byte требуется один байт памяти.

Тип Integer

Переменные типа Integer могут содержать целочисленные значение от -32768 до 32767. Они удобны для быстрых вычислений в целых числах и пригодны в счетчиках циклов. «%» — специальный символ объявления типа. Объявить переменную этого типа можно следующими способами:

Dim MyIntegerVar% 
Dim MyIntegerVar As Integer

Для неявного объявления можно воспользоваться инструкцией DefInt. Например:

DefInt i 'переменные начинающиеся с i по умолчанию имеют тип Integer

Для переменной типа Integer требуется два байта памяти.

Тип Long Integer

Переменные типа Long Integer могут содержать целочисленные значения от -2147483648 до 2147483647. Переменные типа Long Integer удобны в целочисленных вычислениях, когда диапазона типа Integer недостаточен для реализации алгоритма. «&» — специальный символ объявления типа. Объявить переменную этого типа можно следующими способами:

Dim MyLongVar&
Dim MyLongVar as Long

Для неявного объявления можно воспользоваться инструкцией DefLng . Например:

DefLng l 'переменные начинающиеся с l будут по умолчанию иметь тип Long

Для переменной типа Long Integer требуется четыре байта памяти.

Числа с дробной частью

Все переменные этого типа могут принимать положительные или отрицательные значения чисел с дробной частью. Начальным значением для них является 0 (ноль). Как говорилось выше, если число с дробной частью присвоено переменной способной содержать только целые числа, то LibreOffice Basic округляет число по правилам классической арифметики.

Тип Single

Переменные типа Single могут принимать положительные или отрицательные значения в диапазоне от 3.402823x10E+38 до 1.401293x10E-38. Значения переменных этого типа — это числа с плавающей точкой одинарной точности и могут иметь 7 знаков после запятой. Если объяснять на пальцах, в этом формате хранятся только 8 знаков числа (мантисса числа), а остальная часть храниться виде степени десяти (порядок числа). В отладчике Basic IDE можно видеть только 6 знаков после запятой, но это наглая ложь. Вычисления с переменными типа Single занимают больше времени, чем для переменных типа Integer, но выполняются быстрее, чем вычисления с переменными типа Double. Специальным символом объявления типа является «!«. Объявить переменную этого типа можно следующими способами:

Dim MySingleVar!
Dim MySingleVar as Single

Для неявного объявления можно воспользоваться инструкцией DefSng . Например:

DefSng f 'переменные начинающиеся с f по умолчанию имеют тип  Single

Для переменной типа Single требуется 4 байта памяти.

Тип Double

Переменные типа Double могут принимать положительные или отрицательные значения в диапазоне от 1.79769313486231598x10E308 до 1.0x10E-307. Почему такой странный диапазон? Скорее всего в интерпретаторе есть дополнительные проверки, которые приводят к такой странной ситуации. Значения переменных типа Double — это числа с плавающей точкой двойной точности и могут иметь 15 знаков после запятой. В отладчике Basic IDE можно видеть только 14 знаков после запятой, но это тоже наглая ложь. Переменные типа Double пригодны для точных вычислений. Вычисления требуют больше времени, чем вычисления для типа Single. Специальным символом объявления типа является «#«. Объявить переменную этого типа можно следующими способами:

Dim MyDoubleVar#
Dim MyDoubleVar As Double

Для неявного объявления можно воспользоваться инструкцией DefDbl . Например:

DefDbl d 'переменные начинающиеся с d по умолчанию имеют тип  Double

Для переменной типа Double требуется 8 байта памяти.

Тип Currency

Переменные типа Currency отображаются как числа с фиксированной точкой и имеют 15 знаков в целой части и 4 знака в дробной. Диапазон значений включает числа от -922337203685477.6874 до +922337203685477.6874. Переменные типа Currency предназначены для точных расчетов денежных значений. Специальным символом описания типа является «@«. Объявить переменную этого типа можно следующими способами:

Dim MyCurrencyVar@
Dim MyCurrencyVar As Currency

Для неявного объявления можно воспользоваться инструкцией DefCur . Например:

DefCur c 'переменные начинающиеся с c по умолчанию имеют тип Currency

Для переменной типа Currency требуется 8 байт памяти.

Строковые переменные — тип String

Переменные типа String могут содержать строки , в которых каждый не более 65535 символов. Каждый символ хранится как соответствующее значение Юникод. Они используются для работы с текстовой информацией и, кроме печатных знаков (символов), могут также содержать непечатаемые знаки. О максимальном размере строки я не знаю. Mike Kaganski экспериментальным образом установил значение в 2147483638 символа, после чего LibreOffice падает. Это соответствует почти 4 Гигабайтам символов.Специальным символом описания типа является «$«. Объявить переменную этого типа можно следующими способами:

DimMyStringVar$
Dim MyStringVar As String

Для неявного объявления можно воспользоваться инструкцией DefStr . Например:

DefStr s 'переменные начинающиеся с s по умолчанию имеют тип String

Начальное значение этих переменных пустая строка («»). Память, требуемая для хранения строковых переменных, зависит от числа символов в переменной.

Даты и время — типа Date

Переменные типа Date могут содержать только значения даты и времени, сохраненные во внутреннем формате. Этот внутренний формат является по факту числом с плавающей точкой двойной точности Double, где целая часть это количество дней, а дробная часть дня (то есть, 0.00001157407 — это одна секунда). При этом значение 0 равно 30.12.1899. Но интерпретатор Basic автоматически конвертирует его в читабельный вариант при выводе, но не при вводе. Для правильного и быстрого преобразования во внутренний формат типа Date можно использовать функции Dateserial, Datevalue, Timeserial или Timevalue. Извлечь какую-нибудь определённую часть из переменной в формате Date можно с помощью функции Day, Month, Year или Hour, Minute, Second. Внутренний формат позволяет сравнивать значения даты и времени путем расчета разности двух чисел. Для типа Date нет специального символа для определения, поэтому при явном определении нужно использовать ключевое слово Date.

Dim MyDateVar As Date

Для неявного объявления можно воспользоваться инструкцией DefDate . Например:

DefDate y 'переменные начинающиеся с y по умолчанию имеют тип Date

Для переменной типа Date требуется 8 байта памяти.

Тип переменных Object

Условно к объектам в LibreOffice Basic можно отнести два типа переменных.

Объекты

Переменные типа Object являются переменными хранящими объекты. Если не вдаваться в подробности, то объектом считается любая обособленная часть программы имеющая структуру, свойства и методы доступа и обработки данных. Например, документ, ячейка, параграф, диалоговые окна — это объекты. Они имеют имя, размер, свойства, и методы их задания. В свою очередь, эти объекты состоят тоже из объектов, которые в свою очередь тоже могут состоять из объектов. Такая пирамида объектов часто называется объектной моделью, и она позволяет, разрабатывая маленькие объекты, объединять их в большие. В свою очередь, через больший объект, мы имеем доступ к более мелким. И это позволяет нам оперировать нашими документами, заниматься созданием и обработкой их, при этом абстрагировавшись от конкретного документа. Для типа Object нет специального символа для определения, поэтому при явном определении нужно использовать ключевое слово Object.

Dim MyObjectVar As Object

Для неявного объявления можно воспользоваться инструкцией DefObj . Например:

DefObj o 'переменные начинающиеся с o по умолчанию имеют тип Object

Переменная типа Object не хранит в себе сам объект, а является только ссылкой на него. Начальное значение для этого типа переменных Null.

Структуры

Структура по сути тоже объект. И если вы будете смотреть в отладчике Basic IDE, то у большинства из них вы увидите тип Object. Не у всех. У некоторых, например, как у структуры Error будет тип Error, а не Object. Но грубо говоря структуры в LibreOffice Basic это просто сгруппированные в один объект переменные, без специальных методов доступа. Ещё одним существенным отличием является то, что при объявлении переменной типа «структура» мы должны указывать её имя, а не служебное слово Object. Например, если MyNewStructure это имя структуры, то объявление её переменной будет выглядеть как:

Dim MyStructureVar As MyNewStructure

Существует довольно большое количество встроенных структур. Но пользователь может создавать и свои личные. Структуры могут быть удобны в тех случаях когда нам нужно оперировать наборами разнородной информации, которые должны рассматриваться как единое целое. Например, имя, фамилия и отчество человека. В этом случае мы могли бы, например, создать структуру tPerson.

Type tPerson
  Name As String
  Age As Integer
  Weight As Double
End Type

Определение структуры должно идти до подпрограмм и функций её использующих.

Чтобы заполнить структуру можно воспользоваться следующим способом. Для примера, встроенная структура com.sun.star.beans.PropertyValue:

Dim oProp As New
 com.sun.star.beans.PropertyValue
 oProp.Name  = "Age"  'Устанавливаем свойство Name'
 oProp.Value = "Amy Boyer" 'Устанавливаем свойство Property'

Для более простого заполнения структуры, можно использовать оператор With.

Dim oProp As New com.sun.star.beans.PropertyValue
 With oProp
   .Name  = "Age"       'Устанавливаем свойство Name'
   .Value = "Amy Boyer" 'Устанавливаем свойство Property'
 End With

Начальное значение есть только для каждой переменной в структуре и соответствует типу переменной.

Тип переменных Variant

Это виртуальный тип переменных. Тип переменной автоматически подбирается под данные, которыми нужно оперировать. Проблема лишь в том, что для интерпретатора не стоит цели экономить наши ресурсы, и он предлагает не самые оптимальные варианты типов переменных. Например, он не знает что единицу можно записать в Byte, а 100000 в Long Integer, хотя воспроизводит тип, если значение передается из другой переменной с объявленным типом. И кроме того, само преобразование довольно ресурсозатратное. Поэтому этот тип переменных самый медленный из всех. Если необходимо объявить этот вид переменных, можно воспользоваться ключевым словом Variant. Но можно опустить описание типа вовсе, типа Variant будет присвоен автоматически. Специального знака для этого типа нет.

Dim MyVariantVar
Dim MyVariantVar As Variant

Для неявного объявления можно воспользоваться инструкцией DefVar . Например:

DefVar v 'переменные начинающиеся с v по умолчанию имеют тип Variant

Этот тип переменных присваивается по умолчанию всем не объявленным переменным.

Массивы

Массивы — это особый тип переменных в виде набора данных больше напоминающий математическую матрицу, за исключением того, что данные могут быть различного типа, и позволяющие обращаться к своим элементам по индексу (номеру элемента). Конечно, одномерный массив будет подобен столбцу или стрке, а двухмерный таблице. Есть одна особенность массивов в LibreOffice Basic, отличающая его от других языков программирования. Так как у нас есть абстрактный тип Variant, то элементы массива, не обязаны быть однородными. То есть, если у нас есть массив Array с тремя элементами под номерами от 0 до 2, и мы в первый элемент Array(0) записываем имя, во второй Array(1) возраст, а в третий Array(2) вес человека, то можем иметь соответственно значения типов для Array(0) String, для Array(1) Integer, а для Array(2) Double. В этом случае массив будет напоминать структуру с возможностью доступа к элементу по его индексу. Элементы массива также могут быть однородными, другими массивами, объектами, структурами, строками, или любым другим типом данных используемым в языке LibreOffice Basic.

Массивы обязательно должны быть объявлены. Хотя пространство индексов может быть в диапазоне типа Integer, то есть от -32768 до 32767, по умолчанию начальный индекс выбирается как 0. Объявить массив можно несколькими способами:

Dim MyArrayVar(5) as String         'Массив строк с 6 элементами от 0 до 5'
Dim MyArrayVar$(5)                  'тоже самое что и предыдущий вариант'
Dim MyArrayVar(1 To 5) As String    'Массив строк с 5 элементами от 1 до 5'
Dim MyArrayVar(5,5) As String       'двухмерный массив строк с 36 элементами'
                                    'с индексами в каждом уровне от 0 до 5'
Dim MyArrayVar$(-4 To 5, -4 To 5)   'двухмерный массив строк со 100'
                                    'элементами с индексами в каждом уровне'
                                    'от -4 до 5'
Dim MyArrayVar()                    'пустой массив типа Variant'

Изменить нижнюю границу (индекс первого элемента массива) по умолчанию можно при помощи ключевых слов Option Base, которые должны быть указаны до использования подпрограмм, функций и определения пользовательский структур. Option Base может принимать только два значения 0 или 1, которые должны следовать сразу после ключевых слов. Действие распространяется только на текущий модуль.

Дополнительная литература и источники:

  • Уроки LibreOffice
  • Русскоязычный раздел онлайн-справки по LibreOffice Basic
  • Русскоязычная страница про макросы в Wiki TDF
  • Сайт Эндрю Питоньяка
  • Массив (программирование) — Статья из Wikipedia
  • Отчет об ошибке в багзиле TDF, связанный с отображением чисел с плавающей точкой
  • Статья в формате ODT
  • Статья в формате PDF

Любимая мозоль

Автор Серж, 5 июня 2013, 09:55

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

Друзья! Кто-нибудь встречался с ошибкой «Синтаксическая ошибка BASIC. Неожиданный символ: CRLF»?

Раньше мне приходилось часто ее видеть. Возникает после копирования кода из pdf или doc. Устраняется перенабором части кода и то не всегда.
Как я понимаю, связана с присутствием в коде какого-то непечатного символа.

Недавно опять встретил. Может кто сможет объяснить суть оного в более аргументированном виде.


Это одна строка разбита на две строки


+1
Это случается, когда длинные строки кода в угоду форматированию переносится со строки на строку. В редактор они так и вставляются — разными строками.
Нужно или символ подчеркивания добавить в конце первой строки, в качестве указания, что оператор еще не закончился, или просто разрыв строк удалить.
Кстати, это не единственная ошибка в этой серии. Если разрыв прошел по параметрам метода, можно нарваться и на сообщение вида «Синтаксическая ошибка BASIC. Неожиданный символ: ,.»


Да, действительно, возникает именно в местах, где текстовый редактор разделил одну строчку кода на две строки текста. Спасибо.


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

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

  • Basic

  • Любимая мозоль

Понравилась статья? Поделить с друзьями:
  • Синонимы и омонимы логическая ошибка подмена понятия
  • Синтаксическая ошибка basic метка arg1 уже определена
  • Синонимы к слову исправить ошибку
  • Синтаксическая ошибка asm
  • Синонимы к слову грубая ошибка