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

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

20 Август 2018, 18:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Можно ли обойтись без Option Explicit  (Прочитано 509 раз)
0 Пользователей и 1 Гость смотрят эту тему.
OOKapitan
Старожил
****
Offline Offline

Сообщений: 320


« Стартовое сообщение: 8 Февраль 2018, 17:27 »

      Здравствуйте, снова.
      Недавно в теме http://forumooo.ru/index.php/topic,6940.0/msg,44972.html мне предложили отличнейший макрос для MsgBox с таймером. Начинается он с Option Explicit. Но при этом Option Explicit перестали работать другие мои макросы, в частности взятый отсюда. Я закомментировал Option Explicit, и все макросы снова заработали, в том числе и макрос для MsgBox с таймером. Но насколько критично это закомментирование Option Explicit? Почитал о нём в интернете, но всё-равно мне не очень понятно, будут ли какие-то проблемы у меня с макросами или ничего страшного. Помогите, пожалуйста.
Записан
kompilainenn
Ветеран
*****
Offline Offline

Сообщений: 2 410



« Ответ #1: 8 Февраль 2018, 17:36 »

у вас что все макросы в одном модуле в одной либе?
Записан

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут
OOKapitan
Старожил
****
Offline Offline

Сообщений: 320


« Ответ #2: 8 Февраль 2018, 17:48 »

у вас что все макросы в одном модуле в одной либе?
Не все, но многие. Просто у меня ряд макросов, вызываемых друг из друга.
Записан
OOKapitan
Старожил
****
Offline Offline

Сообщений: 320


« Ответ #3: 8 Февраль 2018, 17:48 »

Так всё-таки насколько критично закомментирование Option Explicit?
Записан
kompilainenn
Ветеран
*****
Offline Offline

Сообщений: 2 410



« Ответ #4: 8 Февраль 2018, 17:50 »

не критично, просто за переменными нужно будет следить в 150 глаз
Записан

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут
rami
Гуру
*******
Online Online

Пол: Мужской
Сообщений: 2 505


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #5: 8 Февраль 2018, 19:21 »

Так всё-таки насколько критично закомментирование Option Explicit?
kompilainenn не стал вас пугать, 150 глаз может не хватить, но 100500 наверно хватит Смеющийся

Option Explicit вынуждает явно объявлять переменные, это позволяет избегать ошибки:
1. ошибки в именах переменных: например, вместо объявленной nNum вы напишите по ошибке mNumOption Explicit будет ругаться, что переменная mNum не определена, а без Option Explicit эта ошибка может остаться не замеченной с кривым результатом

2. имя не объявленной переменной может случайно совпасть с именем макроса в другом модуле или даже в другой библиотеке и тогда "Остапа понесло" Шокирован вы будете с удивлением обнаруживать (сразу или хуже всего потом), что в документе что-то добавилось или отнялось и вообще была большая гулянка Смеющийся
Записан

JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Online Online

Пол: Мужской
Расположение: Киев
Сообщений: 2 530


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #6: 9 Февраль 2018, 09:21 »

Ну да, упрёк заслуженный - макрос, на который ты ссылаешься и который перестал работать с Option Explicit, действительно написан плохо.
В описании переменных есть Dim oSheet As Variant, а уже в коде используется oSpreadsheet - не хорошо.
Вот такой текст должен работать без ошибок (если опять что-нибудь не пропустил - 100496 глаз не хватает)
Код:
Sub qickFltrWithZero
Dim oSheet As Variant, i As Long
Dim oSelection As Variant, oActiveCell As Variant, oColumn As Variant
Dim oSearchDescr As Variant, oFound As Variant
oSelection = ThisComponent.getCurrentSelection()
oSheet = oSelection.getSpreadsheet()
oActiveCell = oSelection.getCellByPosition(0, 0)
oColumn = oSheet.getColumns().getByIndex(oActiveCell.getCellAddress().Column)
oSearchDescr = oColumn.createSearchDescriptor()
oSearchDescr.setSearchString("^0$")
oSearchDescr.SearchRegularExpression = True
oFound = oColumn.findAll(oSearchDescr)
If Not isNull(oFound) Then
For i = oFound.getCount()-1 To 0 Step -1
oFound.getByIndex(i).getRows().IsVisible = False
Next i
EndIf
oFound = oColumn.queryEmptyCells()
For i = oFound.getCount()-1 To 0 Step -1
oFound.getByIndex(i).getRows().IsVisible = False
Next i
End Sub
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
economist
Ветеран
*****
Offline Offline

Сообщений: 904


« Ответ #7: 9 Февраль 2018, 10:40 »

Разделяю мнение что в больших макросах (тысячи строк) - Option Explicit нужен, потому что время на поиск ошибок в какой-то момент станет заметным даже на фоне всего времени написания кода. А если код - копипаста в уже имеющийся - то досада может появиться даже раньше второго прогона макроса, если имена совпадают, а макрос что-то удаляет.  

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

Например для "временных переменных" типа числовых циклов For ... To ... - всегда использовать однобуквенные переменные n, m, для счетчиков - k (k=k+1).

Если используется в OpenOffice|LibreOffice VBA - ни в коем случае нельзя использовать "русскоподобные" буквы, похожие на латинские: A, a, C, с, E, e итп. Их желательно избегать даже в начале длинных имен переменных: уж лучше kounter, чем counter, потому что она может оказаться русской и это очень трудно отловить. Без Option Explicit - counter с первой русской будет сразу иметь значение Empty, а не "", 0 итд, и если он используется в сравнении - результат будет не то, что ожидали.
Русские имена переменных работают в LO.
Код:
Option VBASupport 1
Option Compatible
Option Explicit

Sub Main
Dim я
я=1
msgbox(я)
End Sub


Для значимых переменных - использовать надо "значимые", говорящие имена и использовать "верблюжий", горбатый стиль: summaOklada, endOfYear. Если начинать имя переменной всегда с маленькой буквы - никогда не попадешь на зарезервированное слово (команду), потому что она сама становится написанной с большой буквы (увы, только в VBA, а в StarBasic - не становится, и это порождает, имхо, половину ошибок). Ещё один плюс поведения как в VBA - можно печатать все команды (keywords) маленькими буквами, и если оно напечатано без ошибок - оно само загорбатится: print -> Print...

Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!