Можно ли обойтись без Option Explicit

Автор OOKapitan, 8 февраля 2018, 17:27

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

OOKapitan

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

kompilainenn

у вас что все макросы в одном модуле в одной либе?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

OOKapitan

Цитата: kompilainenn от  8 февраля 2018, 15:36у вас что все макросы в одном модуле в одной либе?
Не все, но многие. Просто у меня ряд макросов, вызываемых друг из друга.

OOKapitan

Так всё-таки насколько критично закомментирование Option Explicit?

kompilainenn

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

rami

Цитата: OOKapitan от  8 февраля 2018, 17:48
Так всё-таки насколько критично закомментирование Option Explicit?
kompilainenn не стал вас пугать, 150 глаз может не хватить, но 100500 наверно хватит ;D

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

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

JohnSUN

Ну да, упрёк заслуженный - макрос, на который ты ссылаешься и который перестал работать с 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

Разделяю мнение что в больших макросах (тысячи строк) - 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...

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