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

Автор ost, 5 апреля 2022, 17:51

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

Доброго. Как (где?) присвоить переменной текстовое значение таким образом, чтобы все процедуры модуля имели возможность читать значение этой переменной?
Делаю как на картинке, получаю ошибку «Синтаксическая ошибка Basic. Ожидается: Sub.»

Спасибо. Сори за сумбур.


Оператор присвоения должен быть внутри процедуры или функции.

Переменная уровня модуля объявляется оператором Dim. Public переменные видны всем модулям библиотеки.


Цитата: ost от  5 апреля 2022, 17:51Как (где?) присвоить переменной текстовое значение таким образом, чтобы все процедуры модуля имели возможность читать значение этой переменной?

Объявить константу в начале модуля:

Const sDbName = "JRIDm64_test"




Так у Вас переменная или константа?
Если константа, то объявляете (пишу по памяти):
Const (как в примерe @Rami) — видна в данном модуле
Public Const — видна всем модулям библиотеки
Global Const — видна всем модулям всех открытых библиотек.

Если переменная, то Вам решать, какой макрос и когда будет ей присваивать значение. Макрос Init в Вашем примере это присвоение производит.



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

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

  • Basic

  • [РЕШЕНО] LibreOffice Basic Как объявить переменную уровня модуля

  • Печать

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

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

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

Я уже очень давно обещал начать писать о скриптовом языке программирования 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

Konstantin_F

0 / 0 / 0

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

Сообщений: 29

1

20.03.2018, 11:37. Показов 10175. Ответов 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



6647 / 4746 / 1980

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

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

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,720

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



6647 / 4746 / 1980

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

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

20.03.2018, 16:32

6

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



1



0 / 0 / 0

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

Сообщений: 29

21.03.2018, 11:03

 [ТС]

7

Да. Я исправил. Всё работает.
Немного не так как хотелось бы.

Получается столбец нулей и в следующем столбце значения первого столбца с пустыми ячейками.

Нужно брать в первом столбце первое значение и ставить ему в соответствие все значения из второго столбца.
Далее берем второе значение из первого столбца и т.д.

Что надо подправить в формуле?



0



6647 / 4746 / 1980

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

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

21.03.2018, 11:12

8

будет лучше, если все-таки приложите файл с введенными значениями и образцом того, что вы хотите получить

вышеприведенный код — лишь образец того, как работать с ячейками в libreoffice. исходных данных-то у меня нет.



1



0 / 0 / 0

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

Сообщений: 29

21.03.2018, 12:07

 [ТС]

9

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



0



Krasme

6647 / 4746 / 1980

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

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

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



6647 / 4746 / 1980

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

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

21.03.2018, 13:01

12



1



0 / 0 / 0

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

Сообщений: 29

21.03.2018, 17:34

 [ТС]

13

Спасибо!

Вы мне помогли!



0



Версия: 5.3.1.2
ID сборки: e80a0e0fd1875e1696614d24c32df0f95f03deb2
Потоков ЦП: 4; Версия ОС: Windows 6.1; Отрисовка ИП: по умолчанию; Способ разметки: новый;
Локаль: ru-RU (ru_RU); Calc: group

Обновил офис. Теперь ничего не работает: принажатии на кнопки выскакивает окно ошибки бейсика
Например, кнопка расстановка ударений — «Синтаксическая ошибка BASIC.
Expected: ).»
В функции AutoCode:
‘ сохраняем списки
With oACDlg.Model
Dim aArrayPS() As String : aArrayPS = .ParaStyleFindListBox.StringItemList
SaveArray( aArrayPS(), getOOoFBToolsSettingsDir() & sConstWorkParaStyle
Dim aArrayPF() As String : aArrayPF = .ParaFontFindListBox.StringItemList
SaveArray( aArrayPF(), getOOoFBToolsSettingsDir() & sConstWorkParaFont
Dim aArrayCS() As String : aArrayCS = .CharStyleFindListBox.StringItemList
SaveArray( aArrayCS(), getOOoFBToolsSettingsDir() & sConstWorkCharStyle
Dim aArrayCF() As String : aArrayCF = .CharFontFindListBox.StringItemList
SaveArray( aArrayCF(), getOOoFBToolsSettingsDir() & sConstWorkCharFont
End With

На вид и правда скобочек не хватает. И так почти на многих кнопках.

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