End Sub. Если инструкция Dim для переменной отсутствует, ей присваивается тип по умолчанию, в данном случае — Variant

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

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

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

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

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

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

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

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: