Страницы: 1
RSS
Переменные VBA
 
Здравствуйте Всем!
Обьясните пожалуйста, желательно на пальцах, по какому принципу выбирать и объявлять переменные и их количество. Варианты переменных я изучал, но как выбирать до конца не понимаю. Считать по битам или байтам- тёмный лес. Вот если не трудно, то в каком случае выбирать string, а в каком Boolean, а в каком variant.
Спасибо  
Умные люди — это те, которые работают с людьми умнее их самих. (С)Р.Кийосаки
 
В зависимости от данных, для которых предназначены переменные.
Текстовые - Sring, логические - Boolean. Всяческие счетчики,  количества (не дробные),  номера строк - Byte, Integer или Long. Эти типы переменных предназначены для хранения целых чисел в зависимости от разрядности (Byte - от 0 до 255, другие и +, и -).  Для дробных данных Single, Double... и т.д.
Если переменная для объекта (диапазон, лист, книга), можно Object, но правильнее указывать тип  - Range, Worksheet... Variant можно не указывать - по умолчанию так и есть. Под Variant выделяется область памяти с запасом, по максимуму, т.к. программа не знает. что Вы собрались помещать в переменную.
Да все это описано-переописано...

Количество - в зависимости от решаемой задачи и применяемых алгоритмов. Чем меньше, тем меньше памяти откушено. Но, опять же - не загрузится ли та же память вычислениями, которых можно было бы избежать, применяя переменные?
Одни и те же переменные можно (и советую) применять по несколько раз, если это позволяет код. Только не забывать их очищать перед новым применением (очистка не нужна, если при следующем применении переменной сразу присваивается значение). Например, циклам, расположенным последовательно, можно отдать один и тот же счетчик, пусть пользуются, ущерба никакого нет.. Но и тут нужно с умом подходить - можно такого понаписывать, что впоследствии не разобраться, а что же там данный момент хранится.
 
Могу только добавить следующее. Сейчас программисты в более крупных и запутанных программах, объявляют все переменные с типом Variant. Так код легче поддаётся изменению. Если у вас макрос небольшой, то можете и не объявлять переменные. Но иногда бывают случаи, что их просто необходимо объявить, так как программа может определить её неправильно. Сам лично встречал такие ситуации.
А вообще можете по данным ориентироваться по этой таблице.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Спасибо "курильщики"!
Буду пытаться, разбираться...
Умные люди — это те, которые работают с людьми умнее их самих. (С)Р.Кийосаки
 
Цитата
Alemox написал:
Сейчас программисты в более крупных и запутанных программах, объявляют все переменные с типом Variant
Потому и запутанные, так как всё - Variant.
А вообще - лучше объявить переменную, а ещё лучше - ещё и тип указать. Поверьте, столько было ошибок из-за того, что использовали Variant, а не конкретный тип.
There is no knowledge that is not power
 
Цитата
Alemox написал:
Если у вас макрос небольшой, то можете и не объявлять переменные.
Плохой совет )
 
Если хотите работать профессионально в VBA, то нужно приучать себя объявлять все переменные. Для дисциплинирования можно нажать на птичку в настройках, где указывается, что в самом верху модуля всегда будет указываться option explicit.

Примитивы объявлять большого смысла нет, можно все оставлять variant и не сильно заморачиваться (хотя лучше объявлять - правило хорошего тона), с массивами ситуация несколько другая: объявляйте по возможности (особенно, если массив достаточно большой). А вот объекты всегда объявляем согласно используемому типу: либо object/пусто (например, dim obj/dim obj as object), если используем late binding, либо по типу (dim rng as range/dim cln as collection/dim appOutlook as Outlook.Application), если используем early binding.

В использовании Early binding, есть большое преимущество в виде intellisense (автопоказ свойств/методов/пр.) после вставки точки (например rng.)

И еще одно замечание. Старайтесь объявлять ВСЕ переменные/константы. При необходимости вводите enum/создавайте новые классы.
Например намного приятнее разбираться в коде, когда написано:
Код
arr(enProduct1) = ...
arr(enOrder2) = ...

чем
Код
arr(75)= ...
arr(23) = ...

Кроме того, если в будущем константа поменяется, вы это будете менять только в заголовке, а не судорожно в нескольких местах. Так вы никогда не пропустите не совсем нужную ошибку даже в не самых критических местах программы.
С уважением,
Федор/Все_просто
 
Ronin71, Alemox дал отличную ссылку, но посоветовал прямо противоположное)))
не скажу, как там "много программистов" делает, но лично я на себе не раз испытал "пинки" от необъявленных или объявленных неправильно переменных, поэтому мой совет — Option Explicit по умолчанию в каждом модуле и отладка кода после написания через Debug —> Compile [Name of VBA Project] (за совет по компилятору спасибо ZVI  :idea: )
Изменено: Jack Famous - 20.02.2018 13:16:54
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Ну коли на то пошло, то выложу информацию ещё по одному типу описания переменных, который тянется с далёкого 1965 года, после первой версии Basic.
Мало кто знает, что так можно описывать переменные.

Например, все переменные с именами, начинающимися с букв из диапазона от А до Q,
имеют строковый тип:
Объявляется в начале модуля перед процедурой
DefStr A-Q

Код
DefStr A-Q

Sub Пример()
A = 1
B = "Строка"
C = 123456
End Sub


Вот основные команды объявления таким образом переменных.
DefBool - Тип данных Boolean
DefByte - Тип данных Byte
Deflnt - Тип данных Integer
DefLng - Тип данных Long
DefCur - Тип данных Currency
DefSng - Тип данных Single
DefDbl - Тип данных Double
DefDate - Тип данных Date
DefStr - Тип данных String
DefObj - Тип данных Оbject
DefVar - Тип данных Variant
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox, так по вашей же ссылке всё это есть) крутая вещь, но я пока "ручками" каждую всё-таки задаю  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, Да я увидел тоже потом уже. Просто у меня свои источники для переменных, поэтому дал статью, в которой хорошо описано не вникая в глубину текста и не заметил, что там это тоже имеется. Ну ладно. Повторение мать учения.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Доброго времени суток!
Я чайник в VBA, только  делаю первые шаги...Подскажите, как решить следующую проблемку. Создан скрипт, который циклически сравнивает два массива данных.
В нем, как переменная, обьявляется массив:
Dim My_Data (1 to 20) As Variant
'где 20 - длина массива, впрочем для людей сведующих понятно и без комментов.
Теперь формулирую  вопрос: С учетом того, что длина массива ( в нашем случае 20), возможно будет меняться, хотелось бы реализовать скрипт в таком виде:
Dim My_Data (1 to a) As Variant
a = InputBox ("Введите максимальное значение длины предыдущего массива")
Но это не работает, при компилляции сразу вылетает ошибка и подсвечивается переменная "а" в этой строке
Dim My_Data (1 to a) As Variant
то есть скрипт сразу же требует конкретное число, а вводить его каждый раз, забираясь в тело скрипта, считаю тупо и непрофессионально.
Как решить данную проблему?
Заранее благодарю за помощь.
 
А если СНАЧАЛА задать переменной значение, а уже ПОТОМ объявлять массив? И не забывайте, что InputBox выдаст Вам текст. Или преобразуйте его в число, или используйте Application.InputBox с соответствующим параметром.
 
Юрий М
Спасибо! Признаться, не додумался  присваивать значение до обьявления... НО почему Вы думаете что, InputBox выдаст текст, если я введу цифирьку?
Изменено: FreddyLumix - 04.04.2018 21:51:20
 
Виталий, а может это на форум, а?))) Тут, в курилке более общие вопросы и лайфхаки обсуждаются  :D

По вопросу: первое, что приходит в голову - то, что предложил Юрий М.
А дальше смотрите в сторону ReDim и ReDim Preserve, но у них есть ограничения по "раздуванию" массива. Опять же - лучше на форум с конкретным вопросом (что нужно сделать/для чего) — возможно получится всё решить более "деликатно"  ;)
Изменено: Jack Famous - 04.04.2018 21:59:13
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
"...или используйте Application.InputBox с соответствующим параметром."
А вот этого, если честно, не понял. Знаний еще маловато....
 
Цитата
Виталий Тетерук написал:
почему Вы думаете что, InputBox выдаст текст, если я введу цифирьку…Знаний еще маловато
тем более на форум  8)
А перед этим советую почитать про диалоги и их особенности  ;)
Как минимум, InputBox и Application.InputBox — разные вещи. К тому же, там есть другие параметры, кроме названия (например тип получаемых данных — как раз то, о чём Юрий говорит)… В общем, читайте и создавайте тему на форуме.
Изменено: Jack Famous - 04.04.2018 22:13:25
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Спасибо откликнувшимся за помощь и понимание!
Иду читать про диалоги!..)))
 
Цитата
Виталий Тетерук написал:
почему Вы думаете что, InputBox выдаст текст, если я введу цифирьку?
Я не думаю - я знаю. А, если Вы сомневаетесь,- проверьте )
Про Application.InputBox - почитайте справку. Ну не дело здесь мне её пересказывать.
 
Ещё про InputBox: возможно, выручит неявное преобразование  текста в число, но лучше не рисковать )
Страницы: 1
Наверх