Страницы: 1
RSS
Обнуление разных переменных, vba
 
Здравствуйте!
подскажите, где почитать про обнуление переменных?
что-то типа таблички
Код
Erase a 'массив
Set a = Nothing 'object, range
a = VbNullString '$
a = "" '$
a = Empty '&
a = 0 '&

какие из них универсальные? например из этого списка "a = Empty" работает и для & и для $
Изменено: KUDRIN - 07.04.2015 19:31:23
 
Про Erase и Nothing - в Справке.
VbNullString и "" это разные вещи, в Справке тоже упоминается.
Empty это константа типа Variant, поэтому при присвоении преобразуется в 0, пустую строку, False.
 
Цитата
Казанский написал: Про Erase и Nothing - в Справке.
Имеется ввиду не про каждую команду в отдельности (название которой еще поискать нужно),
а в комплексе про все команды обнуления.
Или может быть есть табличка, в которой указаны все команды обнуления со ссылкой в справку для каждой конкретной команды из этой таблички.

Примерно как в этой статье про объявление переменных
Изменено: KUDRIN - 07.04.2015 19:31:41
 
Добрый вечер
Может посмотреть на значения неинициализированных переменных?
 
А зачем, собственно, обнуление потребовалось? Я понимаю некоторые объекты и массивы. Но остальные-то переменные.После выполнения процедуры объявленные внутри неё переменные сами обнуляются и память не засоряют. Следовательно очистка как таковая ничего не даст...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Alexander88, Нашел только для C -  https://msdn.microsoft.com/ru-ru/library/83fhsxwc.aspx, есть ссылка для Excel ?
The_Prist, Это уже вопрос другой. Была похожая тема, из четырех ответов - подходящим оказался только один. Так и здесь - зачем и почему, можно пообсуждать, но когда вообще нет такой таблички, то неудобно. Банально переменная используется в цикле и приходится либо присваивать значение и обнулять через if else или обнулять через подобные команды, список которых я и ищу.
или например объект забивает память до 100%, если обрабатывается в цикле без обнуления
Изменено: KUDRIN - 07.04.2015 19:34:25
 
Тут как бы понимаете...Вопрос зачем не совсем от лени задан. Если для очистки памяти - то это лишнее. Если для дальнейшего использования - значит алгоритмы хромают. Ведь Вы сами назначаете значения переменным и вольны делать проверки их значения.
Но раз так надо, то по простому:
Integer,Long,Byte,Double,Decimal(уже не используется),Currency,Syngle,Date = по умолчанию имеют значение 0. Его и надо присваивать.
String - =""
Array - Erase Arr
Object - Set obj = Nothing

Variant в зависимости от назначенного типа. Но можно просто =0.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
По поводу Object... Где-то когда-то мелькало, что переменные объектов чистить обязательно, иначе остаются в памяти.
Завршаем процедуру - чистим.
Правда? Неправда?
 
Буратине дали три яблока. Два он съел. Сколько яблок осталось у Буратины? Думаете одно? Ничего подобного. Никто же не знает сколько у него уже было яблок до этого. Мораль - обнуляйте переменные!!!

The_Prist, Спасибо за комментарий по разным типам переменных

Цитата
Правда? Неправда?
Однозначно да или нет не могу сказать, но это как минимум зависит конкретно от самого объекта и от количества циклов, прецеденты уже были. если проблем в конкретном примере нет, то наверное и не обязательно
Изменено: KUDRIN - 07.04.2015 19:55:22
 
Вить, на самом деле не совсем правда. VB вычищает память после завершения процедуры. Правда, не всегда корректно может это сделать именно для объектов. В последних версиях VBA не наблюдал такого.
Проблемы могут возникнуть при очистке переменных уровня проекта - с ними у VBA бывают проблемы при закрытии проекта, в котором они были инициализированы. При этом это могло повлечь остаток в памяти ссылки на уже не существующий объект, с которым она все еще была связана(можно наблюдать это при попытке переместить файл и запрет ОС на это - спасает разблокировка процесса путем закрытия Excel).

Для своей уверенности лучше очищать. В больших проектах так делаю. А вообще в последнее время обленился с этим делом в VBA - редко это делаю. Но и проблем от этого не наблюдал. Вот в C это дело не прощается - лучше вычистить все :-)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Понял, спасибо.
Резюме: публичные лучше очищать.
 
Цитата
KUDRIN написал: есть ссылка для Excel ?
Можно посмотреть в окне Locals при обьявлении
Всегда интересно было, как очистить в такой конструкции? :)
Код
With CreateObject("VBScript.RegExp")
    '
    '
End With
Изменено: Alexander88 - 07.04.2015 20:11:12
 
Никак. Объект сразу после End With уничтожается.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, Спасибо
Страницы: 1
Наверх