Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VBA_lektsii.doc
Скачиваний:
8
Добавлен:
01.04.2025
Размер:
3.91 Mб
Скачать

2.7. Неявное описание переменных и тип Variant

В VBA есть одна интересная возможность, которой с удовольствием пользуются ленивые разработчики, но отвергают программисты, привыкшие работать организованно. Это неявное описание переменных. Вы, вероятно, обратили внимание, что все переменные, использованные в примерах программ, описаны в инструкциях Dim. В действительности делать это не обязательно. Если VBA не находит описания переменной, он определяет ее самостоятельно. Рассмотрим следующий пример:

Sub С_ОбъявлениемПеременной()

Dim String1 As String

String1 = "Привет!"

MsgBox String1

End Sub

Если вы удалите из этой программы вторую строку, результат ее действия не изменится:

Sub БезОбъявленияПеременной()

String1 = "Привет!"

MsgBox String1

End Sub

Если инструкция Dim для переменной отсутствует, ей присваивается тип по умолчанию, в данном случае Variant. Именно он использован в программе БезОбъявленияПеременной для переменной Stringl. Поскольку переменные этого типа могут содержать любые данные, никаких проблем при выполнении программы не возникает. В следующем примере тип Variant присвоен переменной Stringl явно.

«Плюсы» и «минусы» типа Variant

Когда значение присваивается переменной типа Variant, VBA определяет его тип и соответствующим образом изменяет переменную. Тип Variant по умолчанию присваивается всем переменным, которые не описаны инструкцией Dim. Если вы хотите для неописанных переменных задать другой тип, используйте инструкцию DefType, о которой будет рассказано немного позже. Применение типа данных по умолчанию для всех переменных, конечно, сокращает код. Некоторые разработчики весьма высоко оценили этот способ, позволяющий использовать новые переменные в любом месте программы, не заботясь об их описании.

Тем не менее, у неявного описания переменных есть три недостатка, о которых, вероятно, знают программисты, заботящиеся о структуре и организации приложений.

Во-первых, на значения типа Variant расходуется больше памяти. Одна такая переменная занимает 16 байт (плюс по 1 байту на символ, если в ней содержится строка), а это почти в два раза больше, чем для других «объемных» типов – Currency, Date и Double. Коротким программам требуется, как правило, незначительный объем памяти, но в больших приложениях со множеством переменных вы, безусловно, столкнетесь с проблемой производительности, а может быть, и исчер­паете всю доступную память системы.

Второй недостаток также связан с производительностью. Когда переменной типа Variant присваивается значение, VBA перестраивает ее соответственно новому типу, на что уходит определенное время. Особенно существенны потери при этом в циклах, так как переменные перестраиваются по несколько раз.

Третий недостаток состоит в том, что трудно отслеживать данные в переменных типа Variant. Вы никогда не сможете точно сказать, что хранится в такой переменной, поскольку в ней может быть все, что угодно. Это сильно затрудняет отладку программы и поиск ошибок в ней. Все упростится, если все ваши переменные всегда содержат данные только определенного типа.

Рассмотрим в качестве примера код для математических вычислений с переменной. Допустим, что при вызове подпрограммы в нее передается переменная Integer. В этом случае вам не надо проверять, будет ли для расчетов действительно использовано численное значение. Если же вы передаете в подпрограмму переменную Variant, вам придется проверять это каждый раз. Не исключено, что по ошибке в подпрограмму будет передана дата, строка или даже ссылка на объект, выяснение займет еще некоторое время и приведет к дальнейшему снижению производительности.

Однако все перечисленные недостатки не означают, что от типа Variant нужно полностью отказаться. Он очень полезен, когда вы не знаете заранее тип значения, сохраняемого в переменной. Допустим, ваше приложение выдает на экран приглашение на ввод целого числа. Но пользователь может ввести действительное число или даже строку – все имеют право на ошибку! Поэтому ваша подпрограмма должна воспринимать данные любого типа. Поместите введенное значение в переменную Variant, а затем скопируйте в переменную нужного типа для дальнейшего использования.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]